Skip to content

Commit 1dc76f0

Browse files
Merge pull request #99 from timflannagan/packageserver-csv
Migrate the PackageServer CSV management to a secondary controller
2 parents 8740cee + f465cc3 commit 1dc76f0

File tree

47 files changed

+5811
-2851
lines changed

Some content is hidden

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

47 files changed

+5811
-2851
lines changed

Makefile

+15-1
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ GO_PKG := github.com/operator-framework
2020
REGISTRY_PKG := $(GO_PKG)/operator-registry
2121
OLM_PKG := $(GO_PKG)/operator-lifecycle-manager
2222
API_PKG := $(GO_PKG)/api
23+
ROOT_PKG := github.com/openshift/operator-framework-olm
2324

25+
PSM := $(addprefix bin/, psm)
2426
OPM := $(addprefix bin/, opm)
2527
OLM_CMDS := $(shell go list -mod=vendor $(OLM_PKG)/cmd/...)
28+
PSM_CMDS := $(shell go list -mod=vendor github.com/openshift/operator-framework-olm/cmd/...)
2629
REGISTRY_CMDS := $(addprefix bin/, $(shell ls staging/operator-registry/cmd | grep -v opm))
2730

2831
# Phony prerequisite for targets that rely on the go build cache to determine staleness.
@@ -53,7 +56,7 @@ build/registry:
5356
$(MAKE) $(REGISTRY_CMDS) $(OPM)
5457

5558
build/olm:
56-
$(MAKE) $(OLM_CMDS)
59+
$(MAKE) $(PSM_CMDS) $(OLM_CMDS)
5760

5861
$(OPM): version_flags=-ldflags "-X '$(REGISTRY_PKG)/cmd/opm/version.gitCommit=$(GIT_COMMIT)' -X '$(REGISTRY_PKG)/cmd/opm/version.opmVersion=$(OPM_VERSION)' -X '$(REGISTRY_PKG)/cmd/opm/version.buildDate=$(BUILD_DATE)'"
5962
$(OPM):
@@ -67,6 +70,9 @@ $(OLM_CMDS): version_flags=-ldflags "-X $(OLM_PKG)/pkg/version.GitCommit=$(GIT_C
6770
$(OLM_CMDS):
6871
go build $(version_flags) $(GO_BUILD_OPTS) $(GO_BUILD_TAGS) -o bin/$(shell basename $@) $@
6972

73+
$(PSM_CMDS): FORCE
74+
go build $(GO_BUILD_OPTS) $(GO_BUILD_TAGS) -o $(PSM) $(ROOT_PKG)/cmd/...
75+
7076
.PHONY: cross
7177
cross: version_flags=-ldflags "-X '$(REGISTRY_PKG)/cmd/opm/version.gitCommit=$(GIT_COMMIT)' -X '$(REGISTRY_PKG)/cmd/opm/version.opmVersion=$(OPM_VERSION)' -X '$(REGISTRY_PKG)/cmd/opm/version.buildDate=$(BUILD_DATE)'"
7278
cross:
@@ -88,6 +94,11 @@ bin/cpb: FORCE
8894
CGO_ENABLED=0 go build $(GO_BUILD_OPTS) -ldflags '-extldflags "-static"' -o $@ github.com/operator-framework/operator-lifecycle-manager/util/cpb
8995

9096
unit/olm: bin/kubebuilder
97+
# TODO(tflannag): This is placeholder until we can add a dedicated
98+
# prow test for this unit check
99+
echo "Running the PSM unit tests"
100+
$(MAKE) unit/psm
101+
echo "Running the OLM unit tests"
91102
$(MAKE) unit WHAT=operator-lifecycle-manager
92103

93104
unit/registry:
@@ -96,6 +107,9 @@ unit/registry:
96107
unit/api:
97108
$(MAKE) unit WHAT=api TARGET_NAME=test
98109

110+
unit/psm:
111+
go test $(ROOT_DIR)/pkg/package-server-manager/...
112+
99113
unit: ## Run unit tests
100114
$(ROOT_DIR)/scripts/unit.sh
101115

