github.com/operator-framework/operator-lifecycle-manager@v0.30.0/pkg/lib/operatorstatus/clusteroperatorwriter.go (about)

     1  package operatorstatus
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"reflect"
     7  
     8  	configv1 "github.com/openshift/api/config/v1"
     9  	configv1client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
    10  	apierrors "k8s.io/apimachinery/pkg/api/errors"
    11  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  	"k8s.io/apimachinery/pkg/runtime/schema"
    13  	"k8s.io/client-go/discovery"
    14  )
    15  
    16  // NewWriter returns a new instance of Writer.
    17  func NewWriter(discovery discovery.DiscoveryInterface, client configv1client.ConfigV1Interface) *Writer {
    18  	return &Writer{
    19  		discovery: discovery,
    20  		client:    client,
    21  	}
    22  }
    23  
    24  // Writer encapsulates logic for cluster operator object API. It is used to
    25  // update ClusterOperator resource.
    26  type Writer struct {
    27  	discovery discovery.DiscoveryInterface
    28  	client    configv1client.ConfigV1Interface
    29  }
    30  
    31  // EnsureExists ensures that the cluster operator resource exists with a default
    32  // status that reflects expecting status.
    33  func (w *Writer) EnsureExists(name string) (existing *configv1.ClusterOperator, err error) {
    34  	existing, err = w.client.ClusterOperators().Get(context.TODO(), name, metav1.GetOptions{})
    35  	if err == nil {
    36  		return
    37  	}
    38  
    39  	if !apierrors.IsNotFound(err) {
    40  		return
    41  	}
    42  
    43  	co := &configv1.ClusterOperator{
    44  		ObjectMeta: metav1.ObjectMeta{
    45  			Name: name,
    46  		},
    47  	}
    48  	existing, err = w.client.ClusterOperators().Create(context.TODO(), co, metav1.CreateOptions{})
    49  	return
    50  }
    51  
    52  // UpdateStatus updates the clusteroperator object with the new status specified.
    53  func (w *Writer) UpdateStatus(existing *configv1.ClusterOperator, newStatus *configv1.ClusterOperatorStatus) error {
    54  	if newStatus == nil || existing == nil {
    55  		return errors.New("input specified is <nil>")
    56  	}
    57  
    58  	existingStatus := existing.Status.DeepCopy()
    59  	if reflect.DeepEqual(existingStatus, newStatus) {
    60  		return nil
    61  	}
    62  
    63  	existing.Status = *newStatus
    64  	if _, err := w.client.ClusterOperators().UpdateStatus(context.TODO(), existing, metav1.UpdateOptions{}); err != nil {
    65  		return err
    66  	}
    67  
    68  	return nil
    69  }
    70  
    71  // IsAPIAvailable return true if cluster operator API is present on the cluster.
    72  // Otherwise, exists is set to false.
    73  func (w *Writer) IsAPIAvailable() (exists bool, err error) {
    74  	opStatusGV := schema.GroupVersion{
    75  		Group:   "config.openshift.io",
    76  		Version: "v1",
    77  	}
    78  	err = discovery.ServerSupportsVersion(w.discovery, opStatusGV)
    79  	if err != nil {
    80  		return
    81  	}
    82  
    83  	exists = true
    84  	return
    85  }