Skip to content
Merged
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
27 changes: 19 additions & 8 deletions internal/cmd/module/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/kyma-project/cli.v3/internal/clierror"
"github.com/kyma-project/cli.v3/internal/cmdcommon"
"github.com/kyma-project/cli.v3/internal/cmdcommon/prompt"
"github.com/kyma-project/cli.v3/internal/kube"
"github.com/kyma-project/cli.v3/internal/modules"
"github.com/kyma-project/cli.v3/internal/modules/repo"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -48,11 +49,19 @@ func runDelete(cfg *deleteConfig) clierror.Error {
if clierr != nil {
return clierr
}
moduleTemplatesRepo := repo.NewModuleTemplatesRepo(client)

communityDeletionApproved := false
if cfg.community && !cfg.autoApprove {
runningResources, clierr := modules.GetRunningResourcesOfCommunityModule(cfg.Ctx, moduleTemplatesRepo, cfg.module)
if cfg.community {
return uninstallCommunityModule(cfg, client)
}

return disableModule(cfg, client)
}

func uninstallCommunityModule(cfg *deleteConfig, client kube.Client) clierror.Error {
repo := repo.NewModuleTemplatesRepo(client)

if !cfg.autoApprove {
runningResources, clierr := modules.GetRunningResourcesOfCommunityModule(cfg.Ctx, repo, cfg.module)
if clierr != nil {
return clierr
}
Expand All @@ -66,12 +75,14 @@ func runDelete(cfg *deleteConfig) clierror.Error {
if !confirmation {
return nil
}

communityDeletionApproved = true
}
}

if !communityDeletionApproved && !cfg.autoApprove {
return modules.Uninstall(cfg.Ctx, repo, cfg.module)
}

func disableModule(cfg *deleteConfig, client kube.Client) clierror.Error {
if !cfg.autoApprove {
confirmationPrompt := prompt.NewBool(prepareCorePromptMessage(cfg.module), false)
confirmation, err := confirmationPrompt.Prompt()
if err != nil {
Expand All @@ -83,7 +94,7 @@ func runDelete(cfg *deleteConfig) clierror.Error {
}
}

return modules.Disable(cfg.Ctx, client, moduleTemplatesRepo, cfg.module, cfg.community)
return modules.Disable(cfg.Ctx, client, cfg.module)
}

func prepareCommunityPromptMessage(resourcesNames []string) string {
Expand Down
90 changes: 3 additions & 87 deletions internal/modules/disable.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,109 +3,25 @@ package modules
import (
"context"
"fmt"
"slices"
"time"

"github.com/kyma-project/cli.v3/internal/clierror"
"github.com/kyma-project/cli.v3/internal/kube"
"github.com/kyma-project/cli.v3/internal/kube/kyma"
"github.com/kyma-project/cli.v3/internal/kube/rootlessdynamic"
"github.com/kyma-project/cli.v3/internal/modules/repo"
"github.com/kyma-project/cli.v3/internal/out"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/watch"
)

// Disable takes care about disabling module whatever if CustomResourcePolicy is set to Ignore or CreateAndDelete
// if CustomResourcePolicy is Ignore then it first deletes module CR and waits for removal
// at the end removes module from the target Kyma environment
func Disable(ctx context.Context, client kube.Client, repo repo.ModuleTemplatesRepository, module string, community bool) clierror.Error {
if community {
return disableCommunity(out.Default, ctx, repo, module)
}
return disableCore(out.Default, ctx, client, module)
}

func GetRunningResourcesOfCommunityModule(ctx context.Context, repo repo.ModuleTemplatesRepository, module string) ([]string, clierror.Error) {
moduleTemplateToDelete, err := getModuleTemplateToDelete(ctx, repo, module)
if err != nil {
return nil, clierror.Wrap(err, clierror.New(fmt.Sprintf("failed to retrieve the module %v", module)))
}
runningResources, err := repo.RunningAssociatedResourcesOfModule(ctx, *moduleTemplateToDelete)
if err != nil {
return nil, clierror.Wrap(err, clierror.New(fmt.Sprintf("failed to retrieve running resources of the %s module", module)))
}

var runningResourcesNames []string

for _, resource := range runningResources {
runningResourcesNames = append(runningResourcesNames, fmt.Sprintf("%s (%s)", resource.GetName(), resource.GetKind()))
}

return runningResourcesNames, nil
}

func disableCommunity(printer *out.Printer, ctx context.Context, repo repo.ModuleTemplatesRepository, module string) clierror.Error {
printer.Msgfln("removing %s community module from the target Kyma environment", module)

moduleTemplateToDelete, err := getModuleTemplateToDelete(ctx, repo, module)
if err != nil {
return clierror.Wrap(err, clierror.New(fmt.Sprintf("failed to retrieve the module %v", module)))
}
moduleResources, err := repo.Resources(ctx, *moduleTemplateToDelete)
if err != nil {
return clierror.Wrap(err, clierror.New(fmt.Sprintf("failed to get resources for module %v", moduleTemplateToDelete.Spec.ModuleName)))
}

// We want to remove resources in the reversed order
slices.Reverse(moduleResources)

removedSuccessfully := true

for _, resource := range moduleResources {
resourceWatcher, err := repo.DeleteResourceReturnWatcher(ctx, resource)
r := unstructured.Unstructured{Object: resource}
if err != nil {
removedSuccessfully = false
printer.Msgfln("failed to delete resource %s (%s): %v", r.GetName(), r.GetKind(), err)
continue
}
printer.Msgfln("waiting for resource deletion: %s (%s)", r.GetName(), r.GetKind())
timeoutCtx, cancel := context.WithTimeout(ctx, time.Second*100)
defer cancel()

clierr := waitForDeletion(timeoutCtx, resourceWatcher)
if clierr != nil {
return clierr
}
}

if removedSuccessfully {
printer.Msgfln("%s community module successfully removed", module)
} else {
printer.Msgfln("some errors occured during the %s community module removal", module)
}

return nil
}

func getModuleTemplateToDelete(ctx context.Context, repo repo.ModuleTemplatesRepository, module string) (*kyma.ModuleTemplate, error) {
installedModulesWithName, err := repo.CommunityInstalledByName(ctx, module)
if err != nil {
return nil, fmt.Errorf("failed to retrieve a list of installed community modules: %v", err)
}
if len(installedModulesWithName) == 0 {
return nil, fmt.Errorf("failed to find any version of the module %s", module)
}
if len(installedModulesWithName) > 1 {
return nil, fmt.Errorf("failed to determine module version for %s", module)
}

return &installedModulesWithName[0], nil
func Disable(ctx context.Context, client kube.Client, module string) clierror.Error {
return disable(out.Default, ctx, client, module)
}

func disableCore(printer *out.Printer, ctx context.Context, client kube.Client, module string) clierror.Error {
func disable(printer *out.Printer, ctx context.Context, client kube.Client, module string) clierror.Error {
clierr := removeModuleCR(printer, ctx, client, module)
if clierr != nil {
return clierr
Expand Down
Loading