cmd/package-server-manager/main.go

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
7+
"github.com/spf13/cobra"
8+
9+
configv1 "github.com/openshift/api/config/v1"
10+
olmv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
11+
12+
"k8s.io/apimachinery/pkg/fields"
13+
"k8s.io/apimachinery/pkg/runtime"
14+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
15+
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
16+
_ "k8s.io/client-go/plugin/pkg/client/auth"
17+
18+
ctrl "sigs.k8s.io/controller-runtime"
19+
"sigs.k8s.io/controller-runtime/pkg/cache"
20+
"sigs.k8s.io/controller-runtime/pkg/healthz"
21+
"sigs.k8s.io/controller-runtime/pkg/log/zap"
22+
"sigs.k8s.io/controller-runtime/pkg/manager"
23+
24+
controllers "github.com/openshift/operator-framework-olm/pkg/package-server-manager"
25+
//+kubebuilder:scaffold:imports
26+
)
27+
28+
const (
29+
defaultName = "packageserver"
30+
defaultNamespace = "openshift-operator-lifecycle-manager"
31+
defaultMetricsPort = "0"
32+
defaultHealthCheckPort = ":8080"
33+
leaderElectionConfigmapName = "packageserver-controller-lock"
34+
)
35+
36+
func main() {
37+
cmd := newStartCmd()
38+
39+
if err := cmd.Execute(); err != nil {
40+
fmt.Fprintf(os.Stderr, "encountered an error while executing the binary: %v\n", err)
41+
os.Exit(1)
42+
}
43+
}
44+
45+
func run(cmd *cobra.Command, args []string) error {
46+
name, err := cmd.Flags().GetString("name")
47+
if err != nil {
48+
return err
49+
}
50+
namespace, err := cmd.Flags().GetString("namespace")
51+
if err != nil {
52+
return err
53+
}
54+
disableLeaderElection, err := cmd.Flags().GetBool("disable-leader-election")
55+
if err != nil {
56+
return err
57+
}
58+
healthCheckAddr, err := cmd.Flags().GetString("health")
59+
if err != nil {
60+
return err
61+
}
62+
63+
ctrl.SetLogger(zap.New(zap.UseDevMode(true)))
64+
setupLog := ctrl.Log.WithName("setup")
65+
66+
packageserverCSVFields := fields.Set{"metadata.name": name}
67+
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), manager.Options{
68+
Scheme: setupScheme(),
69+
Namespace: namespace,
70+
MetricsBindAddress: defaultMetricsPort,
71+
LeaderElection: !disableLeaderElection,
72+
LeaderElectionNamespace: namespace,
73+
LeaderElectionID: leaderElectionConfigmapName,
74+
HealthProbeBindAddress: healthCheckAddr,
75+
NewCache: cache.BuilderWithOptions(cache.Options{
76+
SelectorsByObject: cache.SelectorsByObject{
77+
&olmv1alpha1.ClusterServiceVersion{}: {
78+
Field: packageserverCSVFields.AsSelector(),
79+
},
80+
},
81+
}),
82+
})
83+
if err != nil {
84+
setupLog.Error(err, "failed to setup manager instance")
85+
return err
86+
}
87+
88+
if err := (&controllers.PackageServerCSVReconciler{
89+
Name: name,
90+
Namespace: namespace,
91+
Image: os.Getenv("PACKAGESERVER_IMAGE"),
92+
Client: mgr.GetClient(),
93+
Log: ctrl.Log.WithName("controllers").WithName(name),
94+
Scheme: mgr.GetScheme(),
95+
}).SetupWithManager(mgr); err != nil {
96+
setupLog.Error(err, "unable to create controller", "controller", name)
97+
return err
98+
}
99+
100+
if err := mgr.AddReadyzCheck("ping", healthz.Ping); err != nil {
101+
setupLog.Error(err, "failed to establish a readyz check")
102+
return err
103+
}
104+
if err := mgr.AddHealthzCheck("ping", healthz.Ping); err != nil {
105+
setupLog.Error(err, "failed to establish a healthz check")
106+
return err
107+
}
108+
// +kubebuilder:scaffold:builder
109+
setupLog.Info("starting manager")
110+
if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil {
111+
setupLog.Error(err, "problem running manager")
112+
return err
113+
}
114+
115+
return nil
116+
}
117+
118+
func setupScheme() *runtime.Scheme {
119+
scheme := runtime.NewScheme()
120+
utilruntime.Must(clientgoscheme.AddToScheme(scheme))
121+
utilruntime.Must(configv1.Install(scheme))
122+
utilruntime.Must(olmv1alpha1.AddToScheme(scheme))
123+
124+
return scheme
125+
}

