Skip to content

Commit 9564623

Browse files
committed
feat(init): add init container to olm operator that can clean previous
deployments CVO doesn't delete manifests during upgrades, so we need to clean up after older releases.
1 parent 81801f1 commit 9564623

10 files changed

+236
-23
lines changed

Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ LABEL io.openshift.release.operator=true
3232
COPY --from=builder /build/bin/olm /bin/olm
3333
COPY --from=builder /build/bin/catalog /bin/catalog
3434
COPY --from=builder /build/bin/package-server /bin/package-server
35+
COPY --from=builder /build/bin/init /bin/init
3536

3637
# This image doesn't need to run as root user.
3738
USER 1001

cmd/init/main.go

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"flag"
6+
"time"
7+
8+
log "github.com/sirupsen/logrus"
9+
"k8s.io/apimachinery/pkg/api/errors"
10+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/apimachinery/pkg/util/wait"
12+
13+
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client"
14+
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
15+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
16+
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/signals"
17+
)
18+
19+
var (
20+
kubeConfigPath = flag.String(
21+
"kubeconfig", "", "absolute path to the kubeconfig file")
22+
namespace = flag.String(
23+
"namespace", "", "namespace where init runs")
24+
crc versioned.Interface
25+
c operatorclient.ClientInterface
26+
)
27+
28+
const (
29+
pollInterval = 1 * time.Second
30+
pollDuration = 5 * time.Minute
31+
)
32+
33+
type checkResourceFunc func() error
34+
type deleteResourceFunc func() error
35+
36+
func main() {
37+
// Get exit signal context
38+
ctx, cancel := context.WithCancel(signals.Context())
39+
defer cancel()
40+
41+
logger := log.New()
42+
43+
// Parse the command-line flags.
44+
flag.Parse()
45+
46+
c = operatorclient.NewClientFromConfig(*kubeConfigPath, logger)
47+
48+
if client, err := client.NewClient(*kubeConfigPath); err != nil {
49+
logger.WithError(err).Fatalf("error configuring client")
50+
} else {
51+
crc = client
52+
}
53+
54+
if err := waitForDelete(checkCatalogSource("olm-operators"), deleteCatalogSource("olm-operators")); err != nil {
55+
log.WithError(err).Fatal("couldn't clean previous release")
56+
}
57+
58+
if err := waitForDelete(checkConfigMap("olm-operators"), deleteConfigMap("olm-operators")); err != nil {
59+
log.WithError(err).Fatal("couldn't clean previous release")
60+
}
61+
62+
if err := waitForDelete(checkSubscription("packageserver"), deleteSubscription("packageserver")); err != nil {
63+
log.WithError(err).Fatal("couldn't clean previous release")
64+
}
65+
66+
if err := waitForDelete(checkClusterServiceVersion("packageserver.v0.10.0"), deleteClusterServiceVersion("packageserver.v0.10.0")); err != nil {
67+
log.WithError(err).Fatal("couldn't clean previous release")
68+
}
69+
70+
if err := waitForDelete(checkClusterServiceVersion("packageserver.v0.9.0"), deleteClusterServiceVersion("packageserver.v0.9.0")); err != nil {
71+
log.WithError(err).Fatal("couldn't clean previous release")
72+
}
73+
74+
ctx.Done()
75+
}
76+
77+
func checkClusterServiceVersion(name string) checkResourceFunc {
78+
return func() error {
79+
_, err := crc.OperatorsV1alpha1().ClusterServiceVersions(*namespace).Get(name, metav1.GetOptions{})
80+
return err
81+
}
82+
}
83+
84+
func deleteClusterServiceVersion(name string) deleteResourceFunc {
85+
return func() error {
86+
return crc.OperatorsV1alpha1().ClusterServiceVersions(*namespace).Delete(name, metav1.NewDeleteOptions(0))
87+
}
88+
}
89+
90+
func checkSubscription(name string) checkResourceFunc {
91+
return func() error {
92+
_, err := crc.OperatorsV1alpha1().Subscriptions(*namespace).Get(name, metav1.GetOptions{})
93+
return err
94+
}
95+
}
96+
97+
func deleteSubscription(name string) deleteResourceFunc {
98+
return func() error {
99+
return crc.OperatorsV1alpha1().Subscriptions(*namespace).Delete(name, metav1.NewDeleteOptions(0))
100+
}
101+
}
102+
103+
func checkConfigMap(name string) checkResourceFunc {
104+
return func() error {
105+
_, err := c.KubernetesInterface().CoreV1().ConfigMaps(*namespace).Get(name, metav1.GetOptions{})
106+
return err
107+
}
108+
}
109+
110+
func deleteConfigMap(name string) deleteResourceFunc {
111+
return func() error {
112+
return c.KubernetesInterface().CoreV1().ConfigMaps(*namespace).Delete(name, metav1.NewDeleteOptions(0))
113+
}
114+
}
115+
116+
func checkCatalogSource(name string) checkResourceFunc {
117+
return func() error {
118+
_, err := crc.OperatorsV1alpha1().CatalogSources(*namespace).Get(name, metav1.GetOptions{})
119+
return err
120+
}
121+
}
122+
123+
func deleteCatalogSource(name string) deleteResourceFunc {
124+
return func() error {
125+
return crc.OperatorsV1alpha1().CatalogSources(*namespace).Delete(name, metav1.NewDeleteOptions(0))
126+
}
127+
}
128+
129+
func waitForDelete(checkResource checkResourceFunc, deleteResource deleteResourceFunc) error {
130+
if err := checkResource(); err != nil && errors.IsNotFound(err) {
131+
return nil
132+
}
133+
if err := deleteResource(); err != nil {
134+
return err
135+
}
136+
var err error
137+
err = wait.Poll(pollInterval, pollDuration, func() (bool, error) {
138+
err := checkResource()
139+
if errors.IsNotFound(err) {
140+
return true, nil
141+
}
142+
if err != nil {
143+
return false, err
144+
}
145+
return false, nil
146+
})
147+
148+
return err
149+
}

