remove Terraform targets (#1970)

This commit is contained in:
Moritz Sanft 2023-06-27 11:27:50 +02:00 committed by GitHub
parent 0a36ce6171
commit fe0b8c1e5b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 19 additions and 43 deletions

View File

@ -26,7 +26,7 @@ type imageFetcher interface {
type terraformClient interface { type terraformClient interface {
PrepareWorkspace(path string, input terraform.Variables) error PrepareWorkspace(path string, input terraform.Variables) error
CreateCluster(ctx context.Context, logLevel terraform.LogLevel, targets ...string) (terraform.CreateOutput, error) CreateCluster(ctx context.Context, logLevel terraform.LogLevel) (terraform.CreateOutput, error)
CreateIAMConfig(ctx context.Context, provider cloudprovider.Provider, logLevel terraform.LogLevel) (terraform.IAMOutput, error) CreateIAMConfig(ctx context.Context, provider cloudprovider.Provider, logLevel terraform.LogLevel) (terraform.IAMOutput, error)
Destroy(ctx context.Context, logLevel terraform.LogLevel) error Destroy(ctx context.Context, logLevel terraform.LogLevel) error
CleanUpWorkspace() error CleanUpWorkspace() error

View File

@ -45,7 +45,7 @@ type stubTerraformClient struct {
showErr error showErr error
} }
func (c *stubTerraformClient) CreateCluster(_ context.Context, _ terraform.LogLevel, _ ...string) (terraform.CreateOutput, error) { func (c *stubTerraformClient) CreateCluster(_ context.Context, _ terraform.LogLevel) (terraform.CreateOutput, error) {
return terraform.CreateOutput{ return terraform.CreateOutput{
IP: c.ip, IP: c.ip,
Secret: c.initSecret, Secret: c.initSecret,

View File

@ -153,22 +153,16 @@ func (u *upgradeApplyCmd) migrateTerraform(cmd *cobra.Command, file file.Handler
return fmt.Errorf("checking workspace: %w", err) return fmt.Errorf("checking workspace: %w", err)
} }
targets, vars, err := parseTerraformUpgradeVars(cmd, conf, fetcher) vars, err := parseTerraformUpgradeVars(cmd, conf, fetcher)
if err != nil { if err != nil {
return fmt.Errorf("parsing upgrade variables: %w", err) return fmt.Errorf("parsing upgrade variables: %w", err)
} }
if len(targets) == 0 {
u.log.Debugf("No targets specified. Skipping Terraform migration")
return nil
}
u.log.Debugf("Using migration targets:\n%v", targets)
u.log.Debugf("Using Terraform variables:\n%v", vars) u.log.Debugf("Using Terraform variables:\n%v", vars)
opts := upgrade.TerraformUpgradeOptions{ opts := upgrade.TerraformUpgradeOptions{
LogLevel: flags.terraformLogLevel, LogLevel: flags.terraformLogLevel,
CSP: conf.GetProvider(), CSP: conf.GetProvider(),
Vars: vars, Vars: vars,
Targets: targets,
OutputFile: constants.TerraformMigrationOutputFile, OutputFile: constants.TerraformMigrationOutputFile,
} }
@ -210,14 +204,14 @@ func (u *upgradeApplyCmd) migrateTerraform(cmd *cobra.Command, file file.Handler
} }
// parseTerraformUpgradeVars parses the variables required to execute the Terraform script with. // parseTerraformUpgradeVars parses the variables required to execute the Terraform script with.
func parseTerraformUpgradeVars(cmd *cobra.Command, conf *config.Config, fetcher imageFetcher) ([]string, terraform.Variables, error) { func parseTerraformUpgradeVars(cmd *cobra.Command, conf *config.Config, fetcher imageFetcher) (terraform.Variables, error) {
// Fetch variables to execute Terraform script with // Fetch variables to execute Terraform script with
provider := conf.GetProvider() provider := conf.GetProvider()
attestationVariant := conf.GetAttestationConfig().GetVariant() attestationVariant := conf.GetAttestationConfig().GetVariant()
region := conf.GetRegion() region := conf.GetRegion()
imageRef, err := fetcher.FetchReference(cmd.Context(), provider, attestationVariant, conf.Image, region) imageRef, err := fetcher.FetchReference(cmd.Context(), provider, attestationVariant, conf.Image, region)
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("fetching image reference: %w", err) return nil, fmt.Errorf("fetching image reference: %w", err)
} }
commonVariables := terraform.CommonVariables{ commonVariables := terraform.CommonVariables{
@ -229,8 +223,6 @@ func parseTerraformUpgradeVars(cmd *cobra.Command, conf *config.Config, fetcher
switch conf.GetProvider() { switch conf.GetProvider() {
case cloudprovider.AWS: case cloudprovider.AWS:
targets := []string{}
vars := &terraform.AWSClusterVariables{ vars := &terraform.AWSClusterVariables{
CommonVariables: commonVariables, CommonVariables: commonVariables,
StateDiskType: conf.Provider.AWS.StateDiskType, StateDiskType: conf.Provider.AWS.StateDiskType,
@ -242,10 +234,8 @@ func parseTerraformUpgradeVars(cmd *cobra.Command, conf *config.Config, fetcher
IAMProfileWorkerNodes: conf.Provider.AWS.IAMProfileWorkerNodes, IAMProfileWorkerNodes: conf.Provider.AWS.IAMProfileWorkerNodes,
Debug: conf.IsDebugCluster(), Debug: conf.IsDebugCluster(),
} }
return targets, vars, nil return vars, nil
case cloudprovider.Azure: case cloudprovider.Azure:
targets := []string{"azurerm_attestation_provider.attestation_provider", "module.scale_set_group", "module.scale_set_control_plane", "module.scale_set_worker"}
// Azure Terraform provider is very strict about it's casing // Azure Terraform provider is very strict about it's casing
imageRef = strings.Replace(imageRef, "CommunityGalleries", "communityGalleries", 1) imageRef = strings.Replace(imageRef, "CommunityGalleries", "communityGalleries", 1)
imageRef = strings.Replace(imageRef, "Images", "images", 1) imageRef = strings.Replace(imageRef, "Images", "images", 1)
@ -275,10 +265,8 @@ func parseTerraformUpgradeVars(cmd *cobra.Command, conf *config.Config, fetcher
CreateMAA: toPtr(conf.GetAttestationConfig().GetVariant().Equal(variant.AzureSEVSNP{})), CreateMAA: toPtr(conf.GetAttestationConfig().GetVariant().Equal(variant.AzureSEVSNP{})),
Debug: toPtr(conf.IsDebugCluster()), Debug: toPtr(conf.IsDebugCluster()),
} }
return targets, vars, nil return vars, nil
case cloudprovider.GCP: case cloudprovider.GCP:
targets := []string{}
vars := &terraform.GCPClusterVariables{ vars := &terraform.GCPClusterVariables{
Name: conf.Name, Name: conf.Name,
NodeGroups: map[string]terraform.GCPNodeGroup{ NodeGroups: map[string]terraform.GCPNodeGroup{
@ -303,9 +291,9 @@ func parseTerraformUpgradeVars(cmd *cobra.Command, conf *config.Config, fetcher
ImageID: imageRef, ImageID: imageRef,
Debug: conf.IsDebugCluster(), Debug: conf.IsDebugCluster(),
} }
return targets, vars, nil return vars, nil
default: default:
return nil, nil, fmt.Errorf("unsupported provider: %s", conf.GetProvider()) return nil, fmt.Errorf("unsupported provider: %s", conf.GetProvider())
} }
} }

View File

@ -208,18 +208,16 @@ func (u *upgradeCheckCmd) upgradeCheck(cmd *cobra.Command, fileHandler file.Hand
return fmt.Errorf("checking workspace: %w", err) return fmt.Errorf("checking workspace: %w", err)
} }
targets, vars, err := parseTerraformUpgradeVars(cmd, conf, u.imagefetcher) vars, err := parseTerraformUpgradeVars(cmd, conf, u.imagefetcher)
if err != nil { if err != nil {
return fmt.Errorf("parsing upgrade variables: %w", err) return fmt.Errorf("parsing upgrade variables: %w", err)
} }
u.log.Debugf("Using migration targets:\n%v", targets)
u.log.Debugf("Using Terraform variables:\n%v", vars) u.log.Debugf("Using Terraform variables:\n%v", vars)
opts := upgrade.TerraformUpgradeOptions{ opts := upgrade.TerraformUpgradeOptions{
LogLevel: flags.terraformLogLevel, LogLevel: flags.terraformLogLevel,
CSP: conf.GetProvider(), CSP: conf.GetProvider(),
Vars: vars, Vars: vars,
Targets: targets,
OutputFile: constants.TerraformMigrationOutputFile, OutputFile: constants.TerraformMigrationOutputFile,
} }

View File

@ -96,7 +96,7 @@ func (c *Client) PrepareUpgradeWorkspace(path, oldWorkingDir, newWorkingDir, bac
} }
// CreateCluster creates a Constellation cluster using Terraform. // CreateCluster creates a Constellation cluster using Terraform.
func (c *Client) CreateCluster(ctx context.Context, logLevel LogLevel, targets ...string) (CreateOutput, error) { func (c *Client) CreateCluster(ctx context.Context, logLevel LogLevel) (CreateOutput, error) {
if err := c.setLogLevel(logLevel); err != nil { if err := c.setLogLevel(logLevel); err != nil {
return CreateOutput{}, fmt.Errorf("set terraform log level %s: %w", logLevel.String(), err) return CreateOutput{}, fmt.Errorf("set terraform log level %s: %w", logLevel.String(), err)
} }
@ -105,12 +105,7 @@ func (c *Client) CreateCluster(ctx context.Context, logLevel LogLevel, targets .
return CreateOutput{}, fmt.Errorf("terraform init: %w", err) return CreateOutput{}, fmt.Errorf("terraform init: %w", err)
} }
opts := []tfexec.ApplyOption{} if err := c.tf.Apply(ctx); err != nil {
for _, target := range targets {
opts = append(opts, tfexec.Target(target))
}
if err := c.tf.Apply(ctx, opts...); err != nil {
return CreateOutput{}, fmt.Errorf("terraform apply: %w", err) return CreateOutput{}, fmt.Errorf("terraform apply: %w", err)
} }
@ -292,7 +287,7 @@ func (c *Client) CreateIAMConfig(ctx context.Context, provider cloudprovider.Pro
// Plan determines the diff that will be applied by Terraform. The plan output is written to the planFile. // Plan determines the diff that will be applied by Terraform. The plan output is written to the planFile.
// If there is a diff, the returned bool is true. Otherwise, it is false. // If there is a diff, the returned bool is true. Otherwise, it is false.
func (c *Client) Plan(ctx context.Context, logLevel LogLevel, planFile string, targets ...string) (bool, error) { func (c *Client) Plan(ctx context.Context, logLevel LogLevel, planFile string) (bool, error) {
if err := c.setLogLevel(logLevel); err != nil { if err := c.setLogLevel(logLevel); err != nil {
return false, fmt.Errorf("set terraform log level %s: %w", logLevel.String(), err) return false, fmt.Errorf("set terraform log level %s: %w", logLevel.String(), err)
} }
@ -304,9 +299,6 @@ func (c *Client) Plan(ctx context.Context, logLevel LogLevel, planFile string, t
opts := []tfexec.PlanOption{ opts := []tfexec.PlanOption{
tfexec.Out(planFile), tfexec.Out(planFile),
} }
for _, target := range targets {
opts = append(opts, tfexec.Target(target))
}
return c.tf.Plan(ctx, opts...) return c.tf.Plan(ctx, opts...)
} }

View File

@ -46,8 +46,6 @@ type TerraformUpgradeOptions struct {
CSP cloudprovider.Provider CSP cloudprovider.Provider
// Vars are the Terraform variables used for the upgrade. // Vars are the Terraform variables used for the upgrade.
Vars terraform.Variables Vars terraform.Variables
// Targets are the Terraform targets used for the upgrade.
Targets []string
// OutputFile is the file to write the Terraform output to. // OutputFile is the file to write the Terraform output to.
OutputFile string OutputFile string
} }
@ -102,7 +100,7 @@ func (u *TerraformUpgrader) PlanTerraformMigrations(ctx context.Context, opts Te
return false, fmt.Errorf("preparing terraform workspace: %w", err) return false, fmt.Errorf("preparing terraform workspace: %w", err)
} }
hasDiff, err := u.tf.Plan(ctx, opts.LogLevel, constants.TerraformUpgradePlanFile, opts.Targets...) hasDiff, err := u.tf.Plan(ctx, opts.LogLevel, constants.TerraformUpgradePlanFile)
if err != nil { if err != nil {
return false, fmt.Errorf("terraform plan: %w", err) return false, fmt.Errorf("terraform plan: %w", err)
} }
@ -137,7 +135,7 @@ func (u *TerraformUpgrader) CleanUpTerraformMigrations(fileHandler file.Handler,
// In case of a successful upgrade, the output will be written to the specified file and the old Terraform directory is replaced // In case of a successful upgrade, the output will be written to the specified file and the old Terraform directory is replaced
// By the new one. // By the new one.
func (u *TerraformUpgrader) ApplyTerraformMigrations(ctx context.Context, fileHandler file.Handler, opts TerraformUpgradeOptions, upgradeID string) error { func (u *TerraformUpgrader) ApplyTerraformMigrations(ctx context.Context, fileHandler file.Handler, opts TerraformUpgradeOptions, upgradeID string) error {
tfOutput, err := u.tf.CreateCluster(ctx, opts.LogLevel, opts.Targets...) tfOutput, err := u.tf.CreateCluster(ctx, opts.LogLevel)
if err != nil { if err != nil {
return fmt.Errorf("terraform apply: %w", err) return fmt.Errorf("terraform apply: %w", err)
} }
@ -180,8 +178,8 @@ func (u *TerraformUpgrader) ApplyTerraformMigrations(ctx context.Context, fileHa
type tfClient interface { type tfClient interface {
PrepareUpgradeWorkspace(path, oldWorkingDir, newWorkingDir, upgradeID string, vars terraform.Variables) error PrepareUpgradeWorkspace(path, oldWorkingDir, newWorkingDir, upgradeID string, vars terraform.Variables) error
ShowPlan(ctx context.Context, logLevel terraform.LogLevel, planFilePath string, output io.Writer) error ShowPlan(ctx context.Context, logLevel terraform.LogLevel, planFilePath string, output io.Writer) error
Plan(ctx context.Context, logLevel terraform.LogLevel, planFile string, targets ...string) (bool, error) Plan(ctx context.Context, logLevel terraform.LogLevel, planFile string) (bool, error)
CreateCluster(ctx context.Context, logLevel terraform.LogLevel, targets ...string) (terraform.CreateOutput, error) CreateCluster(ctx context.Context, logLevel terraform.LogLevel) (terraform.CreateOutput, error)
} }
// policyPatcher interacts with the CSP (currently only applies for Azure) to update the attestation policy. // policyPatcher interacts with the CSP (currently only applies for Azure) to update the attestation policy.

View File

@ -356,11 +356,11 @@ func (u *stubTerraformClient) ShowPlan(context.Context, terraform.LogLevel, stri
return u.showErr return u.showErr
} }
func (u *stubTerraformClient) Plan(context.Context, terraform.LogLevel, string, ...string) (bool, error) { func (u *stubTerraformClient) Plan(context.Context, terraform.LogLevel, string) (bool, error) {
return u.hasDiff, u.planErr return u.hasDiff, u.planErr
} }
func (u *stubTerraformClient) CreateCluster(context.Context, terraform.LogLevel, ...string) (terraform.CreateOutput, error) { func (u *stubTerraformClient) CreateCluster(context.Context, terraform.LogLevel) (terraform.CreateOutput, error) {
return terraform.CreateOutput{}, u.CreateClusterErr return terraform.CreateOutput{}, u.CreateClusterErr
} }