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 }