func KameletCatalog()

in pkg/install/kamelets.go [63:133]


func KameletCatalog(ctx context.Context, c client.Client, namespace string) error {
	kameletDir := os.Getenv(kameletDirEnv)
	if kameletDir == "" {
		kameletDir = defaultKameletDir
	}
	d, err := os.Stat(kameletDir)
	switch {
	case err != nil && os.IsNotExist(err):
		return nil
	case err != nil:
		return err
	case !d.IsDir():
		return fmt.Errorf("kamelet directory %q is a file", kameletDir)
	}

	g, gCtx := errgroup.WithContext(ctx)

	err = filepath.WalkDir(kameletDir, func(p string, f fs.DirEntry, err error) error {
		if err != nil {
			return err
		}
		if f.IsDir() && f.Name() != d.Name() {
			return fs.SkipDir
		}
		if !(strings.HasSuffix(f.Name(), ".yaml") || strings.HasSuffix(f.Name(), ".yml")) {
			return nil
		}
		// We may want to throttle the creation of Go routines if the number of bundled Kamelets increases.
		g.Go(func() error {
			kamelet, err := loadKamelet(filepath.Join(kameletDir, f.Name()), namespace)
			if err != nil {
				return err
			}
			once := false
			tryServerSideApply.Do(func() {
				once = true
				if err = serverSideApply(gCtx, c, kamelet); err != nil {
					if isIncompatibleServerError(err) {
						log.Info("Fallback to client-side apply for installing bundled Kamelets")
						hasServerSideApply.Store(false)
						err = nil
					} else {
						// Unexpected error occurred
						err = fmt.Errorf("unexpected error occurred whilst validating kamelet: %w", err)
						log.Error(err, "Error occurred whilst loading kamelets")
					}
				} else {
					hasServerSideApply.Store(true)
				}
			})
			if err != nil {
				return err
			}
			v := hasServerSideApply.Load()
			if vb, ok := v.(bool); ok && vb {
				if !once {
					return serverSideApply(gCtx, c, kamelet)
				}
			} else {
				return clientSideApply(gCtx, c, kamelet)
			}
			return nil
		})
		return nil
	})
	if err != nil {
		return err
	}

	return g.Wait()
}