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()
}