diff --git a/pkg/engine/api/generate/generator/generator.go b/pkg/engine/api/generate/generator/generator.go index 590e5b7d..7ae769e9 100644 --- a/pkg/engine/api/generate/generator/generator.go +++ b/pkg/engine/api/generate/generator/generator.go @@ -29,7 +29,7 @@ import ( v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" "kusionstack.io/kusion/pkg/engine/api/builders" "kusionstack.io/kusion/pkg/engine/api/generate/run" - "kusionstack.io/kusion/pkg/modules/generators" + "kusionstack.io/kusion/pkg/modules" "kusionstack.io/kusion/pkg/util/io" "kusionstack.io/kusion/pkg/util/kfile" ) @@ -101,7 +101,7 @@ func CopyDependentModules(workDir string) error { for _, dep := range modFile.Deps { if dep.Source.Oci != nil { // ignore workload modules - if generators.IgnoreModules[dep.Name] { + if modules.IgnoreModules[dep.Name] { continue } diff --git a/pkg/modules/generators/app_configurations_generator.go b/pkg/modules/generators/app_configurations_generator.go index 4c2c1254..8a860c97 100644 --- a/pkg/modules/generators/app_configurations_generator.go +++ b/pkg/modules/generators/app_configurations_generator.go @@ -32,12 +32,6 @@ type appConfigurationGenerator struct { dependencies *pkg.Dependencies } -// IgnoreModules todo@dayuan delete this condition after workload is changed into a module -var IgnoreModules = map[string]bool{ - "service": true, - "job": true, -} - func NewAppConfigurationGenerator( project string, stack string, @@ -357,7 +351,7 @@ func (g *appConfigurationGenerator) callModules(projectModuleConfigs map[string] // generate customized module resources for t, config := range indexModuleConfig { // ignore workload modules - if IgnoreModules[t] { + if modules.IgnoreModules[t] { continue } diff --git a/pkg/modules/util.go b/pkg/modules/util.go index 3e8554d8..1c461b89 100644 --- a/pkg/modules/util.go +++ b/pkg/modules/util.go @@ -10,6 +10,12 @@ import ( v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" ) +// IgnoreModules todo@dayuan delete this condition after workload is changed into a module +var IgnoreModules = map[string]bool{ + "service": true, + "job": true, +} + // CallGeneratorFuncs calls each NewGeneratorFunc in the given slice // and returns a slice of Generator instances. func CallGeneratorFuncs(newGenerators ...NewGeneratorFunc) ([]Generator, error) { diff --git a/pkg/workspace/validation.go b/pkg/workspace/validation.go index ad34dfed..df6a0fd3 100644 --- a/pkg/workspace/validation.go +++ b/pkg/workspace/validation.go @@ -7,6 +7,7 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" v1 "kusionstack.io/kusion/pkg/apis/api.kusion.io/v1" + "kusionstack.io/kusion/pkg/modules" ) var ( @@ -60,7 +61,7 @@ func ValidateModuleConfigs(configs v1.ModuleConfigs) error { if cfg == nil { return fmt.Errorf("%w, module name: %s", ErrEmptyModuleConfig, name) } - if err := ValidateModuleConfig(cfg); err != nil { + if err := ValidateModuleConfig(name, cfg); err != nil { return fmt.Errorf("%w, module name: %s", err, name) } } @@ -69,7 +70,10 @@ func ValidateModuleConfigs(configs v1.ModuleConfigs) error { } // ValidateModuleConfig is used to validate the moduleConfig is valid or not. -func ValidateModuleConfig(config *v1.ModuleConfig) error { +func ValidateModuleConfig(name string, config *v1.ModuleConfig) error { + if err := ValidateModuleMetadata(name, config); err != nil { + return err + } if err := ValidateModuleDefaultConfig(config.Configs.Default); err != nil { return err } @@ -79,10 +83,22 @@ func ValidateModuleConfig(config *v1.ModuleConfig) error { return nil } +func ValidateModuleMetadata(name string, config *v1.ModuleConfig) error { + if modules.IgnoreModules[name] { + return nil + } + if config.Version == "" { + return fmt.Errorf("empty version of module:%s in the workspacek config", name) + } + if config.Path == "" { + return fmt.Errorf("empty path of module:%s in the workspacek config", name) + } + return nil +} + func ValidateModuleDefaultConfig(config v1.GenericConfig) error { - // todo@dayuan validate path and version in the config when we have turned workload into a module - if len(config) == 0 { - return fmt.Errorf("%w, block name: %s", ErrEmptyModuleConfigBlock, v1.DefaultBlock) + if config == nil { + return nil } if _, ok := config[v1.ProjectSelectorField]; ok { return ErrNotEmptyModuleConfigProjectSelector diff --git a/pkg/workspace/validation_test.go b/pkg/workspace/validation_test.go index dd3dfcd4..a42ce9fc 100644 --- a/pkg/workspace/validation_test.go +++ b/pkg/workspace/validation_test.go @@ -42,6 +42,8 @@ func mockValidModuleConfigs() map[string]*v1.ModuleConfig { }, }, "network": { + Path: "ghcr.io/kusionstack/network", + Version: "0.1.0", Configs: v1.Configs{ Default: v1.GenericConfig{ "type": "aws", @@ -274,12 +276,34 @@ func TestValidateModuleConfig(t *testing.T) { for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { - err := ValidateModuleConfig(&tc.moduleConfig) + err := ValidateModuleConfig("mysql", &tc.moduleConfig) assert.Equal(t, tc.success, err == nil) }) } } +func TestValidateModuleMetadata(t *testing.T) { + t.Run("ValidModuleMetadata", func(t *testing.T) { + err := ValidateModuleMetadata("testModule", &v1.ModuleConfig{Version: "1.0.0", Path: "/path/to/module"}) + assert.NoError(t, err) + }) + + t.Run("IgnoreModule", func(t *testing.T) { + err := ValidateModuleMetadata("service", &v1.ModuleConfig{Version: "1.0.0", Path: "/path/to/module"}) + assert.NoError(t, err) + }) + + t.Run("EmptyModuleVersion", func(t *testing.T) { + err := ValidateModuleMetadata("testModule", &v1.ModuleConfig{Version: "", Path: "/path/to/module"}) + assert.Error(t, err) + }) + + t.Run("EmptyModulePath", func(t *testing.T) { + err := ValidateModuleMetadata("testModule", &v1.ModuleConfig{Version: "1.0.0", Path: ""}) + assert.Error(t, err) + }) +} + func TestValidateAWSSecretStore(t *testing.T) { type args struct { ss *v1.AWSProvider