@@ -29,6 +29,7 @@ import (
2929 coreconst "k8s-dbs/core/constant"
3030 coreentity "k8s-dbs/core/entity"
3131 coreutil "k8s-dbs/core/util"
32+ corevalidator "k8s-dbs/core/validator"
3233 infrautil "k8s-dbs/infrastructure/util"
3334 metaentity "k8s-dbs/metadata/entity"
3435 metaprovider "k8s-dbs/metadata/provider"
@@ -68,6 +69,7 @@ type ClusterProvider struct {
6869 clusterHelmRepoProvider metaprovider.AddonClusterHelmRepoProvider
6970 ClusterTagProvider metaprovider.K8sCrdClusterTagProvider
7071 dbmAPIService * thirdapi.DbmAPIService
72+ envValidator * corevalidator.EnvValidator
7173}
7274
7375// ClusterProviderOptions ClusterProvider 的函数选项
@@ -157,6 +159,15 @@ func (c *ClusterProviderBuilder) WithDbmAPIService(
157159 }
158160}
159161
162+ // WithEnvValidator 设置 EnvValidator
163+ func (c * ClusterProviderBuilder ) WithEnvValidator (
164+ validator * corevalidator.EnvValidator ,
165+ ) ClusterProviderOptions {
166+ return func (c * ClusterProvider ) {
167+ c .envValidator = validator
168+ }
169+ }
170+
160171// validateProvider 验证 ClusterProvider 必要字段
161172func (c * ClusterProvider ) validateProvider () error {
162173 if c .clusterMetaProvider == nil {
@@ -216,9 +227,14 @@ func InstanceSetGVR() schema.GroupVersionResource {
216227// CreateCluster 创建集群
217228func (c * ClusterProvider ) CreateCluster (ctx * commentity.DbsContext , request * coreentity.Request ) error {
218229 // 检查集群版本
219- if err := c .checkClusterVersion (request ); err != nil {
230+ addonID , err := c .checkClusterVersion (request )
231+ if err != nil {
220232 return err
221233 }
234+ // 验证环境变量参数
235+ if err := c .validateComponentEnv (addonID , request ); err != nil {
236+ return dbserrors .NewK8sDbsError (dbserrors .ParameterInvalidError , err )
237+ }
222238 // 检查是否重复创建
223239 k8sClusterConfig , err := c .clusterConfigProvider .FindConfigByName (request .K8sClusterName )
224240 if err != nil {
@@ -496,35 +512,37 @@ func (c *ClusterProvider) syncClusterUpdatedWithContext(
496512//
497513// 返回值:
498514//
515+ // uint64 - 匹配到的 addon ID
499516// error - 检查过程中遇到的错误,如果检查通过则为nil
500- // bool - 是否发生了错误,true表示有错误发生
501- func (c * ClusterProvider ) checkClusterVersion (request * coreentity.Request ) error {
517+ func (c * ClusterProvider ) checkClusterVersion (request * coreentity.Request ) (uint64 , error ) {
502518 addonQueryParams := & metaentity.AddonQueryParams {
503519 AddonType : request .StorageAddonType ,
504520 AddonVersion : request .StorageAddonVersion ,
505521 }
506522 storageAddon , err := c .addonMetaProvider .FindStorageAddonByParams (addonQueryParams )
507523 if err != nil {
508- return dbserrors .NewK8sDbsError (dbserrors .GetMetaDataError ,
524+ return 0 , dbserrors .NewK8sDbsError (dbserrors .GetMetaDataError ,
509525 fmt .Errorf ("查询存储插件元数据失败: %w" , err ))
510526 }
511527 if len (storageAddon ) == 0 {
512- return dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
528+ return 0 , dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
513529 fmt .Errorf ("插件类型 '%s' 版本 '%s' 不存在或未配置,请检查插件配置" , request .StorageAddonType , request .StorageAddonVersion ))
514530 }
515531
532+ addonID := storageAddon [0 ].ID
533+
516534 // 反序列化支持的版本列表
517535 var supportedVersions []string
518536 if err := json .Unmarshal ([]byte (storageAddon [0 ].SupportedVersions ), & supportedVersions ); err != nil {
519537 slog .Error ("failed to unmarshal supported versions" , "error" , err )
520- return dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
538+ return 0 , dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
521539 fmt .Errorf ("supported versions 反序列化失败" ))
522540 }
523541
524542 // 检查组件版本是否在支持的版本列表中
525543 for _ , component := range request .ComponentList {
526544 if ! lo .Contains (supportedVersions , component .Version ) {
527- return dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
545+ return 0 , dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
528546 fmt .Errorf ("组件 %s 的版本 %s 不在支持的版本列表中,支持的版本: %v" ,
529547 component .ComponentName , component .Version , supportedVersions ))
530548 }
@@ -534,16 +552,16 @@ func (c *ClusterProvider) checkClusterVersion(request *coreentity.Request) error
534552 var supportedAcVersions []string
535553 if err := json .Unmarshal ([]byte (storageAddon [0 ].SupportedAcVersions ), & supportedAcVersions ); err != nil {
536554 slog .Error ("failed to unmarshal supported ac versions" , "error" , err )
537- return dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
555+ return 0 , dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
538556 fmt .Errorf ("supported ac versions 反序列化失败" ))
539557 }
540558
541559 if ! lo .Contains (supportedAcVersions , request .AddonClusterVersion ) {
542- return dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
560+ return 0 , dbserrors .NewK8sDbsError (dbserrors .CreateClusterError ,
543561 fmt .Errorf ("addonClusterVersion 版本 %s 不在支持的版本列表中,支持的版本: %v" ,
544562 request .AddonClusterVersion , supportedAcVersions ))
545563 }
546- return nil
564+ return addonID , nil
547565}
548566
549567// saveClusterReleaseMeta 记录集群 release 元数据
@@ -650,6 +668,10 @@ func (c *ClusterProvider) UpdateClusterRelease(
650668 if err := c .validateAddonClusterVersion (request , clusterEntity ); err != nil {
651669 return err
652670 }
671+ // 验证环境变量参数
672+ if err := c .validateComponentEnv (clusterEntity .AddonID , request ); err != nil {
673+ return dbserrors .NewK8sDbsError (dbserrors .ParameterInvalidError , err )
674+ }
653675 // 更新 cluster release
654676 values , err := c .updateClusterRelease (ctx , request , k8sClient , isPartial )
655677 if err != nil {
@@ -1327,3 +1349,30 @@ func (c *ClusterProvider) validateAddonClusterVersion(
13271349 }
13281350 return nil
13291351}
1352+
1353+ // validateComponentEnv 验证组件环境变量参数
1354+ func (c * ClusterProvider ) validateComponentEnv (addonID uint64 , request * coreentity.Request ) error {
1355+ if c .envValidator == nil {
1356+ // 如果没有配置验证器,跳过验证
1357+ return nil
1358+ }
1359+ if request .ComponentList == nil {
1360+ return nil
1361+ }
1362+
1363+ for _ , component := range request .ComponentList {
1364+ if component .Env == nil {
1365+ continue
1366+ }
1367+ // 使用组件的服务版本进行参数验证
1368+ if err := c .envValidator .ValidateVMComponentEnv (
1369+ addonID ,
1370+ component .Version ,
1371+ component .ComponentName ,
1372+ component .Env ,
1373+ ); err != nil {
1374+ return fmt .Errorf ("组件 '%s' 环境变量验证失败: %w" , component .ComponentName , err )
1375+ }
1376+ }
1377+ return nil
1378+ }
0 commit comments