cmd/package-server-manager/start.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package main
2+
3+
import (
4+
"github.com/spf13/cobra"
5+
)
6+
7+
func newStartCmd() *cobra.Command {
8+
cmd := &cobra.Command{
9+
Use: "start",
10+
Short: "Start the PackageServer manager",
11+
SilenceUsage: true,
12+
RunE: run,
13+
}
14+
15+
cmd.Flags().String("name", defaultName, "configures the metadata.name for the packageserver csv resource")
16+
cmd.Flags().String("namespace", defaultNamespace, "configures the metadata.namespace that contains the packageserver csv resource")
17+
cmd.Flags().String("health", defaultHealthCheckPort, "configures the health check port that the kubelet is configured to probe")
18+
cmd.Flags().Bool("disable-leader-election", false, "configures whether leader election will be disabled")
19+
20+
return cmd
21+
}

go.mod

+10-1
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,29 @@ go 1.16
44

55
require (
66
github.com/go-bindata/go-bindata/v3 v3.1.3
7+
github.com/go-logr/logr v0.4.0
78
github.com/golang/mock v1.6.0
89
github.com/googleapis/gnostic v0.5.5
910
github.com/grpc-ecosystem/grpc-health-probe v0.4.4
1011
github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1
1112
github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37
1213
github.com/onsi/ginkgo v1.16.4
14+
github.com/openshift/api v0.0.0-20200331152225-585af27e34fd
1315
github.com/operator-framework/api v0.10.1
1416
github.com/operator-framework/operator-lifecycle-manager v0.0.0-00010101000000-000000000000
1517
github.com/operator-framework/operator-registry v1.13.6
18+
github.com/spf13/cobra v1.1.3
19+
github.com/stretchr/testify v1.7.0
1620
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0
1721
google.golang.org/protobuf v1.27.1
1822
helm.sh/helm/v3 v3.6.2
23+
k8s.io/api v0.22.0-beta.0
24+
k8s.io/apimachinery v0.22.0-beta.0
25+
k8s.io/client-go v0.22.0-beta.0
1926
k8s.io/code-generator v0.22.0-beta.0
2027
k8s.io/kube-openapi v0.0.0-20210527164424-3c818078ee3d
28+
k8s.io/utils v0.0.0-20210527160623-6fdb442a123b
29+
sigs.k8s.io/controller-runtime v0.9.2
2130
sigs.k8s.io/controller-tools v0.6.1
2231
)
2332

