@@ -88,43 +88,35 @@ func (r *Reconciler) Reconcile(ctx context.Context, _ reconcile.Request) (reconc
88
88
func (r * Reconciler ) doReconcile (ctx context.Context ) error {
89
89
log := logf .FromContext (ctx )
90
90
91
+ currNamespace , err := r .findIstioBaseNamespace (ctx )
92
+ if err != nil {
93
+ return err
94
+ }
95
+
91
96
rev , err := r .getDefaultRevision (ctx )
92
97
if err != nil {
93
98
if errors .IsNotFound (err ) {
94
- if err := r .uninstallHelmChart (ctx ); err != nil {
95
- return fmt .Errorf ("failed to uninstall base chart: %w" , err )
99
+ if currNamespace != "" {
100
+ log .Info ("Uninstalling Helm chart" )
101
+ _ , err := r .ChartManager .UninstallChart (ctx , baseReleaseName , currNamespace )
102
+ if err != nil {
103
+ return fmt .Errorf ("failed to uninstall Helm chart %q: %w" , baseChartName , err )
104
+ }
96
105
}
97
106
return nil
98
107
}
99
108
return fmt .Errorf ("failed to reconcile: %w" , err )
100
109
}
101
- log .Info ("Installing Helm chart" )
102
- return r .installHelmChart (ctx , rev )
103
- }
104
110
105
- func (r * Reconciler ) getDefaultRevision (ctx context.Context ) (* v1.IstioRevision , error ) {
106
- // 1. get the IstioRevision referenced in the default IstioRevisionTag
107
- tag := v1.IstioRevisionTag {}
108
- if err := r .Client .Get (ctx , types.NamespacedName {Name : "default" }, & tag ); err != nil {
109
- if ! errors .IsNotFound (err ) {
110
- return nil , fmt .Errorf ("failed to get default IstioRevisionTag: %w" , err )
111
+ if rev .Spec .Namespace != currNamespace {
112
+ log .Info ("Uninstalling Helm chart from previous namespace" )
113
+ _ , err := r .ChartManager .UninstallChart (ctx , baseReleaseName , currNamespace )
114
+ if err != nil {
115
+ return fmt .Errorf ("failed to uninstall Helm chart %q: %w" , baseChartName , err )
111
116
}
112
117
}
113
118
114
- revName := tag .Status .IstioRevision
115
- if revName == "" {
116
- revName = "default"
117
- }
118
-
119
- // 2. get the IstioRevision
120
- rev := & v1.IstioRevision {}
121
- if err := r .Client .Get (ctx , types.NamespacedName {Name : revName }, rev ); err != nil {
122
- return rev , fmt .Errorf ("failed to get IstioRevision %q: %w" , revName , err )
123
- }
124
- return rev , nil
125
- }
126
-
127
- func (r * Reconciler ) installHelmChart (ctx context.Context , rev * v1.IstioRevision ) error {
119
+ log .Info ("Installing Helm chart" )
128
120
version , err := istioversion .Resolve (rev .Spec .Version )
129
121
if err != nil {
130
122
return fmt .Errorf ("failed to resolve IstioRevision version for %q: %w" , rev .Name , err )
@@ -142,37 +134,45 @@ func (r *Reconciler) installHelmChart(ctx context.Context, rev *v1.IstioRevision
142
134
return nil
143
135
}
144
136
145
- func (r * Reconciler ) getChartDir (version string ) string {
146
- return path .Join (r .Config .ResourceDirectory , version , "charts" , baseChartName )
147
- }
148
-
149
- func (r * Reconciler ) uninstallHelmChart (ctx context.Context ) error {
150
- log := logf .FromContext (ctx )
137
+ // findIstioBaseNamespace returns the namespace the istio base chart is installed in. If the chart is not installed, it returns an empty string.
138
+ func (r * Reconciler ) findIstioBaseNamespace (ctx context.Context ) (string , error ) {
151
139
releases , err := r .ChartManager .ListReleases (ctx )
152
140
if err != nil {
153
- return fmt .Errorf ("failed to check whether Helm chart %q is installed: %w" , baseChartName , err )
141
+ return "" , fmt .Errorf ("failed to check whether Helm chart %q is installed: %w" , baseChartName , err )
154
142
}
155
143
156
- namespace := ""
157
144
for _ , release := range releases {
158
145
if release .Name == baseReleaseName {
159
- namespace = release .Namespace
160
- break
146
+ return release .Namespace , nil
161
147
}
162
148
}
149
+ return "" , nil
150
+ }
163
151
164
- if namespace == "" {
165
- log .V (3 ).Info (fmt .Sprintf ("Helm release %q not found" , baseReleaseName ))
166
- return nil
152
+ func (r * Reconciler ) getDefaultRevision (ctx context.Context ) (* v1.IstioRevision , error ) {
153
+ // 1. get the IstioRevision referenced in the default IstioRevisionTag
154
+ tag := v1.IstioRevisionTag {}
155
+ if err := r .Client .Get (ctx , types.NamespacedName {Name : "default" }, & tag ); err != nil {
156
+ if ! errors .IsNotFound (err ) {
157
+ return nil , fmt .Errorf ("failed to get default IstioRevisionTag: %w" , err )
158
+ }
167
159
}
168
160
169
- log .V (3 ).Info (fmt .Sprintf ("Helm release %q found in namespace %q" , baseReleaseName , namespace ))
170
- log .Info ("Uninstalling Helm chart" )
171
- _ , err = r .ChartManager .UninstallChart (ctx , baseReleaseName , namespace )
172
- if err != nil {
173
- return fmt .Errorf ("failed to uninstall Helm chart %q: %w" , baseChartName , err )
161
+ revName := tag .Status .IstioRevision
162
+ if revName == "" {
163
+ revName = "default"
174
164
}
175
- return nil
165
+
166
+ // 2. get the IstioRevision
167
+ rev := & v1.IstioRevision {}
168
+ if err := r .Client .Get (ctx , types.NamespacedName {Name : revName }, rev ); err != nil {
169
+ return rev , fmt .Errorf ("failed to get IstioRevision %q: %w" , revName , err )
170
+ }
171
+ return rev , nil
172
+ }
173
+
174
+ func (r * Reconciler ) getChartDir (version string ) string {
175
+ return path .Join (r .Config .ResourceDirectory , version , "charts" , baseChartName )
176
176
}
177
177
178
178
// SetupWithManager sets up the controller with the Manager.
0 commit comments