Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions pkg/action/release_install.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ type ReleaseInstallOptions struct {
// LegacyLogRegistryStreamOut is the output writer for Helm registry client logs.
// Defaults to io.Discard if not set. Used for debugging registry operations.
LegacyLogRegistryStreamOut io.Writer
// LegacyNoReleaseLock, when true, disables acquiring the werf-synchronization release lock in the cluster.
LegacyNoReleaseLock bool
// LegacyProgressReportCh, when non-nil, receives ProgressReport snapshots during deployment.
// Must be a buffered channel with capacity >= 1. The caller owns the channel and is responsible
// for its lifecycle. Intermediate reports may be dropped if the consumer is slow; the final
Expand Down Expand Up @@ -268,10 +270,12 @@ func releaseInstall(ctx context.Context, ctxCancelFn context.CancelCauseFunc, re
}

var lockManager *lock.LockManager
if m, err := lock.NewLockManager(ctx, releaseNamespace, false, clientFactory); err != nil {
return fmt.Errorf("construct lock manager: %w", err)
} else {
lockManager = m
if !opts.LegacyNoReleaseLock {
if m, err := lock.NewLockManager(ctx, releaseNamespace, false, clientFactory); err != nil {
return fmt.Errorf("construct lock manager: %w", err)
} else {
lockManager = m
}
}

if err := createReleaseNamespace(ctx, clientFactory, releaseNamespace); err != nil {
Expand All @@ -280,12 +284,14 @@ func releaseInstall(ctx context.Context, ctxCancelFn context.CancelCauseFunc, re

log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render("Start release")+" %q (namespace: %q)", releaseName, releaseNamespace)

if lock, err := lockManager.LockRelease(ctx, releaseName); err != nil {
return fmt.Errorf("lock release: %w", err)
} else {
defer func() {
_ = lockManager.Unlock(lock)
}()
if lockManager != nil {
if lock, err := lockManager.LockRelease(ctx, releaseName); err != nil {
return fmt.Errorf("lock release: %w", err)
} else {
defer func() {
_ = lockManager.Unlock(lock)
}()
}
}

log.Default.Debug(ctx, "Build release history")
Expand Down
26 changes: 16 additions & 10 deletions pkg/action/release_rollback.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ type ReleaseRollbackOptions struct {
// ForceAdoption, when true, allows adopting resources that belong to a different Helm release.
// WARNING: This can lead to conflicts if resources are managed by multiple releases.
ForceAdoption bool
// LegacyNoReleaseLock, when true, disables acquiring the werf-synchronization release lock in the cluster.
LegacyNoReleaseLock bool
// NetworkParallelism limits the number of concurrent network-related operations (API calls, resource fetches).
// Defaults to DefaultNetworkParallelism if not set or <= 0.
NetworkParallelism int
Expand Down Expand Up @@ -158,20 +160,24 @@ func releaseRollback(ctx context.Context, ctxCancelFn context.CancelCauseFunc, r
}

var lockManager *lock.LockManager
if m, err := lock.NewLockManager(ctx, releaseNamespace, false, clientFactory); err != nil {
return fmt.Errorf("construct lock manager: %w", err)
} else {
lockManager = m
if !opts.LegacyNoReleaseLock {
if m, err := lock.NewLockManager(ctx, releaseNamespace, false, clientFactory); err != nil {
return fmt.Errorf("construct lock manager: %w", err)
} else {
lockManager = m
}
}

log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render("Start rollback of release")+" %q (namespace: %q)", releaseName, releaseNamespace)

if lock, err := lockManager.LockRelease(ctx, releaseName); err != nil {
return fmt.Errorf("lock release: %w", err)
} else {
defer func() {
_ = lockManager.Unlock(lock)
}()
if lockManager != nil {
if lock, err := lockManager.LockRelease(ctx, releaseName); err != nil {
return fmt.Errorf("lock release: %w", err)
} else {
defer func() {
_ = lockManager.Unlock(lock)
}()
}
}

log.Default.Debug(ctx, "Build release history")
Expand Down
26 changes: 16 additions & 10 deletions pkg/action/release_uninstall.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ type ReleaseUninstallOptions struct {
// DeleteReleaseNamespace, when true, deletes the release namespace after uninstalling the release.
// WARNING: This will delete the entire namespace including resources not managed by this release.
DeleteReleaseNamespace bool
// LegacyNoReleaseLock, when true, disables acquiring the werf-synchronization release lock in the cluster.
LegacyNoReleaseLock bool
// LegacyProgressReportCh, when non-nil, receives ProgressReport snapshots during deployment.
// Must be a buffered channel with capacity >= 1. The caller owns the channel and is responsible
// for its lifecycle. Intermediate reports may be dropped if the consumer is slow; the final
Expand Down Expand Up @@ -153,10 +155,12 @@ func releaseUninstall(ctx context.Context, ctxCancelFn context.CancelCauseFunc,
}

var lockManager *lock.LockManager
if m, err := lock.NewLockManager(ctx, releaseNamespace, false, clientFactory); err != nil {
return fmt.Errorf("construct lock manager: %w", err)
} else {
lockManager = m
if !opts.LegacyNoReleaseLock {
if m, err := lock.NewLockManager(ctx, releaseNamespace, false, clientFactory); err != nil {
return fmt.Errorf("construct lock manager: %w", err)
} else {
lockManager = m
}
}

nsMeta := spec.NewResourceMeta(releaseNamespace, "", releaseNamespace, "", schema.GroupVersionKind{Version: "v1", Kind: "Namespace"}, nil, nil)
Expand Down Expand Up @@ -188,12 +192,14 @@ func releaseUninstall(ctx context.Context, ctxCancelFn context.CancelCauseFunc,
if err := func() error {
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render("Delete release")+" %q (namespace: %q)", releaseName, releaseNamespace)

if lock, err := lockManager.LockRelease(ctx, releaseName); err != nil {
return fmt.Errorf("lock release: %w", err)
} else {
defer func() {
_ = lockManager.Unlock(lock)
}()
if lockManager != nil {
if lock, err := lockManager.LockRelease(ctx, releaseName); err != nil {
return fmt.Errorf("lock release: %w", err)
} else {
defer func() {
_ = lockManager.Unlock(lock)
}()
}
}

log.Default.Debug(ctx, "Build release history")
Expand Down
21 changes: 13 additions & 8 deletions pkg/action/release_uninstall_legacy.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ type LegacyReleaseUninstallOptions struct {
common.TrackingOptions

DeleteReleaseNamespace bool
LegacyNoReleaseLock bool
NetworkParallelism int
NoDeleteHooks bool
ReleaseHistoryLimit int
Expand Down Expand Up @@ -215,16 +216,20 @@ func legacyReleaseUninstall(ctx context.Context, releaseName, releaseNamespace s
log.Default.Info(ctx, color.Style{color.Bold, color.Green}.Render("Deleting release")+" %q (namespace: %q)", releaseName, releaseNamespace)

var lockManager *lock.LockManager
if m, err := lock.NewLockManager(ctx, releaseNamespace, false, clientFactory); err != nil {
return fmt.Errorf("construct lock manager: %w", err)
} else {
lockManager = m
if !opts.LegacyNoReleaseLock {
if m, err := lock.NewLockManager(ctx, releaseNamespace, false, clientFactory); err != nil {
return fmt.Errorf("construct lock manager: %w", err)
} else {
lockManager = m
}
}

if lock, err := lockManager.LockRelease(ctx, releaseName); err != nil {
return fmt.Errorf("lock release: %w", err)
} else {
defer lockManager.Unlock(lock)
if lockManager != nil {
if lock, err := lockManager.LockRelease(ctx, releaseName); err != nil {
return fmt.Errorf("lock release: %w", err)
} else {
defer lockManager.Unlock(lock)
}
}

helmUninstallCmd := helmv3.NewUninstallCmd(
Expand Down