diff --git a/internal/configuration/load.go b/internal/configuration/load.go index d20d6e3..94d9e70 100644 --- a/internal/configuration/load.go +++ b/internal/configuration/load.go @@ -63,7 +63,7 @@ func (c *Configuration) LoadStdinArchive(ctx context.Context, config *rest.Confi // Load configuration package from directory func (c *Configuration) LoadDirectory(ctx context.Context, config *rest.Config, logger *zap.SugaredLogger, path string) error { - packageLayer, err := image.LoadPackageLayerDirectory(ctx, config, path) + packageLayer, err := image.LoadPackageLayerDirectory(ctx, config, path, []string{"Configuration", "CompositeResourceDefinition", "Composition"}) if err != nil { return err } diff --git a/internal/configuration/serve.go b/internal/configuration/serve.go index 68faae2..7ae296b 100644 --- a/internal/configuration/serve.go +++ b/internal/configuration/serve.go @@ -54,43 +54,49 @@ func loadServed(ctx context.Context, dc *dynamic.DynamicClient, config *rest.Con } for _, e := range packFiles { - res := &metav1.TypeMeta{} - yamlFile, err := os.ReadFile(fmt.Sprintf("%s/%s", path, e.Name())) - if err != nil { - logger.Error(err) - } - err = yaml.Unmarshal(yamlFile, res) - if err != nil { - logger.Error(err) - } + if e.Type().IsRegular() { + if filepath.Ext(e.Name()) != ".yaml" { + continue + } - if res.Kind == "Configuration" { - ccfg := &cmv1.Configuration{} - err = yaml.Unmarshal(yamlFile, ccfg) + res := &metav1.TypeMeta{} + yamlFile, err := os.ReadFile(fmt.Sprintf("%s/%s", path, e.Name())) if err != nil { logger.Error(err) } - cfgName := fmt.Sprintf("%s:0.0.0", ccfg.GetName()) - cfg := New(cfgName) - - logger.Debugf("Upgrade Configuration: %s", cfg) - err := cfg.UpgradeConfiguration(ctx, config, dc) - - logger.Infof("Changes detected, apply configuration: %s", ccfg.GetName()) + err = yaml.Unmarshal(yamlFile, res) if err != nil { logger.Error(err) - } else { + } - logger.Debugf("Loading Configuration: %s", cfg) - err = cfg.LoadDirectory(ctx, config, logger, path) + if res.Kind == "Configuration" { + ccfg := &cmv1.Configuration{} + err = yaml.Unmarshal(yamlFile, ccfg) + if err != nil { + logger.Error(err) + } + cfgName := fmt.Sprintf("%s:0.0.0", ccfg.GetName()) + cfg := New(cfgName) + + logger.Debugf("Upgrade Configuration: %s", cfg) + err := cfg.UpgradeConfiguration(ctx, config, dc) + + logger.Infof("Changes detected, apply configuration: %s", ccfg.GetName()) if err != nil { logger.Error(err) } else { logger.Debugf("Loading Configuration: %s", cfg) - err = cfg.Apply(ctx, config, logger) + err = cfg.LoadDirectory(ctx, config, logger, path) if err != nil { logger.Error(err) + } else { + + logger.Debugf("Loading Configuration: %s", cfg) + err = cfg.Apply(ctx, config, logger) + if err != nil { + logger.Error(err) + } } } } diff --git a/internal/function/load.go b/internal/function/load.go index 8fc90cc..b73d3c4 100644 --- a/internal/function/load.go +++ b/internal/function/load.go @@ -74,7 +74,7 @@ func (c *Function) LoadDirectory(ctx context.Context, config *rest.Config, logge } logger.Debug("Loading function package...") - packageLayer, err := image.LoadPackageLayerDirectory(ctx, config, fmt.Sprintf("%s/%s", strings.TrimRight(path, "/"), packages.PackagePath)) + packageLayer, err := image.LoadPackageLayerDirectory(ctx, config, fmt.Sprintf("%s/%s", strings.TrimRight(path, "/"), packages.PackagePath), []string{"Function", "CustomResourceDefinition"}) if err != nil { return err } diff --git a/internal/function/serve.go b/internal/function/serve.go index 629413b..d70c863 100644 --- a/internal/function/serve.go +++ b/internal/function/serve.go @@ -56,6 +56,10 @@ func loadServed(ctx context.Context, dc *dynamic.DynamicClient, config *rest.Con for _, e := range packFiles { if e.Type().IsRegular() { + if filepath.Ext(e.Name()) != ".yaml" { + continue + } + res := &metav1.TypeMeta{} yamlFile, err := os.ReadFile(fmt.Sprintf("%s/%s", packagePath, e.Name())) if err != nil { @@ -63,8 +67,7 @@ func loadServed(ctx context.Context, dc *dynamic.DynamicClient, config *rest.Con } err = yaml.Unmarshal(yamlFile, res) if err != nil { - logger.Infof("Found non YAML file in package directory: %s. Please move it out before build package.", e.Name()) - continue + logger.Error(err) } logger.Debugf("Package found with kind: %s", res.Kind) if res.Kind == "Function" { diff --git a/internal/image/image.go b/internal/image/image.go index 0f825aa..b79cfe2 100644 --- a/internal/image/image.go +++ b/internal/image/image.go @@ -4,17 +4,19 @@ import ( "archive/tar" "bytes" "context" - "fmt" + "errors" "io" "io/fs" "os" "path/filepath" - "strings" + "slices" "github.com/google/go-containerregistry/pkg/crane" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/tarball" + "gopkg.in/yaml.v2" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/rest" ) @@ -81,20 +83,39 @@ func LoadBinaryLayer(content []byte, fileName string, permissions fs.FileMode) ( } // Load configuration package from directory -func LoadPackageLayerDirectory(ctx context.Context, config *rest.Config, path string) (v1.Layer, error) { - files, err := os.ReadDir(path) +func LoadPackageLayerDirectory(ctx context.Context, config *rest.Config, path string, kindsFilter []string) (v1.Layer, error) { + var files []string + + err := filepath.WalkDir(path, func(path string, d fs.DirEntry, err error) error { + if !d.IsDir() && filepath.Ext(path) == ".yaml" { + res := &metav1.TypeMeta{} + yamlFile, err := os.ReadFile(path) + if err != nil { + return errors.New("can't read") + } + err = yaml.Unmarshal(yamlFile, res) + if err != nil { + return errors.New("can't unmarshal") + } + + if slices.Contains(kindsFilter, res.Kind) { + files = append(files, path) + } + } + return nil + }) + if err != nil { return nil, err } + pkgContent := [][]byte{} for _, file := range files { - if file.Type().IsRegular() && filepath.Ext(file.Name()) == ".yaml" { - fileContent, err := os.ReadFile(fmt.Sprintf("%s/%s", strings.TrimRight(path, "/"), file.Name())) - if err != nil { - return nil, err - } - pkgContent = append(pkgContent, fileContent) + fileContent, err := os.ReadFile(file) + if err != nil { + return nil, err } + pkgContent = append(pkgContent, fileContent) } layer, err := crane.Layer(map[string][]byte{ diff --git a/internal/provider/load.go b/internal/provider/load.go index 4ae87bd..a350f91 100644 --- a/internal/provider/load.go +++ b/internal/provider/load.go @@ -92,7 +92,7 @@ func (p *Provider) LoadDirectory(ctx context.Context, config *rest.Config, logge } logger.Debug("Loading provider package...") - packageLayer, err := image.LoadPackageLayerDirectory(ctx, config, fmt.Sprintf("%s/%s", strings.TrimRight(path, "/"), packages.PackagePath)) + packageLayer, err := image.LoadPackageLayerDirectory(ctx, config, fmt.Sprintf("%s/%s", strings.TrimRight(path, "/"), packages.PackagePath), []string{"Provider", "CustomResourceDefinition"}) if err != nil { return err } diff --git a/internal/provider/serve.go b/internal/provider/serve.go index b3bfb2e..cb9d99b 100644 --- a/internal/provider/serve.go +++ b/internal/provider/serve.go @@ -57,6 +57,10 @@ func loadServed(ctx context.Context, dc *dynamic.DynamicClient, config *rest.Con for _, e := range packFiles { if e.Type().IsRegular() { + if filepath.Ext(e.Name()) != ".yaml" { + continue + } + res := &metav1.TypeMeta{} yamlFile, err := os.ReadFile(fmt.Sprintf("%s/%s", packagePath, e.Name())) if err != nil {