@@ -33,7 +42,7 @@ replace (
3342
github.com/docker/distribution => github.com/docker/distribution v0.0.0-20191216044856-a8371794149d
3443

3544
// controller runtime
36-
github.com/openshift/api => github.com/openshift/api v0.0.0-20200331152225-585af27e34fd // release-4.5
45+
github.com/openshift/api => github.com/openshift/api v0.0.0-20210517065120-b325f58df679
3746
github.com/openshift/client-go => github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 // release-4.5
3847

3948
// use staged repositories

go.sum

+6-4
Original file line numberDiff line numberDiff line change
@@ -851,9 +851,9 @@ github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59P
851851
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
852852
github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0=
853853
github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
854-
github.com/openshift/api v0.0.0-20200331152225-585af27e34fd h1:f4iPC9iCf1an7qEWpEFvp/swsM79vvBRsJ2twU4D30s=
855-
github.com/openshift/api v0.0.0-20200331152225-585af27e34fd/go.mod h1:RKMJ5CBnljLfnej+BJ/xnOWc3kZDvJUaIAEq2oKSPtE=
856-
github.com/openshift/build-machinery-go v0.0.0-20200211121458-5e3d6e570160/go.mod h1:1CkcsT3aVebzRBzVTSbiKSkJMsC/CASqxesfqEMfJEc=
854+
github.com/openshift/api v0.0.0-20210517065120-b325f58df679 h1:aKnhCEj48qYquZk+w5t0fVthwAtifHUXTQrvwM1xJf8=
855+
github.com/openshift/api v0.0.0-20210517065120-b325f58df679/go.mod h1:dZ4kytOo3svxJHNYd0J55hwe/6IQG5gAUHUE0F3Jkio=
856+
github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
857857
github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 h1:kMiuiZXH1GdfbiMwsuAQOqGaMxlo9NCUk0wT4XAdfNM=
858858
github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0/go.mod h1:uUQ4LClRO+fg5MF/P6QxjMCb1C9f7Oh4RKepftDnEJE=
859859
github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
@@ -1424,7 +1424,6 @@ golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtn
14241424
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
14251425
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
14261426
golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
1427-
golang.org/x/tools v0.0.0-20200115044656-831fdb1e1868/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
14281427
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
14291428
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
14301429
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
@@ -1620,6 +1619,7 @@ k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8=
16201619
k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo=
16211620
k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ=
16221621
k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8=
1622+
k8s.io/api v0.21.0-rc.0/go.mod h1:Dkc/ZauWJrgZhjOjeBgW89xZQiTBJA2RaBKYHXPsi2Y=
16231623
k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU=
16241624
k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s=
16251625
k8s.io/api v0.21.2/go.mod h1:Lv6UGJZ1rlMI1qusN8ruAp9PUBFyBwpEHAdG24vIsiU=
@@ -1637,6 +1637,7 @@ k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRp
16371637
k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
16381638
k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
16391639
k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc=
1640+
k8s.io/apimachinery v0.21.0-rc.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY=
16401641
k8s.io/apimachinery v0.21.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY=
16411642
k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY=
16421643
k8s.io/apimachinery v0.21.2/go.mod h1:CdTY8fU/BlvAbJ2z/8kBwimGki5Zp8/fbVuLY8gJumM=
@@ -1666,6 +1667,7 @@ k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRV
16661667
k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg=
16671668
k8s.io/code-generator v0.20.4/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg=
16681669
k8s.io/code-generator v0.20.6/go.mod h1:i6FmG+QxaLxvJsezvZp0q/gAEzzOz3U53KFibghWToU=
1670+
k8s.io/code-generator v0.21.0-rc.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q=
16691671
k8s.io/code-generator v0.21.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q=
16701672
k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q=
16711673
k8s.io/code-generator v0.21.2/go.mod h1:8mXJDCB7HcRo1xiEQstcguZkbxZaqeUOrO9SsicWs3U=
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: package-server-manager
5+
namespace: openshift-operator-lifecycle-manager
6+
labels:
7+
app: package-server-manager
8+
annotations:
9+
include.release.openshift.io/self-managed-high-availability: "true"
10+
include.release.openshift.io/single-node-developer: "true"
11+
include.release.openshift.io/ibm-cloud-managed: "true"
12+
spec:
13+
strategy:
14+
type: RollingUpdate
15+
replicas: 1
16+
selector:
17+
matchLabels:
18+
app: package-server-manager
19+
template:
20+
metadata:
21+
annotations:
22+
target.workload.openshift.io/management: '{"effect": "PreferredDuringScheduling"}'
23+
labels:
24+
app: package-server-manager
25+
spec:
26+
serviceAccountName: olm-operator-serviceaccount
27+
priorityClassName: "system-cluster-critical"
28+
containers:
29+
- name: package-server-manager
30+
command:
31+
- /bin/psm
32+
- start
33+
args:
34+
- --name
35+
- $(PACKAGESERVER_NAME)
36+
- --namespace
37+
- $(PACKAGESERVER_NAMESPACE)
38+
image: quay.io/operator-framework/olm@sha256:de396b540b82219812061d0d753440d5655250c621c753ed1dc67d6154741607
39+
imagePullPolicy: IfNotPresent
40+
env:
41+
- name: PACKAGESERVER_NAME
42+
value: packageserver
43+
- name: PACKAGESERVER_IMAGE
44+
value: quay.io/operator-framework/olm@sha256:de396b540b82219812061d0d753440d5655250c621c753ed1dc67d6154741607
45+
- name: PACKAGESERVER_NAMESPACE
46+
valueFrom:
47+
fieldRef:
48+
fieldPath: metadata.namespace
49+
- name: RELEASE_VERSION
50+
value: "0.0.1-snapshot"
51+
resources:
52+
requests:
53+
cpu: 10m
54+
memory: 50Mi
55+
livenessProbe:
56+
httpGet:
57+
path: /healthz
58+
port: 8080
59+
initialDelaySeconds: 30
60+
readinessProbe:
61+
httpGet:
62+
path: /healthz
63+
port: 8080
64+
initialDelaySeconds: 30
65+
terminationMessagePolicy: FallbackToLogsOnError
66+
nodeSelector:
67+
kubernetes.io/os: linux
68+
tolerations:
69+
- effect: NoSchedule
70+
key: node-role.kubernetes.io/master
71+
operator: Exists
72+
- effect: NoExecute
73+
key: node.kubernetes.io/unreachable
74+
operator: Exists
75+
tolerationSeconds: 120
76+
- effect: NoExecute
77+
key: node.kubernetes.io/not-ready
78+
operator: Exists
79+
tolerationSeconds: 120

0 commit comments

Comments
 (0)