func buildChart()

in tooling/mcerepkg/main.go [71:154]


func buildChart(outputDir, mceOlmBundle, sourceLink, scaffoldDir string) error {
	ctx := context.Background()

	// load OLM bundle manifests
	img, err := crane.Load(mceOlmBundle)
	if err != nil {
		return fmt.Errorf("failed to load OLM bundle image: %v", err)
	}
	olmManifests, reg, err := olm.ExtractOLMBundleImage(ctx, img)
	if err != nil {
		return fmt.Errorf("failed to extract OLM bundle image: %v", err)
	}

	// sanity check manifests
	err = customize.SanityCheck(olmManifests)
	if err != nil {
		return fmt.Errorf("failed sanity checks on manifests: %v", err)
	}

	// load scaffolding manifests
	scaffoldManifests, err := customize.LoadScaffoldTemplates(scaffoldDir)
	if err != nil {
		return fmt.Errorf("failed to load scaffold templates: %v", err)
	}

	// customize manifests
	customizedManifests, values, err := customize.CustomizeManifests(append(olmManifests, scaffoldManifests...))
	if err != nil {
		return fmt.Errorf("failed to customize manifests: %v", err)
	}

	// build chart
	mceChart := &chart.Chart{
		Metadata: &chart.Metadata{
			APIVersion:  "v2",
			Name:        "multicluster-engine",
			Description: "A Helm chart for multicluster-engine",
			Version:     reg.CSV.Spec.Version.String(),
			AppVersion:  reg.CSV.Spec.Version.String(),
			Type:        "application",
			Sources:     []string{sourceLink},
			Keywords:    reg.CSV.Spec.Keywords,
		},
	}
	var chartFiles []*chart.File

	// add values file
	valuesYaml, err := yaml.Marshal(values)
	if err != nil {
		return fmt.Errorf("failed to marshal values to YAML: %v", err)
	}
	chartFiles = append(chartFiles, &chart.File{
		Name: "values.yaml",
		Data: valuesYaml,
	})

	// add manifests and CRDs
	for _, manifest := range customizedManifests {
		yamlData, err := yaml.Marshal(manifest.Object)

		if err != nil {
			return fmt.Errorf("failed to marshal object to YAML: %v", err)
		}

		path := fmt.Sprintf("templates/%s.%s.yaml", manifest.GetName(), strings.ToLower(manifest.GetKind()))
		if manifest.GetKind() == "CustomResourceDefinition" {
			path = fmt.Sprintf("crds/%s.yaml", manifest.GetName())
		}

		chartFiles = append(chartFiles, &chart.File{
			Name: path,
			Data: yamlData,
		})
	}
	mceChart.Templates = chartFiles

	// store chart
	err = chartutil.SaveDir(mceChart, outputDir)
	if err != nil {
		return fmt.Errorf("failed to save chart to directory: %v", err)
	}

	return nil
}