Skip to content

Commit d7b2aff

Browse files
Merge pull request #1800 from openshift-cherrypick-robot/cherry-pick-1798-to-release-4.6
[release-4.6] Bug 1886223: remove extraneous manifests in installplan
2 parents 6f59080 + 8a6d7bd commit d7b2aff

File tree

3 files changed

+101
-14
lines changed

3 files changed

+101
-14
lines changed

pkg/controller/operators/catalog/operator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1582,7 +1582,7 @@ func (o *Operator) ExecutePlan(plan *v1alpha1.InstallPlan) error {
15821582

15831583
for i, step := range plan.Status.Plan {
15841584
doStep := true
1585-
s, err := b.create(step)
1585+
s, err := b.create(*step)
15861586
if err != nil {
15871587
if _, ok := err.(notSupportedStepperErr); ok {
15881588
// stepper not implemented for this type yet

pkg/controller/operators/catalog/step.go

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,11 @@ func (n notSupportedStepperErr) Error() string {
6464
}
6565

6666
// step is a factory that creates StepperFuncs based on the install plan step Kind.
67-
func (b *builder) create(step *v1alpha1.Step) (Stepper, error) {
68-
manifest, err := b.manifestResolver.ManifestForStep(step)
67+
func (b *builder) create(step v1alpha1.Step) (Stepper, error) {
68+
manifest, err := b.manifestResolver.ManifestForStep(&step)
6969
if err != nil {
7070
return nil, err
7171
}
72-
step.Resource.Manifest = manifest
7372

7473
switch step.Resource.Kind {
7574
case crdKind:
@@ -79,15 +78,15 @@ func (b *builder) create(step *v1alpha1.Step) (Stepper, error) {
7978
}
8079
switch version {
8180
case crdlib.V1Version:
82-
return b.NewCRDV1Step(b.opclient.ApiextensionsInterface().ApiextensionsV1(), step), nil
81+
return b.NewCRDV1Step(b.opclient.ApiextensionsInterface().ApiextensionsV1(), &step, manifest), nil
8382
case crdlib.V1Beta1Version:
84-
return b.NewCRDV1Beta1Step(b.opclient.ApiextensionsInterface().ApiextensionsV1beta1(), step), nil
83+
return b.NewCRDV1Beta1Step(b.opclient.ApiextensionsInterface().ApiextensionsV1beta1(), &step, manifest), nil
8584
}
8685
}
8786
return nil, notSupportedStepperErr{fmt.Sprintf("stepper interface does not support %s", step.Resource.Kind)}
8887
}
8988

90-
func (b *builder) NewCRDV1Step(client apiextensionsv1client.ApiextensionsV1Interface, step *v1alpha1.Step) StepperFunc {
89+
func (b *builder) NewCRDV1Step(client apiextensionsv1client.ApiextensionsV1Interface, step *v1alpha1.Step, manifest string) StepperFunc {
9190
return func() (v1alpha1.StepStatus, error) {
9291
switch step.Status {
9392
case v1alpha1.StepStatusPresent:
@@ -120,16 +119,14 @@ func (b *builder) NewCRDV1Step(client apiextensionsv1client.ApiextensionsV1Inter
120119
return v1alpha1.StepStatusCreated, nil
121120
}
122121
case v1alpha1.StepStatusUnknown, v1alpha1.StepStatusNotPresent:
123-
crd, err := crdlib.UnmarshalV1(step.Resource.Manifest)
122+
crd, err := crdlib.UnmarshalV1(manifest)
124123
if err != nil {
125124
return v1alpha1.StepStatusUnknown, err
126125
}
127-
b.logger.Debugf("creating v1 CRD %#v", crd)
128126

129127
_, createError := client.CustomResourceDefinitions().Create(context.TODO(), crd, metav1.CreateOptions{})
130128
if k8serrors.IsAlreadyExists(createError) {
131129
currentCRD, _ := client.CustomResourceDefinitions().Get(context.TODO(), crd.GetName(), metav1.GetOptions{})
132-
b.logger.Debugf("\n current crd: %#v \n new crd: %#v \n", currentCRD, crd)
133130
// Verify CRD ownership, only attempt to update if
134131
// CRD has only one owner
135132
// Example: provided=database.coreos.com/v1alpha1/EtcdCluster
@@ -177,7 +174,7 @@ func (b *builder) NewCRDV1Step(client apiextensionsv1client.ApiextensionsV1Inter
177174
}
178175
}
179176

180-
func (b *builder) NewCRDV1Beta1Step(client apiextensionsv1beta1client.ApiextensionsV1beta1Interface, step *v1alpha1.Step) StepperFunc {
177+
func (b *builder) NewCRDV1Beta1Step(client apiextensionsv1beta1client.ApiextensionsV1beta1Interface, step *v1alpha1.Step, manifest string) StepperFunc {
181178
return func() (v1alpha1.StepStatus, error) {
182179
switch step.Status {
183180
case v1alpha1.StepStatusPresent:
@@ -210,16 +207,14 @@ func (b *builder) NewCRDV1Beta1Step(client apiextensionsv1beta1client.Apiextensi
210207
return v1alpha1.StepStatusCreated, nil
211208
}
212209
case v1alpha1.StepStatusUnknown, v1alpha1.StepStatusNotPresent:
213-
crd, err := crdlib.UnmarshalV1Beta1(step.Resource.Manifest)
210+
crd, err := crdlib.UnmarshalV1Beta1(manifest)
214211
if err != nil {
215212
return v1alpha1.StepStatusUnknown, err
216213
}
217-
b.logger.Debugf("creating v1beta1 CRD %#v", crd)
218214

219215
_, createError := client.CustomResourceDefinitions().Create(context.TODO(), crd, metav1.CreateOptions{})
220216
if k8serrors.IsAlreadyExists(createError) {
221217
currentCRD, _ := client.CustomResourceDefinitions().Get(context.TODO(), crd.GetName(), metav1.GetOptions{})
222-
b.logger.Debugf("\n current crd: %#v \n new crd: %#v \n", currentCRD, crd)
223218
// Verify CRD ownership, only attempt to update if
224219
// CRD has only one owner
225220
// Example: provided=database.coreos.com/v1alpha1/EtcdCluster

test/e2e/installplan_e2e_test.go

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,21 @@ package e2e
22

33
import (
44
"context"
5+
"encoding/json"
56
"errors"
67
"fmt"
78
"strings"
89
"sync"
910
"time"
1011

12+
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog"
13+
1114
"github.com/operator-framework/operator-lifecycle-manager/test/e2e/ctx"
1215

1316
"github.com/blang/semver"
1417
. "github.com/onsi/ginkgo"
1518
"github.com/onsi/ginkgo/extensions/table"
19+
. "github.com/onsi/gomega"
1620
"github.com/stretchr/testify/assert"
1721
"github.com/stretchr/testify/require"
1822
appsv1 "k8s.io/api/apps/v1"
@@ -2623,6 +2627,94 @@ var _ = Describe("Install Plan", func() {
26232627
require.NoError(GinkgoT(), err)
26242628
log(fmt.Sprintf("Install plan %s fetched with status %s", fetchedInstallPlan.GetName(), fetchedInstallPlan.Status.Phase))
26252629
})
2630+
2631+
It("compresses installplan step resource manifests to configmap references", func() {
2632+
// Test ensures that all steps for index-based catalogs are references to configmaps. This avoids the problem
2633+
// of installplans growing beyond the etcd size limit when manifests are written to the ip status.
2634+
2635+
c := newKubeClient()
2636+
crc := newCRClient()
2637+
2638+
ns, err := c.KubernetesInterface().CoreV1().Namespaces().Create(context.TODO(), &corev1.Namespace{
2639+
ObjectMeta: metav1.ObjectMeta{
2640+
Name: genName("ns-"),
2641+
},
2642+
}, metav1.CreateOptions{})
2643+
Expect(err).ToNot(HaveOccurred())
2644+
2645+
og := &operatorsv1.OperatorGroup{}
2646+
og.SetName("og")
2647+
_, err = crc.OperatorsV1().OperatorGroups(ns.GetName()).Create(context.TODO(), og, metav1.CreateOptions{})
2648+
Expect(err).ToNot(HaveOccurred())
2649+
2650+
deleteOpts := &metav1.DeleteOptions{}
2651+
defer c.KubernetesInterface().CoreV1().Namespaces().Delete(context.TODO(), ns.GetName(), *deleteOpts)
2652+
2653+
catsrc := &operatorsv1alpha1.CatalogSource{
2654+
ObjectMeta: metav1.ObjectMeta{
2655+
Name: genName("kiali-"),
2656+
Namespace: ns.GetName(),
2657+
Labels: map[string]string{"olm.catalogSource": "kaili-catalog"},
2658+
},
2659+
Spec: operatorsv1alpha1.CatalogSourceSpec{
2660+
Image: "quay.io/olmtest/single-bundle-index:1.0.0",
2661+
SourceType: operatorsv1alpha1.SourceTypeGrpc,
2662+
},
2663+
}
2664+
catsrc, err = crc.OperatorsV1alpha1().CatalogSources(catsrc.GetNamespace()).Create(context.TODO(), catsrc, metav1.CreateOptions{})
2665+
Expect(err).ToNot(HaveOccurred())
2666+
2667+
// Wait for the CatalogSource to be ready
2668+
catsrc, err = fetchCatalogSourceOnStatus(crc, catsrc.GetName(), catsrc.GetNamespace(), catalogSourceRegistryPodSynced)
2669+
Expect(err).ToNot(HaveOccurred())
2670+
2671+
// Generate a Subscription
2672+
subName := genName("kiali-")
2673+
createSubscriptionForCatalog(crc, catsrc.GetNamespace(), subName, catsrc.GetName(), "kiali", stableChannel, "", operatorsv1alpha1.ApprovalAutomatic)
2674+
2675+
sub, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker)
2676+
Expect(err).ToNot(HaveOccurred())
2677+
2678+
// Wait for the expected InstallPlan's execution to either fail or succeed
2679+
ipName := sub.Status.InstallPlanRef.Name
2680+
ip, err := waitForInstallPlan(crc, ipName, sub.GetNamespace(), buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseFailed, operatorsv1alpha1.InstallPlanPhaseComplete))
2681+
Expect(err).ToNot(HaveOccurred())
2682+
Expect(operatorsv1alpha1.InstallPlanPhaseComplete).To(Equal(ip.Status.Phase), "InstallPlan not complete")
2683+
2684+
// Ensure the InstallPlan contains the steps resolved from the bundle image
2685+
operatorName := "kiali-operator"
2686+
expectedSteps := map[registry.ResourceKey]struct{}{
2687+
{Name: operatorName, Kind: "ClusterServiceVersion"}: {},
2688+
{Name: "kialis.kiali.io", Kind: "CustomResourceDefinition"}: {},
2689+
{Name: "monitoringdashboards.monitoring.kiali.io", Kind: "CustomResourceDefinition"}: {},
2690+
{Name: operatorName, Kind: "ServiceAccount"}: {},
2691+
{Name: operatorName, Kind: "ClusterRole"}: {},
2692+
{Name: operatorName, Kind: "ClusterRoleBinding"}: {},
2693+
}
2694+
Expect(ip.Status.Plan).To(HaveLen(len(expectedSteps)), "number of expected steps does not match installed: %v", ip.Status.Plan)
2695+
2696+
for _, step := range ip.Status.Plan {
2697+
key := registry.ResourceKey{
2698+
Name: step.Resource.Name,
2699+
Kind: step.Resource.Kind,
2700+
}
2701+
for expected := range expectedSteps {
2702+
if strings.HasPrefix(key.Name, expected.Name) && key.Kind == expected.Kind {
2703+
delete(expectedSteps, expected)
2704+
}
2705+
}
2706+
}
2707+
Expect(expectedSteps).To(HaveLen(0), "Actual resource steps do not match expected: %#v", expectedSteps)
2708+
2709+
// Ensure that all the steps have a configmap based reference
2710+
for _, step := range ip.Status.Plan {
2711+
manifest := step.Resource.Manifest
2712+
var ref catalog.UnpackedBundleReference
2713+
err := json.Unmarshal([]byte(manifest), &ref)
2714+
Expect(err).ToNot(HaveOccurred())
2715+
Expect(ref.Kind).To(Equal("ConfigMap"))
2716+
}
2717+
})
26262718
})
26272719

26282720
type checkInstallPlanFunc func(fip *operatorsv1alpha1.InstallPlan) bool

0 commit comments

Comments
 (0)