func RegistryV1ToPlain()

in tooling/mcerepkg/internal/rukpak/convert/registryv1.go [58:156]


func RegistryV1ToPlain(rv1 fs.FS, installNamespace string, watchNamespaces []string) (fs.FS, RegistryV1, error) {
	reg := RegistryV1{}
	fileData, err := fs.ReadFile(rv1, filepath.Join("metadata", "annotations.yaml"))
	if err != nil {
		return nil, reg, err
	}
	annotationsFile := registry.AnnotationsFile{}
	if err := yaml.Unmarshal(fileData, &annotationsFile); err != nil {
		return nil, reg, err
	}
	reg.PackageName = annotationsFile.Annotations.PackageName

	var objects []*unstructured.Unstructured
	const manifestsDir = "manifests"

	entries, err := fs.ReadDir(rv1, manifestsDir)
	if err != nil {
		return nil, reg, err
	}
	for _, e := range entries {
		if e.IsDir() {
			return nil, reg, fmt.Errorf("subdirectories are not allowed within the %q directory of the bundle image filesystem: found %q", manifestsDir, filepath.Join(manifestsDir, e.Name()))
		}
		fileData, err := fs.ReadFile(rv1, filepath.Join(manifestsDir, e.Name()))
		if err != nil {
			return nil, reg, err
		}

		dec := apimachyaml.NewYAMLOrJSONDecoder(bytes.NewReader(fileData), 1024)
		for {
			obj := unstructured.Unstructured{}
			err := dec.Decode(&obj)
			if errors.Is(err, io.EOF) {
				break
			}
			if err != nil {
				return nil, reg, fmt.Errorf("read %q: %v", e.Name(), err)
			}
			objects = append(objects, &obj)
		}
	}

	for _, obj := range objects {
		obj := obj
		switch obj.GetObjectKind().GroupVersionKind().Kind {
		case "ClusterServiceVersion":
			csv := v1alpha1.ClusterServiceVersion{}
			if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &csv); err != nil {
				return nil, reg, err
			}
			reg.CSV = csv
		case "CustomResourceDefinition":
			crd := apiextensionsv1.CustomResourceDefinition{}
			if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, &crd); err != nil {
				return nil, reg, err
			}
			reg.CRDs = append(reg.CRDs, crd)
		default:
			reg.Others = append(reg.Others, *obj)
		}
	}

	plain, err := Convert(reg, installNamespace, watchNamespaces)
	if err != nil {
		return nil, reg, err
	}

	var manifest bytes.Buffer
	for _, obj := range plain.Objects {
		yamlData, err := yaml.Marshal(obj)
		if err != nil {
			return nil, reg, err
		}
		if _, err := fmt.Fprintf(&manifest, "---\n%s\n", string(yamlData)); err != nil {
			return nil, reg, err
		}
	}

	now := time.Now()
	plainFS := fstest.MapFS{
		".": &fstest.MapFile{
			Data:    nil,
			Mode:    fs.ModeDir | 0o755,
			ModTime: now,
		},
		"manifests": &fstest.MapFile{
			Data:    nil,
			Mode:    fs.ModeDir | 0o755,
			ModTime: now,
		},
		"manifests/manifest.yaml": &fstest.MapFile{
			Data:    manifest.Bytes(),
			Mode:    0o644,
			ModTime: now,
		},
	}

	return plainFS, reg, nil
}