constellation/cli/internal/cloudcmd/terminate.go

94 lines
2.6 KiB
Go
Raw Normal View History

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
2022-04-13 11:01:38 +00:00
package cloudcmd
import (
"context"
"fmt"
2022-09-21 11:47:57 +00:00
azurecl "github.com/edgelesssys/constellation/v2/cli/internal/azure/client"
"github.com/edgelesssys/constellation/v2/cli/internal/libvirt"
"github.com/edgelesssys/constellation/v2/cli/internal/terraform"
2022-09-21 11:47:57 +00:00
"github.com/edgelesssys/constellation/v2/internal/cloud/cloudprovider"
"github.com/edgelesssys/constellation/v2/internal/state"
2022-04-13 11:01:38 +00:00
)
// Terminator deletes cloud provider resources.
type Terminator struct {
2022-09-27 07:22:29 +00:00
newTerraformClient func(ctx context.Context) (terraformClient, error)
newAzureClient func(subscriptionID, tenantID string) (azureclient, error)
newLibvirtRunner func() libvirtRunner
2022-04-13 11:01:38 +00:00
}
// NewTerminator create a new cloud terminator.
func NewTerminator() *Terminator {
return &Terminator{
2022-09-27 07:22:29 +00:00
newTerraformClient: func(ctx context.Context) (terraformClient, error) {
return terraform.New(ctx, cloudprovider.GCP)
2022-04-13 11:01:38 +00:00
},
newAzureClient: func(subscriptionID, tenantID string) (azureclient, error) {
return azurecl.NewFromDefault(subscriptionID, tenantID)
},
newLibvirtRunner: func() libvirtRunner {
return libvirt.New()
},
2022-04-13 11:01:38 +00:00
}
}
// Terminate deletes the could provider resources defined in the constellation state.
func (t *Terminator) Terminate(ctx context.Context, state state.ConstellationState) error {
provider := cloudprovider.FromString(state.CloudProvider)
switch provider {
case cloudprovider.Azure:
cl, err := t.newAzureClient(state.AzureSubscription, state.AzureTenant)
if err != nil {
return err
}
return t.terminateAzure(ctx, cl, state)
2022-09-27 07:22:29 +00:00
case cloudprovider.GCP:
cl, err := t.newTerraformClient(ctx)
if err != nil {
return err
}
defer cl.RemoveInstaller()
2022-09-27 07:22:29 +00:00
return t.terminateTerraform(ctx, cl)
case cloudprovider.QEMU:
cl, err := t.newTerraformClient(ctx)
if err != nil {
return err
}
defer cl.RemoveInstaller()
libvirt := t.newLibvirtRunner()
return t.terminateQEMU(ctx, cl, libvirt)
2022-04-13 11:01:38 +00:00
default:
return fmt.Errorf("unsupported provider: %s", provider)
}
}
func (t *Terminator) terminateAzure(ctx context.Context, cl azureclient, state state.ConstellationState) error {
2022-08-01 10:35:35 +00:00
cl.SetState(state)
2022-04-13 11:01:38 +00:00
return cl.TerminateResourceGroupResources(ctx)
2022-04-13 11:01:38 +00:00
}
2022-09-27 07:22:29 +00:00
func (t *Terminator) terminateTerraform(ctx context.Context, cl terraformClient) error {
if err := cl.DestroyCluster(ctx); err != nil {
return err
}
return cl.CleanUpWorkspace()
}
func (t *Terminator) terminateQEMU(ctx context.Context, cl terraformClient, lv libvirtRunner) error {
if err := cl.DestroyCluster(ctx); err != nil {
return err
}
if err := lv.Stop(ctx); err != nil {
return err
}
return cl.CleanUpWorkspace()
}