Skip to content

Commit 836d963

Browse files
Merge pull request #792 from ecordell/fix-deploy-annotation
fix(annotation): don't annotate deployments that aren't owned by a CSV
2 parents 1a0c1dd + 94fd8fb commit 836d963

File tree

2 files changed

+84
-38
lines changed

2 files changed

+84
-38
lines changed

pkg/controller/operators/olm/operator.go

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88

99
v1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1"
1010
"github.com/sirupsen/logrus"
11-
appsv1 "k8s.io/api/apps/v1"
1211
corev1 "k8s.io/api/core/v1"
1312
extinf "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions"
1413
k8serrors "k8s.io/apimachinery/pkg/api/errors"
@@ -1423,22 +1422,14 @@ func (a *Operator) ensureDeploymentAnnotations(logger *logrus.Entry, csv *v1alph
14231422
return nil
14241423
}
14251424

1426-
var depNames []string
1427-
for _, dep := range strategyDetailsDeployment.DeploymentSpecs {
1428-
depNames = append(depNames, dep.Name)
1429-
}
1430-
existingDeployments, err := a.lister.AppsV1().DeploymentLister().Deployments(csv.GetNamespace()).List(labels.Everything())
1425+
existingDeployments, err := a.lister.AppsV1().DeploymentLister().Deployments(csv.GetNamespace()).List(ownerutil.CSVOwnerSelector(csv))
14311426
if err != nil {
14321427
return err
14331428
}
14341429

14351430
// compare deployments to see if any need to be created/updated
1436-
existingMap := map[string]*appsv1.Deployment{}
1437-
for _, d := range existingDeployments {
1438-
existingMap[d.GetName()] = d
1439-
}
14401431
updateErrs := []error{}
1441-
for _, dep := range existingMap {
1432+
for _, dep := range existingDeployments {
14421433
if dep.Spec.Template.Annotations == nil {
14431434
dep.Spec.Template.Annotations = map[string]string{}
14441435
}

pkg/controller/operators/olm/operator_test.go

Lines changed: 82 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"fmt"
1111
"math"
1212
"math/big"
13+
"reflect"
1314
"sort"
1415
"strings"
1516
"testing"
@@ -28,6 +29,7 @@ import (
2829
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2930
"k8s.io/apimachinery/pkg/labels"
3031
"k8s.io/apimachinery/pkg/runtime"
32+
"k8s.io/apimachinery/pkg/util/diff"
3133
utilerrors "k8s.io/apimachinery/pkg/util/errors"
3234
"k8s.io/apimachinery/pkg/util/intstr"
3335
"k8s.io/client-go/informers"
@@ -39,8 +41,7 @@ import (
3941
apiregistrationfake "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/fake"
4042
kagg "k8s.io/kube-aggregator/pkg/client/informers/externalversions"
4143

42-
"github.com/operator-framework/operator-lifecycle-manager/pkg/metrics"
43-
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1"
44+
v1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1"
4445
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/apis/operators/v1alpha1"
4546
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
4647
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned/fake"
@@ -56,6 +57,7 @@ import (
5657
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister"
5758
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil"
5859
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/queueinformer"
60+
"github.com/operator-framework/operator-lifecycle-manager/pkg/metrics"
5961
)
6062

6163
// Fakes
@@ -796,6 +798,7 @@ func TestTransitionCSV(t *testing.T) {
796798
}
797799
type expected struct {
798800
csvStates map[string]csvState
801+
objs []runtime.Object
799802
err map[string]error
800803
}
801804
tests := []struct {
@@ -2174,7 +2177,7 @@ func TestTransitionCSV(t *testing.T) {
21742177
},
21752178
},
21762179
{
2177-
name: "SingleCSVInstallingToSucceeded",
2180+
name: "SingleCSVInstallingToSucceeded/UnmanagedDeploymentNotAffected",
21782181
initial: initial{
21792182
csvs: []runtime.Object{
21802183
csvWithAnnotations(csv("csv1",
@@ -2193,12 +2196,55 @@ func TestTransitionCSV(t *testing.T) {
21932196
},
21942197
objs: []runtime.Object{
21952198
deployment("csv1-dep1", namespace, "sa", defaultTemplateAnnotations),
2199+
deployment("extra-dep", namespace, "sa", nil),
21962200
},
21972201
},
21982202
expected: expected{
21992203
csvStates: map[string]csvState{
22002204
"csv1": {exists: true, phase: v1alpha1.CSVPhaseSucceeded},
22012205
},
2206+
objs: []runtime.Object{
2207+
deployment("extra-dep", namespace, "sa", nil),
2208+
},
2209+
},
2210+
},
2211+
{
2212+
name: "SingleCSVSucceededToSucceeded/UnmanagedDeploymentInNamespace",
2213+
initial: initial{
2214+
csvs: []runtime.Object{
2215+
withConditionReason(csvWithAnnotations(csv("csv1",
2216+
namespace,
2217+
"0.0.0",
2218+
"",
2219+
installStrategy("csv1-dep1", nil, nil),
2220+
[]*v1beta1.CustomResourceDefinition{crd("c1", "v1", "g1")},
2221+
[]*v1beta1.CustomResourceDefinition{},
2222+
v1alpha1.CSVPhaseSucceeded,
2223+
), defaultTemplateAnnotations), v1alpha1.CSVReasonInstallSuccessful),
2224+
},
2225+
clientObjs: []runtime.Object{defaultOperatorGroup},
2226+
crds: []runtime.Object{
2227+
crd("c1", "v1", "g1"),
2228+
},
2229+
objs: []runtime.Object{
2230+
withLabels(
2231+
deployment("csv1-dep1", namespace, "sa", defaultTemplateAnnotations),
2232+
map[string]string{
2233+
ownerutil.OwnerKey: "csv1",
2234+
ownerutil.OwnerNamespaceKey: namespace,
2235+
ownerutil.OwnerKind: "ClusterServiceVersion",
2236+
},
2237+
),
2238+
deployment("extra-dep", namespace, "sa", nil),
2239+
},
2240+
},
2241+
expected: expected{
2242+
csvStates: map[string]csvState{
2243+
"csv1": {exists: true, phase: v1alpha1.CSVPhaseSucceeded},
2244+
},
2245+
objs: []runtime.Object{
2246+
deployment("extra-dep", namespace, "sa", nil),
2247+
},
22022248
},
22032249
},
22042250
{
@@ -2859,6 +2905,11 @@ func TestTransitionCSV(t *testing.T) {
28592905
}
28602906
}
28612907
}
2908+
2909+
// Verify other objects
2910+
if tt.expected.objs != nil {
2911+
RequireObjectsInNamespace(t, op.OpClient, op.client, namespace, tt.expected.objs)
2912+
}
28622913
})
28632914
}
28642915
}
@@ -3706,35 +3757,39 @@ func TestSyncOperatorGroups(t *testing.T) {
37063757
assert.Equal(t, tt.expectedStatus, operatorGroup.Status)
37073758

37083759
for namespace, objects := range tt.final.objects {
3709-
for _, object := range objects {
3710-
var err error
3711-
var fetched runtime.Object
3712-
switch o := object.(type) {
3713-
case *appsv1.Deployment:
3714-
fetched, err = op.OpClient.GetDeployment(namespace, o.GetName())
3715-
case *rbacv1.ClusterRole:
3716-
fetched, err = op.OpClient.GetClusterRole(o.GetName())
3717-
case *rbacv1.Role:
3718-
fetched, err = op.OpClient.GetRole(namespace, o.GetName())
3719-
case *rbacv1.ClusterRoleBinding:
3720-
fetched, err = op.OpClient.GetClusterRoleBinding(o.GetName())
3721-
case *rbacv1.RoleBinding:
3722-
fetched, err = op.OpClient.GetRoleBinding(namespace, o.GetName())
3723-
case *v1alpha1.ClusterServiceVersion:
3724-
fetched, err = op.client.OperatorsV1alpha1().ClusterServiceVersions(namespace).Get(o.GetName(), metav1.GetOptions{})
3725-
case *v1.OperatorGroup:
3726-
fetched, err = op.client.OperatorsV1().OperatorGroups(namespace).Get(o.GetName(), metav1.GetOptions{})
3727-
default:
3728-
require.Failf(t, "couldn't find expected object", "%#v", object)
3729-
}
3730-
require.NoError(t, err, "couldn't fetch %s %v", namespace, object)
3731-
require.Equal(t, object, fetched, "%s in %s not equal", object.GetObjectKind().GroupVersionKind().String(), namespace)
3732-
}
3760+
RequireObjectsInNamespace(t, op.OpClient, op.client, namespace, objects)
37333761
}
37343762
})
37353763
}
37363764
}
37373765