cmd/olm/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ func main() {
176176
olm.WithRestConfig(config),
177177
)
178178
if err != nil {
179-
log.Fatalf("error configuring operator: %s", err.Error())
179+
log.WithError(err).Fatalf("error configuring operator")
180+
return
180181
}
181182

182183
op.Run(ctx)

deploy/chart/templates/0000_50_olm_07-olm-operator.deployment.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,20 @@ spec:
2121
{{- if and .Values.installType (eq .Values.installType "ocp") }}
2222
priorityClassName: "system-cluster-critical"
2323
{{- end }}
24+
initContainers:
25+
- name: init
26+
command:
27+
- /bin/init
28+
- -namespace
29+
- ${NAMESPACE}
30+
image: {{ .Values.olm.image.ref }}
31+
imagePullPolicy: {{ .Values.olm.image.pullPolicy }}
32+
terminationMessagePolicy: FallbackToLogsOnError
33+
env:
34+
- name: NAMESPACE
35+
valueFrom:
36+
fieldRef:
37+
fieldPath: metadata.namespace
2438
containers:
2539
- name: olm-operator
2640
command:

deploy/chart/templates/_packageserver.clusterserviceversion.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
apiVersion: operators.coreos.com/v1alpha1
33
kind: ClusterServiceVersion
44
metadata:
5-
name: packageserver.v{{ .Chart.Version }}
5+
name: packageserver
66
namespace: {{ .Values.namespace }}
77
labels:
8+
olm.version: {{ .Chart.Version }}
89
{{- if .Values.writePackageServerStatusName }}
910
olm.clusteroperator.name: {{ .Values.writePackageServerStatusName }}
1011
{{- end }}

e2e.Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ WORKDIR /
2121
COPY --from=builder /go/src/github.com/operator-framework/operator-lifecycle-manager/bin/olm /bin/olm
2222
COPY --from=builder /go/src/github.com/operator-framework/operator-lifecycle-manager/bin/catalog /bin/catalog
2323
COPY --from=builder /go/src/github.com/operator-framework/operator-lifecycle-manager/bin/package-server /bin/package-server
24+
COPY --from=builder /go/src/github.com/operator-framework/operator-lifecycle-manager/build/bin/init /bin/init
2425
EXPOSE 8080
2526
EXPOSE 5443
2627
CMD ["/bin/olm"]

local.Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ WORKDIR /
33
COPY olm /bin/olm
44
COPY catalog /bin/catalog
55
COPY package-server /bin/package-server
6+
COPY init /bin/init
67
EXPOSE 8080
78
EXPOSE 5443
89
CMD ["/bin/olm"]

manifests/0000_50_olm_07-olm-operator.deployment.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,20 @@ spec:
1919
spec:
2020
serviceAccountName: olm-operator-serviceaccount
2121
priorityClassName: "system-cluster-critical"
22+
initContainers:
23+
- name: init
24+
command:
25+
- /bin/init
26+
- -namespace
27+
- ${NAMESPACE}
28+
image: quay.io/operator-framework/olm@sha256:f965474776bada158e4bf7be5c84b54460843e7478f06060990d2fdeb31b0b90
29+
imagePullPolicy: IfNotPresent
30+
terminationMessagePolicy: FallbackToLogsOnError
31+
env:
32+
- name: NAMESPACE
33+
valueFrom:
34+
fieldRef:
35+
fieldPath: metadata.namespace
2236
containers:
2337
- name: olm-operator
2438
command:

manifests/0000_50_olm_15-packageserver.clusterserviceversion.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
apiVersion: operators.coreos.com/v1alpha1
22
kind: ClusterServiceVersion
33
metadata:
4-
name: packageserver.v0.10.1
4+
name: packageserver
55
namespace: openshift-operator-lifecycle-manager
66
labels:
7+
olm.version: 0.10.1
78
olm.clusteroperator.name: operator-lifecycle-manager-packageserver
89
spec:
910
displayName: Package Server

0 commit comments

Comments
 (0)