Skip to content

Commit

Permalink
refactor destroy command
Browse files Browse the repository at this point in the history
Signed-off-by: adripedriza <adripedriza@gmail.com>
  • Loading branch information
AdrianPedriza committed Feb 20, 2023
1 parent 7c5f88e commit 35f882a
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 86 deletions.
50 changes: 29 additions & 21 deletions cmd/destroy/destroy.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ type destroyCommand struct {
k8sClientProvider okteto.K8sClientProvider
configMapHandler configMapHandler
oktetoClient *okteto.OktetoClient
getDestroyer func(*model.Manifest, *kubernetes.Clientset, okteto.K8sClientProvider, destroyer, executor.ManifestExecutor, *okteto.OktetoClient, bool) (destroyInterface, error)
getDestroyer func(*kubernetes.Clientset, okteto.K8sClientProvider, destroyer, executor.ManifestExecutor, *okteto.OktetoClient, *Options) (destroyInterface, error)
}

// Destroy destroys the dev application defined by the manifest
Expand Down Expand Up @@ -182,16 +182,7 @@ func Destroy(ctx context.Context) *cobra.Command {
os.Setenv("KUBECONFIG", kubeconfigPath)
defer os.Remove(kubeconfigPath)

manifest, err := model.GetManifestV2(options.ManifestPath)
if err != nil {
// Log error message but application can still be deleted
oktetoLog.Infof("could not find manifest file to be executed: %s", err)
manifest = &model.Manifest{
Destroy: &model.DestroyInfo{},
}
}

destroyer, err := c.getDestroyer(manifest, k8sClient, c.k8sClientProvider, c.nsDestroyer, c.executor, c.oktetoClient, options.RunInRemote)
destroyer, err := c.getDestroyer(k8sClient, c.k8sClientProvider, c.nsDestroyer, c.executor, c.oktetoClient, options)
if err != nil {
return err
}
Expand Down Expand Up @@ -219,22 +210,39 @@ func getTempKubeConfigFile(name string) string {
return filepath.Join(config.GetOktetoHome(), tempKubeconfigFileName)
}

func getDestroyer(manifest *model.Manifest, k8sClient *kubernetes.Clientset, okK8sClient okteto.K8sClientProvider, nsDestroyer destroyer, executor executor.ManifestExecutor, okClient *okteto.OktetoClient, runInRemoteRequest bool) (destroyInterface, error) {
func getDestroyer(k8sClient *kubernetes.Clientset, okK8sClient okteto.K8sClientProvider, nsDestroyer destroyer, executor executor.ManifestExecutor, okClient *okteto.OktetoClient, opts *Options) (destroyInterface, error) {
var (
deployer destroyInterface
)

isRemote := utils.LoadBoolean(constants.OKtetoDeployRemote)

runInRemote := !isRemote && (manifest.Destroy.Image != "" || runInRemoteRequest)

if runInRemote {
deployer = newRemoteDestroyer(manifest)
oktetoLog.Info("Destroying remotely...")
if opts.DestroyAll {
if !okteto.Context().IsOkteto {
return nil, oktetoErrors.ErrContextIsNotOktetoCluster
}
deployer = newLocalDestroyerAll(k8sClient, okK8sClient, executor, nsDestroyer, okClient)
oktetoLog.Info("Destroying locally...")
} else {
deployer = newLocalDestroyer(manifest, k8sClient, okK8sClient, executor, nsDestroyer, okClient)

oktetoLog.Info("Destroying locally...")
manifest, err := model.GetManifestV2(opts.ManifestPath)
if err != nil {
// Log error message but application can still be deleted
oktetoLog.Infof("could not find manifest file to be executed: %s", err)
manifest = &model.Manifest{
Destroy: &model.DestroyInfo{},
}
}

isRemote := utils.LoadBoolean(constants.OKtetoDeployRemote)

runInRemote := !isRemote && (manifest.Destroy.Image != "" || opts.RunInRemote)
if runInRemote {
deployer = newRemoteDestroyer(manifest)
oktetoLog.Info("Destroying remotely...")
} else {
deployer = newLocalDestroyer(manifest, newLocalDestroyerAll(k8sClient, okK8sClient, executor, nsDestroyer, okClient))
oktetoLog.Info("Destroying locally...")
}
}

return deployer, nil
}
104 changes: 60 additions & 44 deletions cmd/destroy/destroy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,13 @@ func TestDestroyWithErrorDeletingVolumes(t *testing.T) {
}

ld := localDestroyCommand{
manifest: fakeManifest,
configMapHandler: newConfigmapHandler(fakeClient),
nsDestroyer: destroyer,
executor: executor,
k8sClientProvider: k8sClientProvider,
&localDestroyAllCommand{
configMapHandler: newConfigmapHandler(fakeClient),
nsDestroyer: destroyer,
executor: executor,
k8sClientProvider: k8sClientProvider,
},
fakeManifest,
}

err = ld.runDestroy(ctx, opts)
Expand Down Expand Up @@ -215,12 +217,14 @@ func TestDestroyWithErrorListingSecrets(t *testing.T) {
}

ld := localDestroyCommand{
manifest: tt.manifest,
configMapHandler: newConfigmapHandler(fakeClient),
nsDestroyer: &fakeDestroyer{},
executor: executor,
k8sClientProvider: k8sClientProvider,
secrets: &secretHandler,
&localDestroyAllCommand{
configMapHandler: newConfigmapHandler(fakeClient),
nsDestroyer: &fakeDestroyer{},
executor: executor,
k8sClientProvider: k8sClientProvider,
secrets: &secretHandler,
},
tt.manifest,
}

err = ld.runDestroy(ctx, opts)
Expand Down Expand Up @@ -356,12 +360,14 @@ func TestDestroyWithError(t *testing.T) {
}

ld := localDestroyCommand{
manifest: tt.manifest,
secrets: &secretHandler,
executor: executor,
nsDestroyer: destroyer,
k8sClientProvider: k8sClientProvider,
configMapHandler: newConfigmapHandler(fakeClient),
&localDestroyAllCommand{
configMapHandler: newConfigmapHandler(fakeClient),
nsDestroyer: destroyer,
executor: executor,
k8sClientProvider: k8sClientProvider,
secrets: &secretHandler,
},
tt.manifest,
}

err = ld.runDestroy(ctx, opts)
Expand Down Expand Up @@ -595,13 +601,16 @@ func TestDestroyWithoutError(t *testing.T) {
if err != nil {
t.Fatal("could not create fake k8s client")
}
ld := &localDestroyCommand{
manifest: tt.manifest,
secrets: &secretHandler,
executor: executor,
nsDestroyer: destroyer,
k8sClientProvider: k8sClientProvider,
configMapHandler: newConfigmapHandler(fakeClient),

ld := localDestroyCommand{
&localDestroyAllCommand{
configMapHandler: newConfigmapHandler(fakeClient),
nsDestroyer: destroyer,
executor: executor,
k8sClientProvider: k8sClientProvider,
secrets: &secretHandler,
},
tt.manifest,
}

err = ld.runDestroy(ctx, opts)
Expand Down Expand Up @@ -840,13 +849,16 @@ func TestDestroyWithoutErrorInsideOktetoDeploy(t *testing.T) {
}
// Set env var destroy inside deploy
t.Setenv(constants.OktetoWithinDeployCommandContextEnvVar, "true")
ld := &localDestroyCommand{
manifest: tt.manifest,
secrets: &secretHandler,
executor: executor,
nsDestroyer: destroyer,
k8sClientProvider: test.NewFakeK8sProvider(),
configMapHandler: newConfigmapHandler(nil),

ld := localDestroyCommand{
&localDestroyAllCommand{
configMapHandler: newConfigmapHandler(nil),
nsDestroyer: destroyer,
executor: executor,
k8sClientProvider: test.NewFakeK8sProvider(),
secrets: &secretHandler,
},
tt.manifest,
}

err := ld.runDestroy(ctx, opts)
Expand Down Expand Up @@ -894,13 +906,15 @@ func TestDestroyWithoutForceOptionAndFailedCommands(t *testing.T) {
t.Fatal("could not create fake k8s client")
}

ld := &localDestroyCommand{
manifest: fakeManifest,
secrets: &secretHandler,
executor: executor,
nsDestroyer: destroyer,
k8sClientProvider: k8sClientProvider,
configMapHandler: newConfigmapHandler(fakeClient),
ld := localDestroyCommand{
&localDestroyAllCommand{
configMapHandler: newConfigmapHandler(fakeClient),
nsDestroyer: destroyer,
executor: executor,
k8sClientProvider: k8sClientProvider,
secrets: &secretHandler,
},
fakeManifest,
}

err = ld.runDestroy(ctx, opts)
Expand Down Expand Up @@ -943,12 +957,14 @@ func TestDestroyWithForceOptionAndFailedCommands(t *testing.T) {
}

ld := localDestroyCommand{
manifest: fakeManifest,
secrets: &secretHandler,
executor: executor,
nsDestroyer: destroyer,
k8sClientProvider: k8sClientProvider,
configMapHandler: newConfigmapHandler(fakeClient),
&localDestroyAllCommand{
configMapHandler: newConfigmapHandler(fakeClient),
nsDestroyer: destroyer,
executor: executor,
k8sClientProvider: k8sClientProvider,
secrets: &secretHandler,
},
fakeManifest,
}

err = ld.runDestroy(ctx, opts)
Expand Down
42 changes: 21 additions & 21 deletions cmd/destroy/local.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@ import (
)

type localDestroyCommand struct {
manifest *model.Manifest
*localDestroyAllCommand
manifest *model.Manifest
}

type localDestroyAllCommand struct {
configMapHandler configMapHandler
nsDestroyer destroyer
executor executor.ManifestExecutor
Expand All @@ -41,17 +45,25 @@ type localDestroyCommand struct {

func newLocalDestroyer(
manifest *model.Manifest,
destroyerAll *localDestroyAllCommand,
) *localDestroyCommand {
return &localDestroyCommand{
destroyerAll,
manifest,
}
}

func newLocalDestroyerAll(
k8sClient *kubernetes.Clientset,
k8sClientProvider okteto.K8sClientProvider,
executor executor.ManifestExecutor,
nsDestroyer destroyer,
oktetoClient *okteto.OktetoClient,
) *localDestroyCommand {
return &localDestroyCommand{
) *localDestroyAllCommand {
return &localDestroyAllCommand{
configMapHandler: newConfigmapHandler(k8sClient),
secrets: secrets.NewSecrets(k8sClient),
k8sClientProvider: k8sClientProvider,
manifest: manifest,
oktetoClient: oktetoClient,
nsDestroyer: nsDestroyer,
executor: executor,
Expand All @@ -68,28 +80,16 @@ func (ld *localDestroyCommand) destroy(ctx context.Context, opts *Options) error
}
}

var err error
// when option --all the cmd will destroy everything at the namespace and return
if opts.DestroyAll {
if !okteto.Context().IsOkteto {
return oktetoErrors.ErrContextIsNotOktetoCluster
}
err = ld.runDestroyAll(ctx, opts)
if err == nil {
oktetoLog.Success("All resources at namespace '%s' where successfully destroyed", opts.Namespace)
}
} else {
err = ld.runDestroy(ctx, opts)
if err == nil {
oktetoLog.Success("Development environment '%s' successfully destroyed", opts.Name)
}
err := ld.runDestroy(ctx, opts)
if err == nil {
oktetoLog.Success("Development environment '%s' successfully destroyed", opts.Name)
}
analytics.TrackDestroy(err == nil, opts.DestroyAll)

return err
}

func (dc *localDestroyCommand) runDestroyAll(ctx context.Context, opts *Options) error {
func (dc *localDestroyAllCommand) destroy(ctx context.Context, opts *Options) error {
oktetoLog.Spinner(fmt.Sprintf("Deleting all in %s namespace", opts.Namespace))
oktetoLog.StartSpinner()
defer oktetoLog.StopSpinner()
Expand Down Expand Up @@ -324,7 +324,7 @@ func (ld *localDestroyCommand) runDestroy(ctx context.Context, opts *Options) er
return commandErr
}

func (ld *localDestroyCommand) waitForNamespaceDestroyAllToComplete(ctx context.Context, namespace string) error {
func (ld *localDestroyAllCommand) waitForNamespaceDestroyAllToComplete(ctx context.Context, namespace string) error {
timeout := 5 * time.Minute
ticker := time.NewTicker(1 * time.Second)
to := time.NewTicker(timeout)
Expand Down

0 comments on commit 35f882a

Please sign in to comment.