feature/openbao-adapter
main
结束本 PR 的长期迭代,保留阶段性代码与已确认设计,后续实现使用独立、小范围 PR。
代码仍使用早期 Bao 管理凭据路径,API types、连接装配和删除实现尚未对齐最新文档。此 PR 不是新领域模型或 Secret 连接方案的完成声明,不应据此部署为符合全部规格的版本。
后续先实现 Instance 纯领域模型及测试,再分小 PR 接入适配器和应用用例;不在本 PR 继续堆叠重构。Tenant 设计未在本轮展开。
既有代码本地 lint 曾通过;本批文档 git diff --check 通过。未在本轮运行完整测试或 E2E,CI 状态以具体提交检查为准。
Refs #1
@@ -62,6 +72,12 @@ func (r *PostgreSQLInstanceReconciler) Reconcile(ctx context.Context, req ctrl.R
setReconcilingCondition(&instance.Status.Conditions, instance.Generation, phaseResult.reconcilingMessage)
}
var reconcileErr error
这里我理解是基于状态决定状态机动作,那代码也应该扔进状态机而不是在这里
@@ -0,0 +76,4 @@
// New validates config and constructs an Initializer.
func New(config Config) (*Initializer, error) {
if config.OpenBaoAddress == "" || config.OpenBaoAuthRole == "" || config.OpenBaoAuthMount == "" ||
我们要不要用经典spf13的两件套? 不过已经搞了DI,viper的收益不大了
@@ -0,0 +139,4 @@
ctx, cancel := context.WithTimeout(ctx, i.config.Timeout)
defer cancel()
clientConfig := openbao.DefaultConfig()
可能我Spring用太多了总有一种这种Config应该配合Config来源动态注册进来的感觉 然后client本身的话也作为单例。。。但单例不一定是对的嗷
连接数据库本身为什么需要配置openbao?这个数据库凭据可能放在openbao,但是会有eso来同步secret,应用应当还是传统方式从env或配置文件来拿这个连接信息
@@ -0,0 +147,4 @@
if err != nil {
return nil, dependencyFailure("create OpenBao client")
auth, err := kubernetesauth.NewKubernetesAuth(
这地方还有初始化Kubernetes的部分,这些代码不该在这里吧
@@ -64,2 +68,4 @@
var externalSecretStoreName, postgreSQLCABundlePath string
var reconcileTimeout time.Duration
var tlsOpts []func(*tls.Config)
flag.StringVar(&metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+
是不是应该评估一下要不要引入SPF13两件套
@@ -90,0 +115,4 @@
PostgreSQLCABundlePath: postgreSQLCABundlePath, Timeout: reconcileTimeout,
})
setupLog.Error(err, "Invalid controller dependency configuration")
话说log库是?
@@ -181,3 +213,2 @@
if err := (&controller.PostgreSQLInstanceReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Initializer: instanceInitializer, Timeout: reconcileTimeout,
写一行这可读性有点差了
@@ -63,6 +63,9 @@ spec:
args:
- --leader-elect
- --health-probe-bind-address=:8081
- --openbao-address=https://openbao.openbao.svc:8200
死的配置文件?绑定环境了?环境信息应该在ci注入吧
@@ -37,0 +35,4 @@
| `--openbao-auth-mount` | `kubernetes` | Kubernetes auth mount 名称 |
| `--openbao-auth-role` | 必填 | controller ServiceAccount 对应 role |
| `--openbao-kv-mount` | `kv` | KV v2 mount;开发可显式用 `secret` |
| `--openbao-service-account-token-path` | `/var/run/secrets/kubernetes.io/serviceaccount/token` | Kubernetes auth 使用的投射 token 文件 |
这是?这东西需要一个参数吗?
@@ -75,0 +90,4 @@
return ctrl.Result{}, reconcileErr
func (r *PostgreSQLInstanceReconciler) reconcileDependencies(
同上这个函数应该也是状态机吧
@@ -0,0 +87,4 @@
if config.OpenBaoConsumerAddress == "" {
config.OpenBaoConsumerAddress = config.OpenBaoAddress
if err := validateAddress(config.OpenBaoConsumerAddress); err != nil {
所以你这到底是instance的初始化代码放在这里还是把整个控制器的初始化代码扔这里了?
@@ -0,0 +126,4 @@
return "", privilegeFailure("initialize PostgreSQL registry")
var version string
if err := pool.QueryRow(ctx, "SHOW server_version").Scan(&version); err != nil {
你看你重新实现了一遍上面的Validate,你到底想要验证什么?
@@ -0,0 +193,4 @@
pool.Close()
return nil, authenticationFailure("authenticate to PostgreSQL")
return pool, nil
woc从这里往上是一串超长的面向过程面条代码,很多validate的逻辑应该都不要
还是面向过程的面条
@@ -0,0 +196,4 @@
func validateAddress(value string) error {
你告诉我加一条校验有效http url有什么意义
@@ -0,0 +205,4 @@
return nil
func validateRelativePath(value string, rejectAPILayer bool) error {
同理
@@ -41,3 +46,3 @@
func (m instanceStateMachine) reconcile(instance *databasev1alpha1.PostgreSQLInstance) instancePhaseResult {
func (m *instanceStateMachine) reconcile(ctx context.Context, instance *databasev1alpha1.PostgreSQLInstance) (ctrl.Result, error) {
phase := instance.Status.Phase
这里可读性差了点,稍微补一下注释
@@ -59,3 +71,1 @@
phase: databasev1alpha1.PostgreSQLInstancePhaseValidating,
reconcilingMessage: "instance dependencies are being validated",
func (m *instanceStateMachine) pending(_ context.Context, instance *databasev1alpha1.PostgreSQLInstance) (ctrl.Result, error) {
虽然嘛返回result也很正常,但是这里要注意的是上面的代码做完了读取状态-》决定动作这一步,那么每一步内要做的事情剩下处理状态-〉进行状态转移,这是标准的状态机实现。
@@ -66,2 +76,2 @@
phase: databasev1alpha1.PostgreSQLInstancePhaseDeleting,
reconcilingMessage: "instance deletion is reconciling",
func (m *instanceStateMachine) validate(ctx context.Context, instance *databasev1alpha1.PostgreSQLInstance) (ctrl.Result, error) {
if m.initializer == nil {
这不能说是坏习惯,但我想知道他什么时候会为null
@@ -27,3 +29,3 @@
type instanceStateMachine struct {
handlers map[databasev1alpha1.PostgreSQLInstancePhase]instancePhaseHandler
initializer PostgreSQLInstanceInitializer
我不理解为什么是initializer,这不是就是postgresqlinstance的domain对象吗?ddd呢?初始化一看就很面向过程啊
名字?
@@ -0,0 +90,4 @@
return nil, err
if !filepath.IsAbs(config.ServiceAccountTokenPath) || validateRelativePath(config.OpenBaoAuthMount, false) != nil ||
按说initializer初始化比较后期,这时候校验openbao配置?这个配置校验不应该注入配置的时候就做好吗?说的比较复杂一点就是当配置无效这个配置类就不该被创建,然后fatal直接崩溃掉
a4d835e612
0c8edaa8de
59303f5276
@@ -37,6 +38,7 @@ import (
databasev1alpha1 "git.ddupan.top/panxiao81/postgresql-tenant-operator/api/v1alpha1"
"git.ddupan.top/panxiao81/postgresql-tenant-operator/internal/controller"
instanceinitializer "git.ddupan.top/panxiao81/postgresql-tenant-operator/internal/instance"
名字没改
No dependencies set.
The note is not visible to the blocked user.
合并范围
结束本 PR 的长期迭代,保留阶段性代码与已确认设计,后续实现使用独立、小范围 PR。
当前限制
代码仍使用早期 Bao 管理凭据路径,API types、连接装配和删除实现尚未对齐最新文档。此 PR 不是新领域模型或 Secret 连接方案的完成声明,不应据此部署为符合全部规格的版本。
后续先实现 Instance 纯领域模型及测试,再分小 PR 接入适配器和应用用例;不在本 PR 继续堆叠重构。Tenant 设计未在本轮展开。
验证
既有代码本地 lint 曾通过;本批文档 git diff --check 通过。未在本轮运行完整测试或 E2E,CI 状态以具体提交检查为准。
Refs #1
@@ -62,6 +72,12 @@ func (r *PostgreSQLInstanceReconciler) Reconcile(ctx context.Context, req ctrl.RsetReconcilingCondition(&instance.Status.Conditions, instance.Generation, phaseResult.reconcilingMessage)}var reconcileErr error这里我理解是基于状态决定状态机动作,那代码也应该扔进状态机而不是在这里
@@ -0,0 +76,4 @@// New validates config and constructs an Initializer.func New(config Config) (*Initializer, error) {if config.OpenBaoAddress == "" || config.OpenBaoAuthRole == "" || config.OpenBaoAuthMount == "" ||我们要不要用经典spf13的两件套?
不过已经搞了DI,viper的收益不大了
@@ -0,0 +139,4 @@ctx, cancel := context.WithTimeout(ctx, i.config.Timeout)defer cancel()clientConfig := openbao.DefaultConfig()可能我Spring用太多了总有一种这种Config应该配合Config来源动态注册进来的感觉
然后client本身的话也作为单例。。。但单例不一定是对的嗷
连接数据库本身为什么需要配置openbao?这个数据库凭据可能放在openbao,但是会有eso来同步secret,应用应当还是传统方式从env或配置文件来拿这个连接信息
@@ -0,0 +147,4 @@if err != nil {return nil, dependencyFailure("create OpenBao client")}auth, err := kubernetesauth.NewKubernetesAuth(这地方还有初始化Kubernetes的部分,这些代码不该在这里吧
@@ -64,2 +68,4 @@var externalSecretStoreName, postgreSQLCABundlePath stringvar reconcileTimeout time.Durationvar tlsOpts []func(*tls.Config)flag.StringVar(&metricsAddr, "metrics-bind-address", "0", "The address the metrics endpoint binds to. "+是不是应该评估一下要不要引入SPF13两件套
@@ -90,0 +115,4 @@PostgreSQLCABundlePath: postgreSQLCABundlePath, Timeout: reconcileTimeout,})if err != nil {setupLog.Error(err, "Invalid controller dependency configuration")话说log库是?
@@ -181,3 +213,2 @@if err := (&controller.PostgreSQLInstanceReconciler{Client: mgr.GetClient(),Scheme: mgr.GetScheme(),Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Initializer: instanceInitializer, Timeout: reconcileTimeout,写一行这可读性有点差了
@@ -63,6 +63,9 @@ spec:args:- --leader-elect- --health-probe-bind-address=:8081- --openbao-address=https://openbao.openbao.svc:8200死的配置文件?绑定环境了?环境信息应该在ci注入吧
@@ -37,0 +35,4 @@| `--openbao-auth-mount` | `kubernetes` | Kubernetes auth mount 名称 || `--openbao-auth-role` | 必填 | controller ServiceAccount 对应 role || `--openbao-kv-mount` | `kv` | KV v2 mount;开发可显式用 `secret` || `--openbao-service-account-token-path` | `/var/run/secrets/kubernetes.io/serviceaccount/token` | Kubernetes auth 使用的投射 token 文件 |这是?这东西需要一个参数吗?
@@ -75,0 +90,4 @@return ctrl.Result{}, reconcileErr}func (r *PostgreSQLInstanceReconciler) reconcileDependencies(同上这个函数应该也是状态机吧
@@ -0,0 +87,4 @@if config.OpenBaoConsumerAddress == "" {config.OpenBaoConsumerAddress = config.OpenBaoAddress}if err := validateAddress(config.OpenBaoConsumerAddress); err != nil {所以你这到底是instance的初始化代码放在这里还是把整个控制器的初始化代码扔这里了?
@@ -0,0 +126,4 @@return "", privilegeFailure("initialize PostgreSQL registry")}var version stringif err := pool.QueryRow(ctx, "SHOW server_version").Scan(&version); err != nil {你看你重新实现了一遍上面的Validate,你到底想要验证什么?
@@ -0,0 +193,4 @@pool.Close()return nil, authenticationFailure("authenticate to PostgreSQL")}return pool, nilwoc从这里往上是一串超长的面向过程面条代码,很多validate的逻辑应该都不要
还是面向过程的面条
@@ -0,0 +196,4 @@return pool, nil}func validateAddress(value string) error {你告诉我加一条校验有效http url有什么意义
@@ -0,0 +205,4 @@return nil}func validateRelativePath(value string, rejectAPILayer bool) error {同理
@@ -41,3 +46,3 @@func (m instanceStateMachine) reconcile(instance *databasev1alpha1.PostgreSQLInstance) instancePhaseResult {func (m *instanceStateMachine) reconcile(ctx context.Context, instance *databasev1alpha1.PostgreSQLInstance) (ctrl.Result, error) {phase := instance.Status.Phase这里可读性差了点,稍微补一下注释
@@ -59,3 +71,1 @@phase: databasev1alpha1.PostgreSQLInstancePhaseValidating,reconcilingMessage: "instance dependencies are being validated",}func (m *instanceStateMachine) pending(_ context.Context, instance *databasev1alpha1.PostgreSQLInstance) (ctrl.Result, error) {虽然嘛返回result也很正常,但是这里要注意的是上面的代码做完了读取状态-》决定动作这一步,那么每一步内要做的事情剩下处理状态-〉进行状态转移,这是标准的状态机实现。
@@ -66,2 +76,2 @@phase: databasev1alpha1.PostgreSQLInstancePhaseDeleting,reconcilingMessage: "instance deletion is reconciling",func (m *instanceStateMachine) validate(ctx context.Context, instance *databasev1alpha1.PostgreSQLInstance) (ctrl.Result, error) {if m.initializer == nil {这不能说是坏习惯,但我想知道他什么时候会为null
@@ -27,3 +29,3 @@type instanceStateMachine struct {handlers map[databasev1alpha1.PostgreSQLInstancePhase]instancePhaseHandlerinitializer PostgreSQLInstanceInitializer我不理解为什么是initializer,这不是就是postgresqlinstance的domain对象吗?ddd呢?初始化一看就很面向过程啊
名字?
@@ -0,0 +90,4 @@if err := validateAddress(config.OpenBaoConsumerAddress); err != nil {return nil, err}if !filepath.IsAbs(config.ServiceAccountTokenPath) || validateRelativePath(config.OpenBaoAuthMount, false) != nil ||按说initializer初始化比较后期,这时候校验openbao配置?这个配置校验不应该注入配置的时候就做好吗?说的比较复杂一点就是当配置无效这个配置类就不该被创建,然后fatal直接崩溃掉
a4d835e612to0c8edaa8de0c8edaa8deto59303f5276@@ -37,6 +38,7 @@ import (databasev1alpha1 "git.ddupan.top/panxiao81/postgresql-tenant-operator/api/v1alpha1""git.ddupan.top/panxiao81/postgresql-tenant-operator/internal/controller"instanceinitializer "git.ddupan.top/panxiao81/postgresql-tenant-operator/internal/instance"名字没改
feat: 实现 PostgreSQLInstance Ready 纵向链路to Instance 阶段性基线:Ready 初版与领域设计