Skip to content

Commit f474ec8

Browse files
Merge pull request #652 from jpeeler/operator-status-2
Write cluster operator status after successful startup (attempt #2)
2 parents 88ecace + 1a5ed12 commit f474ec8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+11461
-21
lines changed

Documentation/install/local-values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
rbacApiVersion: rbac.authorization.k8s.io
22
namespace: local
3+
writeStatusName: '""'
34
catalog_namespace: local
45
operator_namespace: local-operators
56
debug: true

cmd/olm/main.go

Lines changed: 109 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,27 @@ import (
1111
"github.com/prometheus/client_golang/prometheus/promhttp"
1212
log "github.com/sirupsen/logrus"
1313
v1 "k8s.io/api/core/v1"
14-
14+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
15+
"k8s.io/apimachinery/pkg/api/meta"
16+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
17+
18+
configv1 "github.com/openshift/api/config/v1"
19+
configv1client "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
20+
clusteroperatorv1helpers "github.com/openshift/library-go/pkg/config/clusteroperator/v1helpers"
21+
operatorv1helpers "github.com/openshift/library-go/pkg/operator/v1helpers"
1522
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client"
1623
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
1724
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm"
1825
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient"
1926
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/signals"
2027
"github.com/operator-framework/operator-lifecycle-manager/pkg/metrics"
2128
olmversion "github.com/operator-framework/operator-lifecycle-manager/pkg/version"
29+
"k8s.io/client-go/tools/clientcmd"
2230
)
2331

2432
const (
2533
defaultWakeupInterval = 5 * time.Minute
34+
defaultOperatorName = "operator-lifecycle-manager"
2635
)
2736

2837
// config flags defined globally so that they appear on the test binary as well
@@ -38,6 +47,9 @@ var (
3847
"If not set, or set to the empty string (e.g. `-watchedNamespaces=\"\"`), "+
3948
"olm operator will watch all namespaces in the cluster.")
4049

50+
writeStatusName = flag.String(
51+
"writeStatusName", defaultOperatorName, "ClusterOperator name in which to write status, set to \"\" to disable.")
52+
4153
debug = flag.Bool(
4254
"debug", false, "use debug log level")
4355

@@ -89,6 +101,16 @@ func main() {
89101

90102
opClient := operatorclient.NewClientFromConfig(*kubeConfigPath, logger)
91103

104+
// create a config client for operator status
105+
config, err := clientcmd.BuildConfigFromFlags("", *kubeConfigPath)
106+
if err != nil {
107+
log.Fatalf("error configuring client: %s", err.Error())
108+
}
109+
configClient, err := configv1client.NewForConfig(config)
110+
if err != nil {
111+
log.Fatalf("error configuring client: %s", err.Error())
112+
}
113+
92114
// Create a new instance of the operator.
93115
operator, err := olm.NewOperator(logger, crClient, opClient, &install.StrategyResolver{}, *wakeupInterval, namespaces)
94116

@@ -105,6 +127,91 @@ func main() {
105127
http.Handle("/metrics", promhttp.Handler())
106128
go http.ListenAndServe(":8081", nil)
107129

108-
_, done := operator.Run(stopCh)
130+
ready, done := operator.Run(stopCh)
131+
<-ready
132+
133+
if *writeStatusName != "" {
134+
existing, err := configClient.ClusterOperators().Get(*writeStatusName, metav1.GetOptions{})
135+
if meta.IsNoMatchError(err) {
136+
log.Infof("ClusterOperator api not present, skipping update")
137+
} else if k8serrors.IsNotFound(err) {
138+
log.Info("Existing cluster operator not found, creating")
139+
created, err := configClient.ClusterOperators().Create(&configv1.ClusterOperator{
140+
ObjectMeta: metav1.ObjectMeta{
141+
Name: *writeStatusName,
142+
},
143+
})
144+
if err != nil {
145+
log.Fatalf("ClusterOperator create failed: %v\n", err)
146+
}
147+
148+
created.Status = configv1.ClusterOperatorStatus{
149+
Conditions: []configv1.ClusterOperatorStatusCondition{
150+
configv1.ClusterOperatorStatusCondition{
151+
Type: configv1.OperatorProgressing,
152+
Status: configv1.ConditionFalse,
153+
Message: fmt.Sprintf("Done deploying %s.", olmversion.OLMVersion),
154+
LastTransitionTime: metav1.Now(),
155+
},
156+
configv1.ClusterOperatorStatusCondition{
157+
Type: configv1.OperatorFailing,
158+
Status: configv1.ConditionFalse,
159+
Message: fmt.Sprintf("Done deploying %s.", olmversion.OLMVersion),
160+
LastTransitionTime: metav1.Now(),
161+
},
162+
configv1.ClusterOperatorStatusCondition{
163+
Type: configv1.OperatorAvailable,
164+
Status: configv1.ConditionTrue,
165+
Message: fmt.Sprintf("Done deploying %s.", olmversion.OLMVersion),
166+
LastTransitionTime: metav1.Now(),
167+
},
168+
},
169+
Versions: []configv1.OperandVersion{{
170+
Name: "operator",
171+
Version: olmversion.Full(),
172+
}},
173+
}
174+
_, err = configClient.ClusterOperators().UpdateStatus(created)
175+
if err != nil {
176+
log.Fatalf("ClusterOperator update status failed: %v", err)
177+
}
178+
} else if err != nil {
179+
log.Fatalf("ClusterOperators get failed: %v", err)
180+
} else {
181+
clusteroperatorv1helpers.SetStatusCondition(&existing.Status.Conditions, configv1.ClusterOperatorStatusCondition{
182+
Type: configv1.OperatorProgressing,
183+
Status: configv1.ConditionFalse,
184+
Message: fmt.Sprintf("Done deploying %s.", olmversion.OLMVersion),
185+
LastTransitionTime: metav1.Now(),
186+
})
187+
clusteroperatorv1helpers.SetStatusCondition(&existing.Status.Conditions, configv1.ClusterOperatorStatusCondition{
188+
Type: configv1.OperatorFailing,
189+
Status: configv1.ConditionFalse,
190+
Message: fmt.Sprintf("Done deploying %s.", olmversion.OLMVersion),
191+
LastTransitionTime: metav1.Now(),
192+
})
193+
clusteroperatorv1helpers.SetStatusCondition(&existing.Status.Conditions, configv1.ClusterOperatorStatusCondition{
194+
Type: configv1.OperatorAvailable,
195+
Status: configv1.ConditionTrue,
196+
Message: fmt.Sprintf("Done deploying %s.", olmversion.OLMVersion),
197+
LastTransitionTime: metav1.Now(),
198+
})
199+
200+
olmOperandVersion := configv1.OperandVersion{Name: "operator", Version: olmversion.Full()}
201+
// look for operator version, even though in OLM's case should only be one
202+
for _, item := range existing.Status.Versions {
203+
if item.Name == "operator" && item != olmOperandVersion {
204+
// if a cluster wide upgrade has occurred, hopefully any existing operator statuses have been deleted
205+
log.Infof("Updating version from %v to %v\n", item.Version, olmversion.Full())
206+
}
207+
}
208+
operatorv1helpers.SetOperandVersion(&existing.Status.Versions, olmOperandVersion)
209+
_, err = configClient.ClusterOperators().UpdateStatus(existing)
210+
if err != nil {
211+
log.Fatalf("ClusterOperator update status failed: %v", err)
212+
}
213+
}
214+
}
215+
109216
<-done
110217
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ spec:
3333
{{- if .Values.debug }}
3434
- -debug
3535
{{- end }}
36+
{{- if .Values.writeStatusName }}
37+
- -writeStatusName
38+
- {{ .Values.writeStatusName }}
39+
{{- end }}
3640
image: {{ .Values.olm.image.ref }}
3741
imagePullPolicy: {{ .Values.olm.image.pullPolicy }}
3842
ports:

deploy/chart/values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ namespace: operator-lifecycle-manager
33
catalog_namespace: operator-lifecycle-manager
44
operator_namespace: operators
55
minKubeVersion: 1.11.0
6+
writeStatusName: '""'
67
imagestream: false
78
debug: false
89
olm:

deploy/upstream/values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ namespace: olm
33
catalog_namespace: olm
44
operator_namespace: operators
55
imagestream: false
6+
writeStatusName: '""'
67
olm:
78
replicaCount: 1
89
image:

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ require (
2626
github.com/maxbrunsfeld/counterfeiter v0.0.0-20181017030959-1aadac120687
2727
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
2828
github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
29+
github.com/openshift/api v3.9.1-0.20190129160438-bbc4289c54e0+incompatible
30+
github.com/openshift/client-go v0.0.0-20190128154758-1540772775fa
31+
github.com/openshift/library-go v0.0.0-20190125204812-22b2ba2f485f
2932
github.com/operator-framework/operator-registry v1.0.4
3033
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
3134
github.com/pkg/errors v0.8.0

go.sum

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,8 @@ github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf h1:eg0MeVzs
1515
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
1616
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
1717
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
18-
github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4=
1918
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
2019
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
21-
github.com/coreos/bbolt v1.3.0 h1:HIgH5xUWXT914HCI671AxuTTqjj64UOFr7pHn48LUTI=
2220
github.com/coreos/bbolt v1.3.0/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
2321
github.com/coreos/bbolt v1.3.2 h1:wZwiHHUieZCquLkDL0B8UhzreNWsPHooDAG3q34zk0s=
2422
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
@@ -89,7 +87,6 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a
8987
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
9088
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
9189
github.com/golang/groupcache v0.0.0-20180924190550-6f2cf27854a4/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
92-
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff h1:kOkM9whyQYodu09SJ6W3NCsHG7crFaJILQ22Gozp3lg=
9390
github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
9491
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk=
9592
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -160,6 +157,12 @@ github.com/onsi/gomega v1.4.2-0.20180831124310-ae19f1b56d53 h1:W43ZAQzmBARaVM1Wr
160157
github.com/onsi/gomega v1.4.2-0.20180831124310-ae19f1b56d53/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
161158
github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
162159
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
160+
github.com/openshift/api v3.9.1-0.20190129160438-bbc4289c54e0+incompatible h1:ZEphfx4UJGELQZbqf3kcDkspEplsr/9IWXxRsof9wgY=
161+
github.com/openshift/api v3.9.1-0.20190129160438-bbc4289c54e0+incompatible/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY=
162+
github.com/openshift/client-go v0.0.0-20190128154758-1540772775fa h1:NG6c0KXa/9hBJmqyR6xwwGaEGJi1+79SOwXZWXse/Lw=
163+
github.com/openshift/client-go v0.0.0-20190128154758-1540772775fa/go.mod h1:6rzn+JTr7+WYS2E1TExP4gByoABxMznR6y2SnUIkmxk=
164+
github.com/openshift/library-go v0.0.0-20190125204812-22b2ba2f485f h1:C8nvPUscfprRIyUCgWN2HpLXwKT1L+5irSPb9odZJZ4=
165+
github.com/openshift/library-go v0.0.0-20190125204812-22b2ba2f485f/go.mod h1:NBttNjZpWwup/nthuLbPAPSYC8Qyo+BBK5bCtFoyYjo=
163166
github.com/operator-framework/operator-lifecycle-manager v0.0.0-20181023032605-e838f7fb2186/go.mod h1:Ma5ZXd4S1vmMyewWlF7aO8CZiokR7Sd8dhSfkGkNU4U=
164167
github.com/operator-framework/operator-lifecycle-manager v0.0.0-20190105193533-81104ffdc4fb/go.mod h1:XMyE4n2opUK4N6L45YGQkXXi8F9fD7XDYFv/CsS6V5I=
165168
github.com/operator-framework/operator-registry v1.0.1/go.mod h1:1xEdZjjUg2hPEd52LG3YQ0jtwiwEGdm98S1TH5P4RAA=
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
apiVersion: config.openshift.io/v1
2+
kind: ClusterOperator
3+
metadata:
4+
name: operator-lifecycle-manager

pkg/version/version.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,8 @@ var GitCommit string
1212
func String() string {
1313
return fmt.Sprintf("OLM version: %s\ngit commit: %s\n", OLMVersion, GitCommit)
1414
}
15+
16+
// Full returns a hypenated concatenation of just OLMVersion and GitCommit
17+
func Full() string {
18+
return fmt.Sprintf("%s-%s", OLMVersion, GitCommit)
19+
}

test/e2e/e2e-bare-values.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
rbacApiVersion: rbac.authorization.k8s.io
22
namespace: operator-lifecycle-manager
33
catalog_namespace: operator-lifecycle-manager
4+
writeStatusName: '""'
45
olm:
56
replicaCount: 1
67
image:

test/e2e/e2e-values.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
writeStatusName: '""'
2+
13
olm:
24
replicaCount: 1
35
image:

0 commit comments

Comments
 (0)