Files
ayatori/internal/database/adapter/kubernetes/binding_mapping.go
T
panxiao81 7e9e8e828b
Verify / test (pull_request) Successful in 11m39s
Verify / lint (pull_request) Successful in 12m51s
Verify / database-integration (pull_request) Successful in 13m12s
feat: 接入 Database 三资源 API 与分层绑定协调
确定单库单账号、集群级 Database、资源侧先写绑定和凭据定位合同。领域层承载纯规则,service 协調流程,Kubernetes adapter 负责资源呈现与版本保护。

验证:全量 make test、三轮 race、真实 API server 并发与重启补写、最小 RBAC/watch、lint 和文档检查通过。供应、凭据交付及删除清理尚未实现,保留 DeletionPending/finalizer 边界。
2026-09-25 04:09:43 +00:00

62 lines
2.5 KiB
Go

package kubernetes
import (
databasev1alpha1 "git.ddupan.top/panxiao81/ayatori/api/database/v1alpha1"
"git.ddupan.top/panxiao81/ayatori/internal/database/application"
"git.ddupan.top/panxiao81/ayatori/internal/database/domain/binding"
"k8s.io/apimachinery/pkg/types"
)
func bindingTenant(object *databasev1alpha1.PostgreSQLTenant) *application.BindingTenant {
tenant := &application.BindingTenant{
Revision: object.ResourceVersion, Generation: object.Generation,
}
tenant.Tenant = binding.Tenant{
Identity: binding.TenantIdentity{Namespace: object.Namespace, Name: object.Name, UID: string(object.UID)},
Phase: object.Status.Phase, Deleting: !object.DeletionTimestamp.IsZero(),
}
if request := object.Spec.Provision; request != nil {
tenant.Request.Provision = &binding.ProvisionRequest{
Instance: string(request.InstanceRef.Name), Database: string(request.Database), LoginRole: string(request.LoginRole),
}
}
if object.Spec.DatabaseRef != nil {
tenant.Request.ExistingDatabase = string(object.Spec.DatabaseRef.Name)
}
if ref := object.Status.DatabaseRef; ref != nil {
tenant.Database = &binding.Identity{Name: string(ref.Name), UID: string(ref.UID)}
}
return tenant
}
func bindingDatabase(object *databasev1alpha1.PostgreSQLDatabase) *application.BindingDatabase {
database := &application.BindingDatabase{
Revision: object.ResourceVersion,
}
database.Database = binding.Database{
Identity: binding.Identity{Name: object.Name, UID: string(object.UID)},
Instance: string(object.Spec.InstanceRef.Name), InstanceUID: string(object.Status.InstanceUID),
Name: string(object.Spec.Database), LoginRole: string(object.Spec.LoginRole), Source: object.Spec.Source,
Phase: object.Status.Phase, Deleting: !object.DeletionTimestamp.IsZero(),
Ready: currentReady(object.Generation, object.Status.Conditions),
}
if ref := object.Spec.TenantRef; ref != nil {
database.Tenant = &binding.TenantIdentity{Namespace: ref.Namespace, Name: string(ref.Name), UID: string(ref.UID)}
}
return database
}
func tenantReference(tenant binding.TenantIdentity) *databasev1alpha1.TenantReference {
return &databasev1alpha1.TenantReference{
Namespace: tenant.Namespace, Name: databasev1alpha1.ObjectName(tenant.Name), UID: types.UID(tenant.UID),
}
}
// BindingTargetName 供 informer 索引使用;不把无效请求丢出事件映射。
func BindingTargetName(tenant *databasev1alpha1.PostgreSQLTenant) string {
if tenant.Spec.DatabaseRef != nil {
return string(tenant.Spec.DatabaseRef.Name)
}
return binding.DynamicDatabaseName(string(tenant.UID))
}