Skip to content

Commit 6d3db8d

Browse files
iamnitingrohan47
authored andcommitted
controllers: ensure CSV inherits hostNetwork from previous deployment
The webhook now mutates the ClusterServiceVersion (CSV) to set `hostNetwork` on deployments if the replaced CSV had it enabled. This ensures continuity of networking configuration across operator upgrades and avoids potential deployment issues caused by missing `hostNetwork` in the new CSV. Signed-off-by: Nitin Goyal <[email protected]> Signed-off-by: Rohan Gupta <[email protected]>
1 parent f0955eb commit 6d3db8d

File tree

1 file changed

+41
-27
lines changed

1 file changed

+41
-27
lines changed

webhook/csv.go

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,32 @@ func (r *ClusterServiceVersionDeploymentScaler) Handle(ctx context.Context, req
7171
return admission.Allowed("csv is not managed by ODF")
7272
}
7373

74-
running, err := r.isPreviousCsvHasRunningDeployments(ctx, logger, csv)
75-
if err != nil {
76-
logger.Error(err, "failed getting replicas from csv")
77-
return admission.Errored(http.StatusInternalServerError, fmt.Errorf("failed getting replicas from csv: %v", err))
78-
}
74+
var prevCsvRunningDeployments bool
75+
if csv.Spec.Replaces != "" {
76+
77+
prevCsv := &opv1a1.ClusterServiceVersion{}
78+
key := client.ObjectKey{Name: csv.Spec.Replaces, Namespace: csv.Namespace}
79+
80+
if err := r.Client.Get(ctx, key, prevCsv); err != nil {
81+
if errors.IsNotFound(err) {
82+
logger.Info("previous CSV not found", "csv", csv.Spec.Replaces)
83+
} else {
84+
logger.Error(err, "failed to get previous CSV", "csv", csv.Spec.Replaces)
85+
return admission.Errored(http.StatusInternalServerError, fmt.Errorf("failed getting previous csv %q: %w", csv.Spec.Replaces, err))
86+
}
87+
} else {
88+
logger.Info("previous CSV found", "csv", prevCsv.Name)
89+
90+
prevCsvRunningDeployments = r.isCsvHasRunningDeployments(prevCsv)
91+
r.syncNewCsvWithPrevCsv(prevCsv, csv)
92+
}
7993

80-
if running {
81-
logger.Info("ignoring csv as the previous csv deployments are running")
82-
return admission.Allowed("previous csv deployments are running")
8394
}
8495

85-
r.scaleDownCsvDeployments(logger, csv)
96+
if !prevCsvRunningDeployments {
97+
logger.Info("scaling down deployments")
98+
r.scaleDownCsvDeployments(logger, csv)
99+
}
86100

87101
marshaledCsv, err := json.Marshal(csv)
88102
if err != nil {
@@ -123,35 +137,35 @@ func (r *ClusterServiceVersionDeploymentScaler) loadOdfConfigMapData(ctx context
123137
return nil
124138
}
125139

126-
func (r *ClusterServiceVersionDeploymentScaler) isPreviousCsvHasRunningDeployments(ctx context.Context, logger logr.Logger, csv *opv1a1.ClusterServiceVersion) (bool, error) {
140+
func (r *ClusterServiceVersionDeploymentScaler) syncNewCsvWithPrevCsv(prevCsv *opv1a1.ClusterServiceVersion, newCsv *opv1a1.ClusterServiceVersion) {
127141

128-
if csv.Spec.Replaces == "" {
129-
logger.Info("csv.Spec.Replaces is not populated")
130-
return false, nil
131-
}
142+
prevDeployments := prevCsv.Spec.InstallStrategy.StrategySpec.DeploymentSpecs
143+
newDeployments := newCsv.Spec.InstallStrategy.StrategySpec.DeploymentSpecs
132144

133-
prevCsv := &opv1a1.ClusterServiceVersion{}
134-
key := client.ObjectKey{Name: csv.Spec.Replaces, Namespace: csv.Namespace}
145+
for i := range prevDeployments {
146+
prevDeployment := &prevDeployments[i]
135147

136-
if err := r.Client.Get(ctx, key, prevCsv); errors.IsNotFound(err) {
137-
// new install where an previous csv does not exists
138-
return false, nil
139-
} else if err != nil {
140-
logger.Error(err, "failed getting previous csv")
141-
return false, err
148+
for j := range newDeployments {
149+
newDeployment := &newDeployments[j]
150+
151+
if prevDeployment.Name == newDeployment.Name {
152+
newDeployment.Spec.Template.Spec.HostNetwork = prevDeployment.Spec.Template.Spec.HostNetwork
153+
}
154+
}
142155
}
156+
}
157+
158+
func (r *ClusterServiceVersionDeploymentScaler) isCsvHasRunningDeployments(csv *opv1a1.ClusterServiceVersion) bool {
143159

144-
deployments := prevCsv.Spec.InstallStrategy.StrategySpec.DeploymentSpecs
160+
deployments := csv.Spec.InstallStrategy.StrategySpec.DeploymentSpecs
145161
for i := range deployments {
146162
deployment := &deployments[i]
147163
if deployment.Spec.Replicas == nil || *deployment.Spec.Replicas > 0 {
148-
// upgrade case where an older csv is found with replica 1
149-
return true, nil
164+
return true
150165
}
151166
}
152167

153-
// upgrade case where an older csv is found with replica 0
154-
return false, nil
168+
return false
155169
}
156170

157171
func (r *ClusterServiceVersionDeploymentScaler) scaleDownCsvDeployments(logger logr.Logger, csv *opv1a1.ClusterServiceVersion) {

0 commit comments

Comments
 (0)