Skip to content

Commit 110babe

Browse files
author
Per G. da Silva
committed
Refine registry+v1 revision phase definitions for granular resource ordering
Restructure the phase definitions to provide more granular control over the order in which Kubernetes resources are applied during extension installation. The previous coarse-grained phases (rbac, deploy, publish) are replaced with finer-grained phases that better reflect resource dependency chains and operational best practices. Phase changes: - Split "rbac" into "identity" (ServiceAccount), "roles" (ClusterRole, Role), and "bindings" (ClusterRoleBinding, RoleBinding) for explicit ordering of RBAC prerequisites before their bindings - Extract "configuration" phase (Secret, ConfigMap) from "deploy" so config resources are available before workloads that mount them - Extract "infrastructure" phase (Service, Issuer) from "deploy" so services and cert-manager issuers exist before workloads reference them - Add "scaling" phase (VerticalPodAutoscaler) after deploy for autoscaling policies to target running workloads - Add "admission" phase (ValidatingWebhookConfiguration, MutatingWebhookConfiguration) as the final phase so webhooks are registered only after their backing services are ready - Move CRDs before roles/bindings so RBAC rules referencing custom resources can be validated - Add cert-manager Certificate to "deploy" phase alongside Deployment - Add monitoring resources (PrometheusRule, ServiceMonitor, PodMonitor) and OpenShift console resources to "publish" phase - Remove explicit mappings for workload kinds that already default to "deploy" (DaemonSet, StatefulSet, ReplicaSet, Pod, Job, CronJob) New phase order: namespaces → policies → identity → configuration → storage → crds → roles → bindings → infrastructure → deploy → scaling → publish → admission Signed-off-by: Per G. da Silva <pegoncal@redhat.com>
1 parent 1ef820f commit 110babe

3 files changed

Lines changed: 215 additions & 91 deletions

File tree

