(currentRelease, targetRelease *release.Release, serverSideApply bool)
| 195 | } |
| 196 | |
| 197 | func (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 | } |
no test coverage detected