constellation/cli/internal/cloudcmd/terminate.go

83 lines
2.2 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-06-07 14:30:41 +00:00
azurecl "github.com/edgelesssys/constellation/cli/internal/azure/client"
2022-06-07 12:52:47 +00:00
gcpcl "github.com/edgelesssys/constellation/cli/internal/gcp/client"
"github.com/edgelesssys/constellation/internal/cloud/cloudprovider"
2022-04-13 11:01:38 +00:00
"github.com/edgelesssys/constellation/internal/state"
)
// Terminator deletes cloud provider resources.
type Terminator struct {
newGCPClient func(ctx context.Context) (gcpclient, error)
newAzureClient func(subscriptionID, tenantID string) (azureclient, error)
}
// NewTerminator create a new cloud terminator.
func NewTerminator() *Terminator {
return &Terminator{
newGCPClient: func(ctx context.Context) (gcpclient, error) {
return gcpcl.NewFromDefault(ctx)
},
newAzureClient: func(subscriptionID, tenantID string) (azureclient, error) {
return azurecl.NewFromDefault(subscriptionID, tenantID)
},
}
}
// 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.GCP:
cl, err := t.newGCPClient(ctx)
if err != nil {
return err
}
defer cl.Close()
return t.terminateGCP(ctx, cl, state)
case cloudprovider.Azure:
cl, err := t.newAzureClient(state.AzureSubscription, state.AzureTenant)
if err != nil {
return err
}
return t.terminateAzure(ctx, cl, state)
default:
return fmt.Errorf("unsupported provider: %s", provider)
}
}
func (t *Terminator) terminateGCP(ctx context.Context, cl gcpclient, state state.ConstellationState) error {
2022-08-01 10:35:35 +00:00
cl.SetState(state)
2022-04-13 11:01:38 +00:00
2022-08-01 14:51:34 +00:00
if err := cl.TerminateLoadBalancers(ctx); err != nil {
2022-06-09 20:26:36 +00:00
return err
}
2022-04-13 11:01:38 +00:00
if err := cl.TerminateInstances(ctx); err != nil {
return err
}
if err := cl.TerminateFirewall(ctx); err != nil {
return err
}
if err := cl.TerminateVPCs(ctx); err != nil {
return err
}
2022-08-23 15:49:55 +00:00
return nil
2022-04-13 11:01:38 +00:00
}
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
}