func extractYAMLParts()

in hack/operatorhub/internal/operatorhub/operatorhub.go [303:365]


func extractYAMLParts(stream io.Reader) (*yamlExtracts, error) {
	if err := apiextv1beta1.AddToScheme(scheme.Scheme); err != nil {
		return nil, fmt.Errorf("while registering apiextensions/v1beta1: %w", err)
	}

	if err := apiextv1.AddToScheme(scheme.Scheme); err != nil {
		return nil, fmt.Errorf("while registering apiextensions/v1: %w", err)
	}

	if err := admissionv1.AddToScheme(scheme.Scheme); err != nil {
		return nil, fmt.Errorf("while registering admissionregistration/v1: %w", err)
	}

	decoder := scheme.Codecs.UniversalDeserializer()
	yamlReader := yaml.NewYAMLReader(bufio.NewReader(stream))

	parts := &yamlExtracts{
		crds: make(map[string]*CRD),
	}

	for {
		yamlBytes, err := yamlReader.Read()
		if err != nil {
			if errors.Is(err, io.EOF) {
				return parts, nil
			}

			return nil, fmt.Errorf("while reading CRD YAML: %w", err)
		}

		yamlBytes = normalizeTrailingNewlines(yamlBytes)

		runtimeObj, _, err := decoder.Decode(yamlBytes, nil, nil)
		if err != nil {
			return nil, fmt.Errorf("while decoding CRD YAML: %w", err)
		}

		switch obj := runtimeObj.(type) {
		case *apiextv1beta1.CustomResourceDefinition:
			parts.crds[obj.Name] = &CRD{
				Name:    obj.Name,
				Group:   obj.Spec.Group,
				Kind:    obj.Spec.Names.Kind,
				Version: obj.Spec.Version,
				Def:     yamlBytes,
			}
		case *apiextv1.CustomResourceDefinition:
			parts.crds[obj.Name] = &CRD{
				Name:    obj.Name,
				Group:   obj.Spec.Group,
				Kind:    obj.Spec.Names.Kind,
				Version: obj.Spec.Versions[0].Name,
				Def:     yamlBytes,
			}
		case *rbacv1.ClusterRole:
			if obj.Name == operatorName {
				parts.operatorRBAC = obj.Rules
			}
		case *admissionv1.ValidatingWebhookConfiguration:
			parts.operatorWebhooks = append(parts.operatorWebhooks, *obj)
		}
	}
}