3

I would like to serialize a Subscription resource (from github.com/operator-framework/api/pkg/operators/v1alpha1) to YAML using code like this:

    subscription := operatorsv1alpha1.Subscription{
        TypeMeta: metav1.TypeMeta{
            APIVersion: operatorsv1alpha1.SubscriptionCRDAPIVersion,
            Kind:       operatorsv1alpha1.SubscriptionKind,
        },
        ObjectMeta: metav1.ObjectMeta{
            Namespace: namespaceName,
            Name:      pkg.Name,
        },
        Spec: &operatorsv1alpha1.SubscriptionSpec{
            Package:                pkg.Name,
            Channel:                channel.Name,
            InstallPlanApproval:    operatorsv1alpha1.Approval(subscribeFlags.Approval),
            CatalogSource:          pkg.Status.CatalogSource,
            CatalogSourceNamespace: pkg.Status.CatalogSourceNamespace,
        },
    }

    operatorsv1alpha1.AddToScheme(scheme.Scheme)
    corev1.AddToScheme(scheme.Scheme)

    serializer := json.NewSerializerWithOptions(
        json.DefaultMetaFactory, scheme.Scheme, scheme.Scheme,
        json.SerializerOptions{
            Pretty: true,
            Yaml:   true,
            Strict: true,
        })

    if err := serializer.Encode(&subscription, os.Stdout); err != nil {
        return err
    }

This works, except that operator-framework/api defines a Subcription resource like this:

type Subscription struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata"`

    Spec *SubscriptionSpec `json:"spec"`
    // +optional
    Status SubscriptionStatus `json:"status"`
}

Which means that the serialized output always includes a status element with a null status.lastUpdated field:

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  creationTimestamp: null
  name: argocd-operator
spec:
  channel: alpha
  installPlanApproval: Automatic
  name: argocd-operator
  source: operatorhubio-catalog
  sourceNamespace: olm
status:
  lastUpdated: null

Submitting the serialized manifest fails with:

error: error validating "STDIN": error validating data: ValidationError(Subscription.status): missing required field "lastUpdated" in com.coreos.operators.v1alpha1.Subscription.status; if you choose to ignore these errors, turn validation off with --validate=false

Is there a canonical method for serializing these resources without including the status field?

larsks
  • 277,717
  • 41
  • 399
  • 399

0 Answers0