3766+
func RequireObjectsInNamespace(t *testing.T, opClient operatorclient.ClientInterface, client versioned.Interface, namespace string, objects []runtime.Object) {
3767+
for _, object := range objects {
3768+
var err error
3769+
var fetched runtime.Object
3770+
switch o := object.(type) {
3771+
case *appsv1.Deployment:
3772+
fetched, err = opClient.GetDeployment(namespace, o.GetName())
3773+
case *rbacv1.ClusterRole:
3774+
fetched, err = opClient.GetClusterRole(o.GetName())
3775+
case *rbacv1.Role:
3776+
fetched, err = opClient.GetRole(namespace, o.GetName())
3777+
case *rbacv1.ClusterRoleBinding:
3778+
fetched, err = opClient.GetClusterRoleBinding(o.GetName())
3779+
case *rbacv1.RoleBinding:
3780+
fetched, err = opClient.GetRoleBinding(namespace, o.GetName())
3781+
case *v1alpha1.ClusterServiceVersion:
3782+
fetched, err = client.OperatorsV1alpha1().ClusterServiceVersions(namespace).Get(o.GetName(), metav1.GetOptions{})
3783+
case *v1.OperatorGroup:
3784+
fetched, err = client.OperatorsV1().OperatorGroups(namespace).Get(o.GetName(), metav1.GetOptions{})
3785+
default:
3786+
require.Failf(t, "couldn't find expected object", "%#v", object)
3787+
}
3788+
require.NoError(t, err, "couldn't fetch %s %v", namespace, object)
3789+
require.True(t, reflect.DeepEqual(object, fetched), diff.ObjectDiff(object, fetched))
3790+
}
3791+
}
3792+
37383793
func TestIsReplacing(t *testing.T) {
37393794
logrus.SetLevel(logrus.DebugLevel)
37403795
namespace := "ns"

0 commit comments

Comments
 (0)