Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/cluster-olm-operator/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ func runOperator(ctx context.Context, cc *controllercmd.ControllerContext) error
currentOCPMinorVersion,
cl.KubeClient,
cl.ClusterExtensionClient,
cl.ClusterExtensionRevisionClient,
cl.ClusterObjectSetClient,
cl.OperatorClient,
currentFeatureGates,
cc.EventRecorder.ForComponent("OLMIncompatibleOperatorController"),
Expand Down
2 changes: 1 addition & 1 deletion manifests/0000_51_olm_02_operator_clusterrole.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ rules:
- olm.operatorframework.io
resources:
- clusterextensions
- clusterextensionrevisions
- clusterobjectsets
verbs:
- get
- list
Expand Down
76 changes: 38 additions & 38 deletions pkg/clients/clients.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,22 +54,22 @@ import (
const defaultResyncPeriod = 10 * time.Minute

type Clients struct {
KubeClient kubernetes.Interface
APIExtensionsClient apiextensionsclient.Interface
DynamicClient dynamic.Interface
RESTMapper meta.RESTMapper
OperatorClient *OperatorClient
OperatorInformers operatorinformers.SharedInformerFactory
ClusterExtensionClient *ClusterExtensionClient
ClusterExtensionRevisionClient *ClusterExtensionRevisionClient
ClusterCatalogClient *ClusterCatalogClient
ProxyClient *ProxyClient
ConfigClient configclient.Interface
KubeInformerFactory informers.SharedInformerFactory
ConfigInformerFactory configinformer.SharedInformerFactory
KubeInformersForNamespaces v1helpers.KubeInformersForNamespaces
FeatureGatesAccessor featuregates.FeatureGateAccess
FeatureGateMapper internalfeatures.MapperInterface
KubeClient kubernetes.Interface
APIExtensionsClient apiextensionsclient.Interface
DynamicClient dynamic.Interface
RESTMapper meta.RESTMapper
OperatorClient *OperatorClient
OperatorInformers operatorinformers.SharedInformerFactory
ClusterExtensionClient *ClusterExtensionClient
ClusterObjectSetClient *ClusterObjectSetClient
ClusterCatalogClient *ClusterCatalogClient
ProxyClient *ProxyClient
ConfigClient configclient.Interface
KubeInformerFactory informers.SharedInformerFactory
ConfigInformerFactory configinformer.SharedInformerFactory
KubeInformersForNamespaces v1helpers.KubeInformersForNamespaces
FeatureGatesAccessor featuregates.FeatureGateAccess
FeatureGateMapper internalfeatures.MapperInterface
}

func New(cc *controllercmd.ControllerContext) (*Clients, error) {
Expand Down Expand Up @@ -118,21 +118,21 @@ func New(cc *controllercmd.ControllerContext) (*Clients, error) {
configInformerFactory := configinformer.NewSharedInformerFactory(configClient, defaultResyncPeriod)

return &Clients{
KubeClient: kubeClient,
APIExtensionsClient: apiExtensionsClient,
DynamicClient: dynClient,
RESTMapper: rm,
OperatorClient: opClient,
OperatorInformers: operatorInformersFactory,
ClusterExtensionClient: NewClusterExtensionClient(dynClient),
ClusterCatalogClient: NewClusterCatalogClient(dynClient),
ClusterExtensionRevisionClient: NewClusterExtensionRevisionClient(dynClient),
ProxyClient: NewProxyClient(configInformerFactory),
ConfigClient: configClient,
KubeInformerFactory: informers.NewSharedInformerFactory(kubeClient, defaultResyncPeriod),
ConfigInformerFactory: configInformerFactory,
FeatureGatesAccessor: setupFeatureGatesAccessor(kubeClient, configInformerFactory, cc.OperatorNamespace),
FeatureGateMapper: internalfeatures.NewMapper(),
KubeClient: kubeClient,
APIExtensionsClient: apiExtensionsClient,
DynamicClient: dynClient,
RESTMapper: rm,
OperatorClient: opClient,
OperatorInformers: operatorInformersFactory,
ClusterExtensionClient: NewClusterExtensionClient(dynClient),
ClusterCatalogClient: NewClusterCatalogClient(dynClient),
ClusterObjectSetClient: NewClusterObjectSetClient(dynClient),
ProxyClient: NewProxyClient(configInformerFactory),
ConfigClient: configClient,
KubeInformerFactory: informers.NewSharedInformerFactory(kubeClient, defaultResyncPeriod),
ConfigInformerFactory: configInformerFactory,
FeatureGatesAccessor: setupFeatureGatesAccessor(kubeClient, configInformerFactory, cc.OperatorNamespace),
FeatureGateMapper: internalfeatures.NewMapper(),
}, nil
}

Expand All @@ -142,7 +142,7 @@ func (c *Clients) StartInformers(ctx context.Context) {
c.ConfigInformerFactory.Start(ctx.Done())
c.OperatorInformers.Start(ctx.Done())
c.ClusterExtensionClient.factory.Start(ctx.Done())
c.ClusterExtensionRevisionClient.factory.Start(ctx.Done())
c.ClusterObjectSetClient.factory.Start(ctx.Done())
c.ClusterCatalogClient.factory.Start(ctx.Done())
c.ProxyClient.factory.Start(ctx.Done())
if c.KubeInformersForNamespaces != nil {
Expand Down Expand Up @@ -218,21 +218,21 @@ func NewClusterExtensionClient(dynClient dynamic.Interface) *ClusterExtensionCli
}
}

type ClusterExtensionRevisionClient struct {
type ClusterObjectSetClient struct {
factory dynamicinformer.DynamicSharedInformerFactory
informer informers.GenericInformer
}

func (c ClusterExtensionRevisionClient) Informer() informers.GenericInformer {
func (c ClusterObjectSetClient) Informer() informers.GenericInformer {
return c.informer
}

func NewClusterExtensionRevisionClient(dynClient dynamic.Interface) *ClusterExtensionRevisionClient {
func NewClusterObjectSetClient(dynClient dynamic.Interface) *ClusterObjectSetClient {
infFact := dynamicinformer.NewDynamicSharedInformerFactory(dynClient, defaultResyncPeriod)
clusterExtensionRevisionGVR := ocv1.GroupVersion.WithResource("clusterextensionrevisions")
inf := infFact.ForResource(clusterExtensionRevisionGVR)
clusterObjectSetGVR := ocv1.GroupVersion.WithResource("clusterobjectsets")
inf := infFact.ForResource(clusterObjectSetGVR)

return &ClusterExtensionRevisionClient{
return &ClusterObjectSetClient{
factory: infFact,
informer: inf,
}
Expand Down
80 changes: 40 additions & 40 deletions pkg/controller/incompatible_operator_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,35 +48,35 @@ const (
)

type incompatibleOperatorController struct {
name string
currentOCPMinorVersion *semver.Version
kubeclient kubernetes.Interface
clusterExtensionClient *clients.ClusterExtensionClient
clusterExtensionRevisionClient *clients.ClusterExtensionRevisionClient
operatorClient v1helpers.OperatorClient
featureGate featuregates.FeatureGate
logger logr.Logger
name string
currentOCPMinorVersion *semver.Version
kubeclient kubernetes.Interface
clusterExtensionClient *clients.ClusterExtensionClient
clusterObjectSetClient *clients.ClusterObjectSetClient
operatorClient v1helpers.OperatorClient
featureGate featuregates.FeatureGate
logger logr.Logger
}

func NewIncompatibleOperatorController(
name string,
currentOCPMinorVersion *semver.Version,
kubeclient kubernetes.Interface,
clusterExtensionClient *clients.ClusterExtensionClient,
clusterExtensionRevisionClient *clients.ClusterExtensionRevisionClient,
clusterObjectSetClient *clients.ClusterObjectSetClient,
operatorClient v1helpers.OperatorClient,
featureGate featuregates.FeatureGate,
eventRecorder events.Recorder,
) factory.Controller {
c := &incompatibleOperatorController{
name: name,
currentOCPMinorVersion: currentOCPMinorVersion,
kubeclient: kubeclient,
clusterExtensionClient: clusterExtensionClient,
clusterExtensionRevisionClient: clusterExtensionRevisionClient,
operatorClient: operatorClient,
featureGate: featureGate,
logger: klog.NewKlogr().WithName(name),
name: name,
currentOCPMinorVersion: currentOCPMinorVersion,
kubeclient: kubeclient,
clusterExtensionClient: clusterExtensionClient,
clusterObjectSetClient: clusterObjectSetClient,
operatorClient: operatorClient,
featureGate: featureGate,
logger: klog.NewKlogr().WithName(name),
}

return factory.New().WithSync(c.sync).WithSyncDegradedOnError(operatorClient).WithInformers(operatorClient.Informer(), clusterExtensionClient.Informer().Informer()).ToController(name, eventRecorder)
Expand Down Expand Up @@ -128,7 +128,7 @@ func (c *incompatibleOperatorController) sync(ctx context.Context, _ factory.Syn

func (c *incompatibleOperatorController) getIncompatibleOperators() ([]string, error) {
if c.isBoxCutterRuntimeEnabled() {
return c.getIncompatibleOperatorsFromExtensionRevision()
return c.getIncompatibleOperatorsFromObjectSet()
}
return c.getIncompatibleOperatorsFromHelmRelease()
}
Expand Down Expand Up @@ -195,7 +195,7 @@ func (c *incompatibleOperatorController) getIncompatibleOperatorsFromHelmRelease
return incompatibleOperators, errors.Join(errs...)
}

func (c *incompatibleOperatorController) getIncompatibleOperatorsFromExtensionRevision() ([]string, error) {
func (c *incompatibleOperatorController) getIncompatibleOperatorsFromObjectSet() ([]string, error) {
var incompatibleOperators []string

ceList, err := c.clusterExtensionClient.Informer().Lister().List(labels.NewSelector())
Expand All @@ -215,39 +215,39 @@ func (c *incompatibleOperatorController) getIncompatibleOperatorsFromExtensionRe
name := metaObj.GetName()
logger := c.logger.WithValues("clusterextension", name)

// Get extension revisions
// Get ClusterObjectSets owned by the extension
selector, err := labels.Parse(fmt.Sprintf("%s=%s,%s=%s", ownerKindKey, ocv1.ClusterExtensionKind, ownerNameKey, name))
if err != nil {
errs = append(errs, fmt.Errorf("error parsing label selector for cluster extension revision %s: %v", name, err))
errs = append(errs, fmt.Errorf("error parsing label selector for cluster object set %s: %v", name, err))
continue
}
cerList, err := c.clusterExtensionRevisionClient.Informer().Lister().List(selector)
cosList, err := c.clusterObjectSetClient.Informer().Lister().List(selector)
if err != nil {
errs = append(errs, fmt.Errorf("error listing cluster extension revision %s: %v", name, err))
errs = append(errs, fmt.Errorf("error listing cluster object set %s: %v", name, err))
continue
}

// Get most recent active revision
cer, err := getLatestRevision(cerList)
// Get most recent active object set
cos, err := getLatestObjectSet(cosList)
if err != nil {
errs = append(errs, err)
continue
}
if cer == nil {
logger.Info("No active revisions found for cluster extension")
if cos == nil {
logger.Info("No active object sets found for cluster extension")
continue
}

cerAnns := cer.GetAnnotations()
cosAnns := cos.GetAnnotations()

if _, ok := cerAnns[olmPropertiesKey]; !ok {
if _, ok := cosAnns[olmPropertiesKey]; !ok {
logger.V(1).Info("Bundle has no olm properties")
continue
}

bundleName := cerAnns[bundleNameKey]
bundleName := cosAnns[bundleNameKey]
logger = logger.WithValues("bundleName", bundleName)
props, err := propertyListFromPropertiesAnnotation(cerAnns[olmPropertiesKey])
props, err := propertyListFromPropertiesAnnotation(cosAnns[olmPropertiesKey])
if err != nil {
err = fmt.Errorf("could not convert olm.properties: %v", err)
errs = append(errs, fmt.Errorf("error with cluster extension %s: error in bundle %s: %v", name, bundleName, err))
Expand Down Expand Up @@ -314,16 +314,16 @@ func (c *incompatibleOperatorController) checkIncompatibility(logger logr.Logger
return isIncompatible, errs
}

func getLatestRevision(cerList []runtime.Object) (metav1.Object, error) {
var cer metav1.Object
func getLatestObjectSet(objList []runtime.Object) (metav1.Object, error) {
var selected metav1.Object
var maxRev int64
for _, runtimeObj := range cerList {
for _, runtimeObj := range objList {
obj, ok := runtimeObj.(*unstructured.Unstructured)
if !ok {
return nil, fmt.Errorf("metav1.Object type assertion failed for object %v", runtimeObj)
}

// avoiding using ClusterExtensionRevision directly in case there are breaking changes in the serialization
// avoiding using ClusterObjectSet directly in case there are breaking changes in the serialization
// of fields that we don't care about here as we iterate while in technical preview.
// This helps avoid deadlocks where changes coming from the upstream break the OTE tests because
// cluster-olm-operator is suffering from deserialization errors. These issues are not completely avoidable,
Expand All @@ -336,20 +336,20 @@ func getLatestRevision(cerList []runtime.Object) (metav1.Object, error) {
}{}

if err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, shortRev); err != nil {
return nil, fmt.Errorf("error converting revision object: %w", err)
return nil, fmt.Errorf("error converting object set: %w", err)
}

if shortRev.Spec.LifecycleState != revisionStateActive {
continue
}

// Take latest active revision
if cer == nil || shortRev.Spec.Revision > maxRev {
// Take latest active object set (highest spec.revision)
if selected == nil || shortRev.Spec.Revision > maxRev {
maxRev = shortRev.Spec.Revision
cer = obj
selected = obj
}
}
return cer, nil
return selected, nil
}

func propertyListFromPropertiesAnnotation(raw string) ([]property.Property, error) {
Expand Down
Loading