@@ -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
157171func (r * ClusterServiceVersionDeploymentScaler ) scaleDownCsvDeployments (logger logr.Logger , csv * opv1a1.ClusterServiceVersion ) {
0 commit comments