Skip to content

Commit 1903e16

Browse files
committed
feat(operators): reconcile v1 operator resources
Enable the Operator API in v1 by default.
1 parent 617c53a commit 1903e16

File tree

14 files changed

+72
-223
lines changed

14 files changed

+72
-223
lines changed

cmd/olm/manager.go

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@ package main
22

33
import (
44
"context"
5-
"fmt"
65

7-
"github.com/operator-framework/api/crds"
8-
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1"
9-
apierrors "k8s.io/apimachinery/pkg/api/errors"
10-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
116
ctrl "sigs.k8s.io/controller-runtime"
127
"sigs.k8s.io/controller-runtime/pkg/log/zap"
138

@@ -30,14 +25,7 @@ func Manager(ctx context.Context) (ctrl.Manager, error) {
3025

3126
// Setup a new controller to reconcile Operators
3227
setupLog.Info("configuring controller")
33-
client, err := apiextensionsv1.NewForConfig(mgr.GetConfig())
34-
if err != nil {
35-
return nil, err
36-
}
37-
38-
if feature.Gate.Enabled(feature.OperatorLifecycleManagerV2) {
39-
setupLog.Info(fmt.Sprintf("feature enabled: %v", feature.OperatorLifecycleManagerV2))
40-
28+
if feature.Gate.Enabled(feature.OperatorLifecycleManagerV1) {
4129
operatorReconciler, err := operators.NewOperatorReconciler(
4230
mgr.GetClient(),
4331
ctrl.Log.WithName("controllers").WithName("operator"),
@@ -47,24 +35,6 @@ func Manager(ctx context.Context) (ctrl.Manager, error) {
4735
return nil, err
4836
}
4937

50-
crd, err := client.CustomResourceDefinitions().Create(ctx, crds.Operator(), metav1.CreateOptions{})
51-
if err != nil {
52-
if !apierrors.IsAlreadyExists(err) {
53-
return nil, err
54-
}
55-
56-
// Already exists, try to update
57-
if crd, err = client.CustomResourceDefinitions().Get(ctx, crds.Operator().GetName(), metav1.GetOptions{}); err != nil {
58-
return nil, err
59-
}
60-
61-
crd.Spec = crds.Operator().Spec
62-
if _, err = client.CustomResourceDefinitions().Update(ctx, crd, metav1.UpdateOptions{}); err != nil {
63-
return nil, err
64-
}
65-
}
66-
setupLog.Info("v2alpha1 CRDs installed")
67-
6838
if err = operatorReconciler.SetupWithManager(mgr); err != nil {
6939
return nil, err
7040
}

pkg/controller/operators/adoption_controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import (
2424
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2525
"sigs.k8s.io/controller-runtime/pkg/source"
2626

27+
operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
2728
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
28-
operatorsv2alpha1 "github.com/operator-framework/api/pkg/operators/v2alpha1"
2929
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators"
3030
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
3131
)
@@ -224,7 +224,7 @@ func (r *AdoptionReconciler) adoptComponents(ctx context.Context, csv *operators
224224

225225
var operators []decorators.Operator
226226
for _, name := range decorators.OperatorNames(csv.GetLabels()) {
227-
o := &operatorsv2alpha1.Operator{}
227+
o := &operatorsv1.Operator{}
228228
o.SetName(name.Name)
229229
operator, err := r.factory.NewOperator(o)
230230
if err != nil {

pkg/controller/operators/decorators/operator.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
"k8s.io/apimachinery/pkg/types"
1616
"k8s.io/client-go/tools/reference"
1717

18-
operatorsv2alpha1 "github.com/operator-framework/api/pkg/operators/v2alpha1"
18+
operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
1919
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/codec"
2020
)
2121

@@ -47,7 +47,7 @@ func OperatorNames(labels map[string]string) (names []types.NamespacedName) {
4747
type OperatorFactory interface {
4848
// NewOperator returns an Operator decorator that wraps the given external Operator representation.
4949
// An error is returned if the decorator cannon be instantiated.
50-
NewOperator(external *operatorsv2alpha1.Operator) (*Operator, error)
50+
NewOperator(external *operatorsv1.Operator) (*Operator, error)
5151

5252
// NewPackageOperator returns an Operator decorator for a package and install namespace.
5353
NewPackageOperator(pkg, namespace string) (*Operator, error)
@@ -58,7 +58,7 @@ type schemedOperatorFactory struct {
5858
scheme *runtime.Scheme
5959
}
6060

61-
func (s *schemedOperatorFactory) NewOperator(external *operatorsv2alpha1.Operator) (*Operator, error) {
61+
func (s *schemedOperatorFactory) NewOperator(external *operatorsv1.Operator) (*Operator, error) {
6262
if external == nil {
6363
return nil, fmt.Errorf(newOperatorError, "cannot create operator with nil external type")
6464
}
@@ -80,7 +80,7 @@ func (s *schemedOperatorFactory) NewPackageOperator(pkg, namespace string) (*Ope
8080
name = fmt.Sprintf("%s.%s", pkg, namespace)
8181
}
8282

83-
o := &operatorsv2alpha1.Operator{}
83+
o := &operatorsv1.Operator{}
8484
o.SetName(name)
8585

8686
return s.NewOperator(o)
@@ -99,7 +99,7 @@ func NewSchemedOperatorFactory(scheme *runtime.Scheme) (OperatorFactory, error)
9999

100100
// Operator decorates an external Operator and provides convenience methods for managing it.
101101
type Operator struct {
102-
*operatorsv2alpha1.Operator
102+
*operatorsv1.Operator
103103

104104
scheme *runtime.Scheme
105105
componentLabelKey string
@@ -188,7 +188,7 @@ func (o *Operator) ResetComponents() error {
188188
return err
189189
}
190190

191-
o.Status.Components = &operatorsv2alpha1.Components{
191+
o.Status.Components = &operatorsv1.Components{
192192
LabelSelector: labelSelector,
193193
}
194194

@@ -231,7 +231,7 @@ func (o *Operator) AddComponents(components ...runtime.Object) error {
231231
return err
232232
}
233233

234-
var refs []operatorsv2alpha1.RichReference
234+
var refs []operatorsv1.RichReference
235235
for _, obj := range components {
236236
// Unpack nested components
237237
if nested, err := meta.ExtractList(obj); err == nil {
@@ -318,12 +318,12 @@ func (c *Component) Matches(selector labels.Selector) (matches bool, err error)
318318
return
319319
}
320320

321-
func (c *Component) Reference() (ref *operatorsv2alpha1.RichReference, err error) {
321+
func (c *Component) Reference() (ref *operatorsv1.RichReference, err error) {
322322
truncated, err := c.truncatedReference()
323323
if err != nil {
324324
return
325325
}
326-
ref = &operatorsv2alpha1.RichReference{
326+
ref = &operatorsv1.RichReference{
327327
ObjectReference: truncated,
328328
}
329329

pkg/controller/operators/decorators/operator_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"k8s.io/apimachinery/pkg/types"
1111
k8sscheme "k8s.io/client-go/kubernetes/scheme"
1212

13-
operatorsv2alpha1 "github.com/operator-framework/api/pkg/operators/v2alpha1"
13+
operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
1414
)
1515

1616
func TestOperatorNames(t *testing.T) {
@@ -88,13 +88,13 @@ func TestAddComponents(t *testing.T) {
8888
require.NoError(t, k8sscheme.AddToScheme(scheme))
8989

9090
type fields struct {
91-
operator *operatorsv2alpha1.Operator
91+
operator *operatorsv1.Operator
9292
}
9393
type args struct {
9494
components []runtime.Object
9595
}
9696
type results struct {
97-
operator *operatorsv2alpha1.Operator
97+
operator *operatorsv1.Operator
9898
err error
9999
}
100100

@@ -107,8 +107,8 @@ func TestAddComponents(t *testing.T) {
107107
{
108108
description: "Empty/ComponentsAdded",
109109
fields: fields{
110-
operator: func() *operatorsv2alpha1.Operator {
111-
operator := &operatorsv2alpha1.Operator{}
110+
operator: func() *operatorsv1.Operator {
111+
operator := &operatorsv1.Operator{}
112112
operator.SetName("puffin")
113113

114114
return operator
@@ -144,10 +144,10 @@ func TestAddComponents(t *testing.T) {
144144
},
145145
},
146146
results: results{
147-
operator: func() *operatorsv2alpha1.Operator {
148-
operator := &operatorsv2alpha1.Operator{}
147+
operator: func() *operatorsv1.Operator {
148+
operator := &operatorsv1.Operator{}
149149
operator.SetName("puffin")
150-
operator.Status.Components = &operatorsv2alpha1.Components{
150+
operator.Status.Components = &operatorsv1.Components{
151151
LabelSelector: &metav1.LabelSelector{
152152
MatchExpressions: []metav1.LabelSelectorRequirement{
153153
{
@@ -157,7 +157,7 @@ func TestAddComponents(t *testing.T) {
157157
},
158158
},
159159
}
160-
operator.Status.Components.Refs = []operatorsv2alpha1.RichReference{
160+
operator.Status.Components.Refs = []operatorsv1.RichReference{
161161
{
162162
ObjectReference: &corev1.ObjectReference{
163163
APIVersion: "v1",
@@ -172,9 +172,9 @@ func TestAddComponents(t *testing.T) {
172172
Namespace: "atlantic",
173173
Name: "puffin",
174174
},
175-
Conditions: []operatorsv2alpha1.Condition{
175+
Conditions: []operatorsv1.Condition{
176176
{
177-
Type: operatorsv2alpha1.ConditionType(corev1.PodReady),
177+
Type: operatorsv1.ConditionType(corev1.PodReady),
178178
Status: corev1.ConditionTrue,
179179
},
180180
},

pkg/controller/operators/olm/config.go

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package olm
22

33
import (
4-
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/queueinformer"
54
"time"
65

6+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/queueinformer"
7+
78
"github.com/pkg/errors"
89
"github.com/sirupsen/logrus"
910
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011
utilclock "k8s.io/apimachinery/pkg/util/clock"
1112
"k8s.io/client-go/rest"
1213

1314
configv1client "github.com/openshift/client-go/config/clientset/versioned"
14-
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/internalversion"
1515
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
1616
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
1717
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver"
@@ -29,7 +29,6 @@ type operatorConfig struct {
2929
logger *logrus.Logger
3030
operatorClient operatorclient.ClientInterface
3131
externalClient versioned.Interface
32-
internalClient internalversion.Interface
3332
strategyResolver install.StrategyResolverInterface
3433
apiReconciler resolver.APIIntersectionReconciler
3534
apiLabeler labeler.Labeler
@@ -64,8 +63,6 @@ func (o *operatorConfig) validate() (err error) {
6463
err = newInvalidConfigError("operator client", "must not be nil")
6564
case o.externalClient == nil:
6665
err = newInvalidConfigError("external client", "must not be nil")
67-
// case o.internalClient == nil:
68-
// err = newInvalidConfigError("internal client", "must not be nil")
6966
case o.strategyResolver == nil:
7067
err = newInvalidConfigError("strategy resolver", "must not be nil")
7168
case o.apiReconciler == nil:
@@ -134,12 +131,6 @@ func WithExternalClient(externalClient versioned.Interface) OperatorOption {
134131
}
135132
}
136133

137-
func WithInternalClient(internalClient internalversion.Interface) OperatorOption {
138-
return func(config *operatorConfig) {
139-
config.internalClient = internalClient
140-
}
141-
}
142-
143134
func WithStrategyResolver(strategyResolver install.StrategyResolverInterface) OperatorOption {
144135
return func(config *operatorConfig) {
145136
config.strategyResolver = strategyResolver

pkg/controller/operators/operator_controller.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323

2424
operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
2525
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
26-
operatorsv2alpha1 "github.com/operator-framework/api/pkg/operators/v2alpha1"
2726
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators"
2827
)
2928

@@ -34,7 +33,7 @@ var (
3433
apiregistrationv1.AddToScheme,
3534
operatorsv1alpha1.AddToScheme,
3635
operatorsv1.AddToScheme,
37-
operatorsv2alpha1.AddToScheme,
36+
operatorsv1.AddToScheme,
3837
)
3938

4039
// AddToScheme adds all types necessary for the controller to operate.
@@ -67,7 +66,7 @@ func (r *OperatorReconciler) SetupWithManager(mgr ctrl.Manager) error {
6766
// Note: If we want to support resources composed of custom resources, we need to figure out how
6867
// to dynamically add resource types to watch.
6968
return ctrl.NewControllerManagedBy(mgr).
70-
For(&operatorsv2alpha1.Operator{}).
69+
For(&operatorsv1.Operator{}).
7170
Watches(&source.Kind{Type: &appsv1.Deployment{}}, enqueueOperator).
7271
Watches(&source.Kind{Type: &corev1.Namespace{}}, enqueueOperator).
7372
Watches(&source.Kind{Type: &corev1.ServiceAccount{}}, enqueueOperator).
@@ -118,7 +117,7 @@ func (r *OperatorReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
118117

119118
// Fetch the Operator from the cache
120119
ctx := context.TODO()
121-
in := &operatorsv2alpha1.Operator{}
120+
in := &operatorsv1.Operator{}
122121
if err := r.Get(ctx, req.NamespacedName, in); err != nil {
123122
if apierrors.IsNotFound(err) {
124123
log.Info("Could not find Operator")
@@ -230,7 +229,7 @@ func (r *OperatorReconciler) mapComponentRequests(obj handler.MapObject) (reques
230229

231230
// Otherwise, best-effort generate a new operator
232231
// TODO(njhale): Implement verification that the operator-discovery admission webhook accepted this label (JWT or maybe sign a set of fields?)
233-
operator := &operatorsv2alpha1.Operator{}
232+
operator := &operatorsv1.Operator{}
234233
operator.SetName(name.Name)
235234
if err := r.Create(context.Background(), operator); err != nil && !apierrors.IsAlreadyExists(err) {
236235
r.log.Error(err, "couldn't generate operator", "operator", name, "component", obj.Meta.GetSelfLink())

pkg/controller/operators/operator_controller_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ import (
1111
"k8s.io/apimachinery/pkg/runtime"
1212
"k8s.io/apimachinery/pkg/types"
1313

14-
operatorsv2alpha1 "github.com/operator-framework/api/pkg/operators/v2alpha1"
14+
operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
1515
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators"
1616
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/testobj"
1717
)
1818

1919
var _ = Describe("Operator Controller", func() {
2020
var (
2121
ctx context.Context
22-
operator *operatorsv2alpha1.Operator
22+
operator *operatorsv1.Operator
2323
name types.NamespacedName
2424
expectedKey string
2525
expectedComponentLabelSelector *metav1.LabelSelector
@@ -49,7 +49,7 @@ var _ = Describe("Operator Controller", func() {
4949

5050
Describe("component selection", func() {
5151
BeforeEach(func() {
52-
Eventually(func() (*operatorsv2alpha1.Components, error) {
52+
Eventually(func() (*operatorsv1.Components, error) {
5353
err := k8sClient.Get(ctx, name, operator)
5454
return operator.Status.Components, err
5555
}, timeout, interval).ShouldNot(BeNil())
@@ -62,7 +62,7 @@ var _ = Describe("Operator Controller", func() {
6262

6363
Context("with no components bearing its label", func() {
6464
Specify("a status containing no component references", func() {
65-
Consistently(func() ([]operatorsv2alpha1.RichReference, error) {
65+
Consistently(func() ([]operatorsv1.RichReference, error) {
6666
err := k8sClient.Get(ctx, name, operator)
6767
return operator.Status.Components.Refs, err
6868
}, timeout, interval).Should(BeEmpty())
@@ -72,7 +72,7 @@ var _ = Describe("Operator Controller", func() {
7272
Context("with components bearing its label", func() {
7373
var (
7474
objs []runtime.Object
75-
expectedRefs []operatorsv2alpha1.RichReference
75+
expectedRefs []operatorsv1.RichReference
7676
namespace string
7777
)
7878

@@ -97,7 +97,7 @@ var _ = Describe("Operator Controller", func() {
9797
})
9898

9999
Specify("a status containing its component references", func() {
100-
Eventually(func() ([]operatorsv2alpha1.RichReference, error) {
100+
Eventually(func() ([]operatorsv1.RichReference, error) {
101101
err := k8sClient.Get(ctx, name, operator)
102102
return operator.Status.Components.Refs, err
103103
}, timeout, interval).Should(ConsistOf(expectedRefs))
@@ -133,7 +133,7 @@ var _ = Describe("Operator Controller", func() {
133133
})
134134

135135
It("should add the component references", func() {
136-
Eventually(func() ([]operatorsv2alpha1.RichReference, error) {
136+
Eventually(func() ([]operatorsv1.RichReference, error) {
137137
err := k8sClient.Get(ctx, name, operator)
138138
return operator.Status.Components.Refs, err
139139
}, timeout, interval).Should(ConsistOf(expectedRefs))
@@ -148,7 +148,7 @@ var _ = Describe("Operator Controller", func() {
148148
})
149149

150150
It("should remove the component references", func() {
151-
Eventually(func() ([]operatorsv2alpha1.RichReference, error) {
151+
Eventually(func() ([]operatorsv1.RichReference, error) {
152152
err := k8sClient.Get(ctx, name, operator)
153153
return operator.Status.Components.Refs, err
154154
}, timeout, interval).Should(BeEmpty())

0 commit comments

Comments
 (0)