MCPcopy
hub / github.com/helm/helm / performRollback

Method performRollback

pkg/action/rollback.go:197–306  ·  view source on GitHub ↗
(currentRelease, targetRelease *release.Release, serverSideApply bool)

Source from the content-addressed store, hash-verified

195}
196
197func (r *Rollback) performRollback(currentRelease, targetRelease *release.Release, serverSideApply bool) (*release.Release, error) {
198 if isDryRun(r.DryRunStrategy) {
199 r.cfg.Logger().Debug("dry run", "name", targetRelease.Name)
200 return targetRelease, nil
201 }
202
203 current, err := r.cfg.KubeClient.Build(bytes.NewBufferString(currentRelease.Manifest), false)
204 if err != nil {
205 return targetRelease, fmt.Errorf("unable to build kubernetes objects from current release manifest: %w", err)
206 }
207 target, err := r.cfg.KubeClient.Build(bytes.NewBufferString(targetRelease.Manifest), false)
208 if err != nil {
209 return targetRelease, fmt.Errorf("unable to build kubernetes objects from new release manifest: %w", err)
210 }
211
212 // pre-rollback hooks
213
214 if !r.DisableHooks {
215 if err := r.cfg.execHook(targetRelease, release.HookPreRollback, r.WaitStrategy, r.WaitOptions, r.Timeout, serverSideApply); err != nil {
216 return targetRelease, err
217 }
218 } else {
219 r.cfg.Logger().Debug("rollback hooks disabled", "name", targetRelease.Name)
220 }
221
222 // It is safe to use "forceOwnership" here because these are resources currently rendered by the chart.
223 err = target.Visit(setMetadataVisitor(targetRelease.Name, targetRelease.Namespace, true))
224 if err != nil {
225 return targetRelease, fmt.Errorf("unable to set metadata visitor from target release: %w", err)
226 }
227 results, err := r.cfg.KubeClient.Update(
228 current,
229 target,
230 kube.ClientUpdateOptionForceReplace(r.ForceReplace),
231 kube.ClientUpdateOptionServerSideApply(serverSideApply, r.ForceConflicts),
232 kube.ClientUpdateOptionThreeWayMergeForUnstructured(false),
233 kube.ClientUpdateOptionUpgradeClientSideFieldManager(true))
234
235 if err != nil {
236 msg := fmt.Sprintf("Rollback %q failed: %s", targetRelease.Name, err)
237 r.cfg.Logger().Warn(msg)
238 currentRelease.Info.Status = common.StatusSuperseded
239 targetRelease.Info.Status = common.StatusFailed
240 targetRelease.Info.Description = msg
241 r.cfg.recordRelease(currentRelease)
242 r.cfg.recordRelease(targetRelease)
243 if r.CleanupOnFail {
244 r.cfg.Logger().Debug("cleanup on fail set, cleaning up resources", "count", len(results.Created))
245 _, errs := r.cfg.KubeClient.Delete(results.Created, metav1.DeletePropagationBackground)
246 if errs != nil {
247 return targetRelease, fmt.Errorf(
248 "an error occurred while cleaning up resources. original rollback error: %w",
249 fmt.Errorf("unable to cleanup resources: %w", joinErrors(errs, ", ")))
250 }
251 r.cfg.Logger().Debug("resource cleanup complete")
252 }
253 return targetRelease, err
254 }

Callers 1

RunMethod · 0.95

Calls 15

WaitWithJobsMethod · 0.95
WaitMethod · 0.95
isDryRunFunction · 0.85
setMetadataVisitorFunction · 0.85
execHookMethod · 0.80
VisitMethod · 0.80
DeployedAllMethod · 0.80
IsMethod · 0.80

Tested by

no test coverage detected