internal/operator-controller/applier/boxcutter_test.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ func Test_SimpleRevisionGenerator_GenerateRevisionFromHelmRelease(t *testing.T)
119119
Revision: 1,
120120
Phases: []ocv1.ClusterExtensionRevisionPhase{
121121
{
122-
Name: "deploy",
122+
Name: "configuration",
123123
Objects: []ocv1.ClusterExtensionRevisionObject{
124124
{
125125
Object: unstructured.Unstructured{
@@ -219,7 +219,7 @@ func Test_SimpleRevisionGenerator_GenerateRevision(t *testing.T) {
219219
t.Log("by checking the rendered objects are present in the correct phases")
220220
require.Equal(t, []ocv1.ClusterExtensionRevisionPhase{
221221
{
222-
Name: string(applier.PhaseDeploy),
222+
Name: string(applier.PhaseInfrastructure),
223223
Objects: []ocv1.ClusterExtensionRevisionObject{
224224
{
225225
Object: unstructured.Unstructured{
@@ -233,6 +233,11 @@ func Test_SimpleRevisionGenerator_GenerateRevision(t *testing.T) {
233233
},
234234
},
235235
},
236+
},
237+
},
238+
{
239+
Name: string(applier.PhaseDeploy),
240+
Objects: []ocv1.ClusterExtensionRevisionObject{
236241
{
237242
Object: unstructured.Unstructured{
238243
Object: map[string]interface{}{

internal/operator-controller/applier/phase.go

Lines changed: 62 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,36 @@ func determinePhase(gk schema.GroupKind) Phase {
2828
type Phase string
2929

3030
const (
31-
PhaseNamespaces Phase = "namespaces"
32-
PhasePolicies Phase = "policies"
33-
PhaseRBAC Phase = "rbac"
34-
PhaseRBACBindings Phase = "rbac-bindings"
35-
PhaseCRDs Phase = "crds"
36-
PhaseStorage Phase = "storage"
37-
PhaseDeploy Phase = "deploy"
38-
PhasePublish Phase = "publish"
31+
PhaseNamespaces Phase = "namespaces"
32+
PhasePolicies Phase = "policies"
33+
PhaseIdentity Phase = "identity"
34+
PhaseConfiguration Phase = "configuration"
35+
PhaseStorage Phase = "storage"
36+
PhaseCRDs Phase = "crds"
37+
PhaseRoles Phase = "roles"
38+
PhaseBindings Phase = "bindings"
39+
PhaseInfrastructure Phase = "infrastructure"
40+
PhaseDeploy Phase = "deploy"
41+
PhaseScaling Phase = "scaling"
42+
PhasePublish Phase = "publish"
43+
PhaseAdmission Phase = "admission"
3944
)
4045

4146
// Well known phases ordered.
4247
var defaultPhaseOrder = []Phase{
4348
PhaseNamespaces,
4449
PhasePolicies,
45-
PhaseRBAC,
46-
PhaseRBACBindings,
47-
PhaseCRDs,
50+
PhaseIdentity,
51+
PhaseConfiguration,
4852
PhaseStorage,
53+
PhaseCRDs,
54+
PhaseRoles,
55+
PhaseBindings,
56+
PhaseInfrastructure,
4957
PhaseDeploy,
58+
PhaseScaling,
5059
PhasePublish,
60+
PhaseAdmission,
5161
}
5262

5363
var (
@@ -59,27 +69,18 @@ var (
5969
},
6070

6171
PhasePolicies: {
62-
{Kind: "ResourceQuota"},
63-
{Kind: "LimitRange"},
64-
{Kind: "PriorityClass", Group: "scheduling.k8s.io"},
6572
{Kind: "NetworkPolicy", Group: "networking.k8s.io"},
66-
{Kind: "HorizontalPodAutoscaler", Group: "autoscaling"},
6773
{Kind: "PodDisruptionBudget", Group: "policy"},
74+
{Kind: "PriorityClass", Group: "scheduling.k8s.io"},
6875
},
6976

70-
PhaseRBAC: {
77+
PhaseIdentity: {
7178
{Kind: "ServiceAccount"},
72-
{Kind: "Role", Group: "rbac.authorization.k8s.io"},
73-
{Kind: "ClusterRole", Group: "rbac.authorization.k8s.io"},
74-
},
75-
76-
PhaseRBACBindings: {
77-
{Kind: "RoleBinding", Group: "rbac.authorization.k8s.io"},
78-
{Kind: "ClusterRoleBinding", Group: "rbac.authorization.k8s.io"},
7979
},
8080

81-
PhaseCRDs: {
82-
{Kind: "CustomResourceDefinition", Group: "apiextensions.k8s.io"},
81+
PhaseConfiguration: {
82+
{Kind: "Secret"},
83+
{Kind: "ConfigMap"},
8384
},
8485

8586
PhaseStorage: {
@@ -88,25 +89,50 @@ var (
8889
{Kind: "StorageClass", Group: "storage.k8s.io"},
8990
},
9091

92+
PhaseCRDs: {
93+
{Kind: "CustomResourceDefinition", Group: "apiextensions.k8s.io"},
94+
},
95+
96+
PhaseRoles: {
97+
{Kind: "ClusterRole", Group: "rbac.authorization.k8s.io"},
98+
{Kind: "Role", Group: "rbac.authorization.k8s.io"},
99+
},
100+
101+
PhaseBindings: {
102+
{Kind: "ClusterRoleBinding", Group: "rbac.authorization.k8s.io"},
103+
{Kind: "RoleBinding", Group: "rbac.authorization.k8s.io"},
104+
},
105+
106+
PhaseInfrastructure: {
107+
{Kind: "Service"},
108+
{Kind: "Issuer", Group: "cert-manager.io"},
109+
},
110+
91111
PhaseDeploy: {
112+
{Kind: "Certificate", Group: "cert-manager.io"},
92113
{Kind: "Deployment", Group: "apps"},
93-
{Kind: "DaemonSet", Group: "apps"},
94-
{Kind: "StatefulSet", Group: "apps"},
95-
{Kind: "ReplicaSet"},
96-
{Kind: "Pod"}, // probing complicated, may be either Completed or Available.
97-
{Kind: "Job", Group: "batch"},
98-
{Kind: "CronJob", Group: "batch"},
99-
{Kind: "Service"},
100-
{Kind: "Secret"},
101-
{Kind: "ConfigMap"},
114+
},
115+
116+
PhaseScaling: {
117+
{Kind: "VerticalPodAutoscaler", Group: "autoscaling.k8s.io"},
102118
},
103119

104120
PhasePublish: {
121+
{Kind: "PrometheusRule", Group: "monitoring.coreos.com"},
122+
{Kind: "ServiceMonitor", Group: "monitoring.coreos.com"},
123+
{Kind: "PodMonitor", Group: "monitoring.coreos.com"},
105124
{Kind: "Ingress", Group: "networking.k8s.io"},
106-
{Kind: "APIService", Group: "apiregistration.k8s.io"},
107125
{Kind: "Route", Group: "route.openshift.io"},
108-
{Kind: "MutatingWebhookConfiguration", Group: "admissionregistration.k8s.io"},
126+
{Kind: "ConsoleYAMLSample", Group: "console.openshift.io"},
127+
{Kind: "ConsoleQuickStart", Group: "console.openshift.io"},
128+
{Kind: "ConsoleCLIDownload", Group: "console.openshift.io"},
129+
{Kind: "ConsoleLink", Group: "console.openshift.io"},
130+
{Kind: "ConsolePlugin", Group: "console.openshift.io"},
131+
},
132+
133+
PhaseAdmission: {
109134
{Kind: "ValidatingWebhookConfiguration", Group: "admissionregistration.k8s.io"},
135+
{Kind: "MutatingWebhookConfiguration", Group: "admissionregistration.k8s.io"},
110136
},
111137
}
112138
)

0 commit comments

Comments
 (0)