From 015e953df3c72437e2db3715caa7fcf3276b6857 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Mon, 27 Jan 2025 13:45:53 -0500 Subject: [PATCH 1/7] feat: add scaffolding for deploying bundles built from a .tf source config --- src/cmd/common.go | 34 ++++++++++++++++++++++++++++++---- src/cmd/dev.go | 35 +++++++++++++++++++++++++++++++++++ src/pkg/bundle/deploy.go | 8 ++++++++ src/pkg/bundle/dev.go | 4 ++++ 4 files changed, 77 insertions(+), 4 deletions(-) diff --git a/src/cmd/common.go b/src/cmd/common.go index fa11498e..71d48f68 100644 --- a/src/cmd/common.go +++ b/src/cmd/common.go @@ -51,7 +51,12 @@ func isValidConfigOption(str string) bool { // deploy performs validation, confirmation and deployment of a bundle func deploy(bndlClient *bundle.Bundle) error { - _, _, _, err := bndlClient.PreDeployValidation() + var err error + if bundleCfg.IsTofu { + _, _, _, err = bndlClient.PreDeployValidationTF() + } else { + _, _, _, err = bndlClient.PreDeployValidation() + } if err != nil { return fmt.Errorf("failed to validate bundle: %s", err.Error()) } @@ -62,9 +67,30 @@ func deploy(bndlClient *bundle.Bundle) error { } // deploy the bundle - if err := bndlClient.Deploy(); err != nil { - bndlClient.ClearPaths() - return fmt.Errorf("failed to deploy bundle: %s", err.Error()) + if bundleCfg.IsTofu { + // extract the tarballs! + if err := bndlClient.Extract(bndlClient.GetDefaultExtractPath()); err != nil { + return fmt.Errorf("failed to extract packages from budnle: %s", err.Error()) + } + + // TODO: @JPERRY Everything below this feels absoutly gross, but I want to get this to a working state before I start cleaning up and optimizing + // Navigate to the directory that the `main.tf` file was written to (the tmp dir) + if err := os.Chdir(filepath.Dir(bndlClient.GetDefaultExtractPath())); err != nil { + return fmt.Errorf("unable to change directories to where the main.tf is stored: %s", err.Error()) + } + + // Run the `tofu apply` command + os.Args = []string{"tofu", "apply"} + err := useEmbeddedTofu() + if err != nil { + message.Warnf("unable to deploy bundle that was built from a .tf file: %s", err.Error()) + return err + } + } else { + if err := bndlClient.Deploy(); err != nil { + bndlClient.ClearPaths() + return fmt.Errorf("failed to deploy bundle: %s", err.Error()) + } } return nil diff --git a/src/cmd/dev.go b/src/cmd/dev.go index 69b1d471..d6b3e0ba 100644 --- a/src/cmd/dev.go +++ b/src/cmd/dev.go @@ -22,6 +22,40 @@ var devCmd = &cobra.Command{ Short: lang.CmdDevShort, } +var tofuDeployCmd = &cobra.Command{ + Use: "tofu-deploy [BUNDLE_TARBALL|OCI_REF]", + Aliases: []string{"d"}, + Short: lang.CmdBundleDeployShort, + Args: cobra.MaximumNArgs(1), + RunE: func(_ *cobra.Command, args []string) error { + var err error + bundleCfg.DeployOpts.Source, err = chooseBundle(args) + if err != nil { + return err + } + configureZarf() + + // set DeployOptions.Config if exists + if config := v.ConfigFileUsed(); config != "" { + bundleCfg.DeployOpts.Config = config + } + + bundleCfg.IsTofu = true + + // create new bundle client and deploy + bndlClient, err := bundle.New(&bundleCfg) + if err != nil { + return err + } + defer bndlClient.ClearPaths() + err = deploy(bndlClient) + if err != nil { + return err + } + return nil + }, +} + var tofuCreateCmd = &cobra.Command{ Use: "tofu-create [DIRECTORY]", Aliases: []string{"c"}, @@ -232,4 +266,5 @@ func init() { devCmd.AddCommand(extractCmd) extractCmd.Flags().BoolVar(&bundleCfg.IsTofu, "is-tofu", false, "indicates if the package was built from a uds-bundle.tf") devCmd.AddCommand(tofuCreateCmd) + devCmd.AddCommand(tofuDeployCmd) } diff --git a/src/pkg/bundle/deploy.go b/src/pkg/bundle/deploy.go index 92ccf43f..bc23f898 100644 --- a/src/pkg/bundle/deploy.go +++ b/src/pkg/bundle/deploy.go @@ -264,6 +264,14 @@ func (b *Bundle) PreDeployValidationTF() (string, string, string, error) { if err != nil { return "", "", "", err } + + // Copy the .tf contents from the file at `/{tmpdir}/blobs/sha256/{SHASUM}` to `/{tmpdir}/main.tf` + // This makes it a lot easier for tofu to find and use the config file + err = os.WriteFile(filepath.Join(b.tmp, "main.tf"), bundleTF, 0600) + if err != nil { + return "", "", "", err + } + // parse the tf config tfConfig, err := tfparser.ParseFile(filepaths[config.BundleTF]) if err != nil { diff --git a/src/pkg/bundle/dev.go b/src/pkg/bundle/dev.go index 91c1e25a..cd1a1119 100644 --- a/src/pkg/bundle/dev.go +++ b/src/pkg/bundle/dev.go @@ -134,6 +134,10 @@ func (b *Bundle) extractPackage(path string, pkg types.Package) error { return nil } +func (b *Bundle) GetDefaultExtractPath() string { + return filepath.Join(b.tmp, "extracted-packages") +} + func (b *Bundle) Extract(path string) error { // Create the directory that we will store the extract tarballs into if err := helpers.CreateDirectory(path, helpers.ReadWriteExecuteUser); err != nil { From 9066d7ce0b1464e32130698f05402ac45c1bf860 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Wed, 29 Jan 2025 13:18:10 -0500 Subject: [PATCH 2/7] chore: add TofuOptions struct to capture flags and overrides for tofu related commands --- src/cmd/common.go | 6 +++--- src/cmd/dev.go | 10 ++++++---- src/pkg/bundle/create.go | 8 ++++---- src/types/options.go | 6 +++++- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/cmd/common.go b/src/cmd/common.go index 71d48f68..0e59d319 100644 --- a/src/cmd/common.go +++ b/src/cmd/common.go @@ -52,7 +52,7 @@ func isValidConfigOption(str string) bool { // deploy performs validation, confirmation and deployment of a bundle func deploy(bndlClient *bundle.Bundle) error { var err error - if bundleCfg.IsTofu { + if bundleCfg.TofuOpts.IsTofu { _, _, _, err = bndlClient.PreDeployValidationTF() } else { _, _, _, err = bndlClient.PreDeployValidation() @@ -67,8 +67,8 @@ func deploy(bndlClient *bundle.Bundle) error { } // deploy the bundle - if bundleCfg.IsTofu { - // extract the tarballs! + if bundleCfg.TofuOpts.IsTofu { + // extract the tarballs of the Zarf Packages within the bundle if err := bndlClient.Extract(bndlClient.GetDefaultExtractPath()); err != nil { return fmt.Errorf("failed to extract packages from budnle: %s", err.Error()) } diff --git a/src/cmd/dev.go b/src/cmd/dev.go index d6b3e0ba..6d6e43db 100644 --- a/src/cmd/dev.go +++ b/src/cmd/dev.go @@ -28,6 +28,8 @@ var tofuDeployCmd = &cobra.Command{ Short: lang.CmdBundleDeployShort, Args: cobra.MaximumNArgs(1), RunE: func(_ *cobra.Command, args []string) error { + config.CommonOptions.Confirm = true + var err error bundleCfg.DeployOpts.Source, err = chooseBundle(args) if err != nil { @@ -40,7 +42,7 @@ var tofuDeployCmd = &cobra.Command{ bundleCfg.DeployOpts.Config = config } - bundleCfg.IsTofu = true + bundleCfg.TofuOpts.IsTofu = true // create new bundle client and deploy bndlClient, err := bundle.New(&bundleCfg) @@ -78,7 +80,7 @@ var tofuCreateCmd = &cobra.Command{ srcDir = args[0] } bundleCfg.CreateOpts.SourceDirectory = srcDir - bundleCfg.IsTofu = true + bundleCfg.TofuOpts.IsTofu = true bndlClient, err := bundle.New(&bundleCfg) if err != nil { @@ -197,7 +199,7 @@ var extractCmd = &cobra.Command{ return err } - if bundleCfg.IsTofu { + if bundleCfg.TofuOpts.IsTofu { _, _, _, err = bndlClient.PreDeployValidationTF() } else { _, _, _, err = bndlClient.PreDeployValidation() @@ -264,7 +266,7 @@ func init() { devDeployCmd.Flags().StringToStringVar(&bundleCfg.DeployOpts.SetVariables, "set", nil, lang.CmdBundleDeployFlagSet) devCmd.AddCommand(extractCmd) - extractCmd.Flags().BoolVar(&bundleCfg.IsTofu, "is-tofu", false, "indicates if the package was built from a uds-bundle.tf") + extractCmd.Flags().BoolVar(&bundleCfg.TofuOpts.IsTofu, "is-tofu", false, "indicates if the package was built from a uds-bundle.tf") devCmd.AddCommand(tofuCreateCmd) devCmd.AddCommand(tofuDeployCmd) } diff --git a/src/pkg/bundle/create.go b/src/pkg/bundle/create.go index 23285e0c..3f062fbb 100644 --- a/src/pkg/bundle/create.go +++ b/src/pkg/bundle/create.go @@ -25,7 +25,7 @@ import ( // Create creates a bundle func (b *Bundle) Create() error { // populate the b.bundle struct with information on the packages we are creating - if b.cfg.IsTofu { + if b.cfg.TofuOpts.IsTofu { // read the .tf data to determine which resources (packages) we are creating // TODO: @JEPRRY consider making a helper function for this tfConfig, err := tfparser.ParseFile(b.cfg.CreateOpts.BundleFile) @@ -45,8 +45,8 @@ func (b *Bundle) Create() error { for _, pkg := range tfConfig.Packages { newPackage := types.Package{ Name: pkg.Name, - Repository: pkg.OCIUrl, - Ref: pkg.Ref, + Repository: pkg.Repository, + Ref: pkg.Version, } b.bundle.Packages = append(b.bundle.Packages, newPackage) } @@ -133,7 +133,7 @@ func (b *Bundle) Create() error { Output: b.cfg.CreateOpts.Output, TmpDstDir: b.tmp, SourceDir: b.cfg.CreateOpts.SourceDirectory, - IsTofu: b.cfg.IsTofu, + IsTofu: b.cfg.TofuOpts.IsTofu, } bundlerClient := bundler.NewBundler(&opts) diff --git a/src/types/options.go b/src/types/options.go index 23154597..137d32af 100644 --- a/src/types/options.go +++ b/src/types/options.go @@ -13,7 +13,11 @@ type BundleConfig struct { InspectOpts BundleInspectOptions RemoveOpts BundleRemoveOptions DevDeployOpts BundleDevDeployOptions - IsTofu bool + TofuOpts TofuOptions +} + +type TofuOptions struct { + IsTofu bool } // BundleCreateOptions is the options for the bundler.Create() function From e3c0d9f5d03ce039867b9105a4ab4325392a1625 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Wed, 29 Jan 2025 13:25:32 -0500 Subject: [PATCH 3/7] chore: update tfparser to parse more values from the uds_package resource --- src/pkg/tfparser/parser.go | 40 ++++++++++++++++++++++++--------- src/pkg/tfparser/parser_test.go | 22 +++++++++--------- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/pkg/tfparser/parser.go b/src/pkg/tfparser/parser.go index b64c7822..280fdf76 100644 --- a/src/pkg/tfparser/parser.go +++ b/src/pkg/tfparser/parser.go @@ -20,10 +20,14 @@ type Provider struct { // Packages represents a uds_package resource in Terraform type Packages struct { - Name string `json:"name"` - Type string `json:"type"` - OCIUrl string `json:"oci_url"` - Ref string `json:"ref,omitempty"` + Name string `json:"name"` + Type string `json:"type"` + Repository string `json:"repository"` + Version string `json:"version,omitempty"` + Path string `json:"path,omitempty"` + + Kind string `json:"kind"` + Components []string `json:"components"` } // TerraformConfig represents the root Terraform configuration @@ -39,7 +43,10 @@ type BundleMetadata struct { Version string `json:"version"` // Kind reflects the type of package; typicaly always UDSBundle Kind string `json:"kind"` + // these are optional + // TODO: Even if these are optional, these should probably be set to empty string so + // that panics don't happen if someone attempts to dereference them in the future? Description *string `json:"description"` URL *string `json:"url"` Architecture *string `json:"architecture"` @@ -95,6 +102,11 @@ func ParseFile(filename string) (*TerraformConfig, error) { } } + // After parsing the bundle config, we should expect to have parsed at least one 'uds_package' resource + if len(config.Packages) == 0 { + return config, fmt.Errorf("expected to parse a uds_package but none found") + } + return config, nil } @@ -168,20 +180,28 @@ func parseUDSPackageBlock(block *hcl.Block) (*Packages, error) { ctx := &hcl.EvalContext{} - if attr, exists := attrs["oci_url"]; exists { + if attr, exists := attrs["repository"]; exists { value, diags := attr.Expr.Value(ctx) if diags.HasErrors() { - return nil, fmt.Errorf("oci_url error: %s", diags.Error()) + return nil, fmt.Errorf("repository error: %s", diags.Error()) } - pkg.OCIUrl = value.AsString() + pkg.Repository = value.AsString() } - if attr, exists := attrs["ref"]; exists { + if attr, exists := attrs["version"]; exists { value, diags := attr.Expr.Value(ctx) if diags.HasErrors() { - return nil, fmt.Errorf("ref error: %s", diags.Error()) + return nil, fmt.Errorf("version error: %s", diags.Error()) + } + pkg.Version = value.AsString() + } + + if attr, exists := attrs["path"]; exists { + value, diags := attr.Expr.Value(ctx) + if diags.HasErrors() { + return nil, fmt.Errorf("path error: %s", diags.Error()) } - pkg.Ref = value.AsString() + pkg.Path = value.AsString() } return pkg, nil diff --git a/src/pkg/tfparser/parser_test.go b/src/pkg/tfparser/parser_test.go index 1d61fc64..6b17abf9 100644 --- a/src/pkg/tfparser/parser_test.go +++ b/src/pkg/tfparser/parser_test.go @@ -62,15 +62,15 @@ resource "uds_package" "prometheus" { }, Packages: []Packages{ { - Name: "init", - OCIUrl: "ghcr.io/zarf-dev/packages/init@v0.46.0", - Ref: "v0.46.0", - Type: "uds_package", + Name: "init", + Repository: "ghcr.io/zarf-dev/packages/init@v0.46.0", + Version: "v0.46.0", + Type: "uds_package", }, { - Name: "prometheus", - OCIUrl: "localhost:888/prometheus@v0.1.0", - Type: "uds_package", + Name: "prometheus", + Repository: "localhost:888/prometheus@v0.1.0", + Type: "uds_package", }, }, Metadata: &BundleMetadata{ @@ -141,10 +141,10 @@ resource "aws_instance" "test" { }, Packages: []Packages{ { - Name: "init", - OCIUrl: "ghcr.io/zarf-dev/packages/init@v0.46.0", - Ref: "v0.46.0", - Type: "uds_package", + Name: "init", + Repository: "ghcr.io/zarf-dev/packages/init@v0.46.0", + Version: "v0.46.0", + Type: "uds_package", }, }, }, From 60d183153c731bcdfd6ebfc83cfbbb1f8b9bc991 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Wed, 29 Jan 2025 13:28:57 -0500 Subject: [PATCH 4/7] chore: reference local tfstate file deploying bundles --- src/cmd/common.go | 17 +++++++++++------ src/cmd/dev.go | 1 + src/pkg/bundle/common.go | 4 ++++ src/types/options.go | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/cmd/common.go b/src/cmd/common.go index 0e59d319..9c46fff5 100644 --- a/src/cmd/common.go +++ b/src/cmd/common.go @@ -73,15 +73,20 @@ func deploy(bndlClient *bundle.Bundle) error { return fmt.Errorf("failed to extract packages from budnle: %s", err.Error()) } - // TODO: @JPERRY Everything below this feels absoutly gross, but I want to get this to a working state before I start cleaning up and optimizing - // Navigate to the directory that the `main.tf` file was written to (the tmp dir) - if err := os.Chdir(filepath.Dir(bndlClient.GetDefaultExtractPath())); err != nil { - return fmt.Errorf("unable to change directories to where the main.tf is stored: %s", err.Error()) + // Determine the location of the local tfstate file + // stateFile := filepath.Join(cwd, "terraform.tfstate") + stateFilepath, err := filepath.Abs(bndlClient.GetTofuStateFilepath()) + if err != nil { + return fmt.Errorf("failed to locate path to tfstate file: %s", err.Error()) } + stateFlag := fmt.Sprintf("-state=%s", stateFilepath) + + // Determine the location of the extracted *.tf files + chdirFlag := fmt.Sprintf("-chdir=%s", filepath.Dir(bndlClient.GetDefaultExtractPath())) // Run the `tofu apply` command - os.Args = []string{"tofu", "apply"} - err := useEmbeddedTofu() + os.Args = []string{"tofu", chdirFlag, "apply", "-input=false", "-auto-approve", stateFlag} + err = useEmbeddedTofu() if err != nil { message.Warnf("unable to deploy bundle that was built from a .tf file: %s", err.Error()) return err diff --git a/src/cmd/dev.go b/src/cmd/dev.go index 6d6e43db..0832f815 100644 --- a/src/cmd/dev.go +++ b/src/cmd/dev.go @@ -269,4 +269,5 @@ func init() { extractCmd.Flags().BoolVar(&bundleCfg.TofuOpts.IsTofu, "is-tofu", false, "indicates if the package was built from a uds-bundle.tf") devCmd.AddCommand(tofuCreateCmd) devCmd.AddCommand(tofuDeployCmd) + tofuDeployCmd.Flags().StringVar(&bundleCfg.TofuOpts.TFStateFilepath, "tf-state", "terraform.tfstate", "Path to TF statefile") } diff --git a/src/pkg/bundle/common.go b/src/pkg/bundle/common.go index 5f2219de..0fc28314 100644 --- a/src/pkg/bundle/common.go +++ b/src/pkg/bundle/common.go @@ -379,3 +379,7 @@ func GetDeployedPackageNames() []string { } return deployedPackageNames } + +func (b *Bundle) GetTofuStateFilepath() string { + return b.cfg.TofuOpts.TFStateFilepath +} diff --git a/src/types/options.go b/src/types/options.go index 137d32af..dbcef472 100644 --- a/src/types/options.go +++ b/src/types/options.go @@ -18,6 +18,7 @@ type BundleConfig struct { type TofuOptions struct { IsTofu bool + TFStateFilepath string } // BundleCreateOptions is the options for the bundler.Create() function From 5382f936d9269880c10c62954a1b673edfb808db Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Mon, 3 Feb 2025 10:04:40 -0500 Subject: [PATCH 5/7] chore: update generated docs --- docs/reference/CLI/commands/uds_dev.md | 1 + .../CLI/commands/uds_dev_tofu-deploy.md | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 docs/reference/CLI/commands/uds_dev_tofu-deploy.md diff --git a/docs/reference/CLI/commands/uds_dev.md b/docs/reference/CLI/commands/uds_dev.md index 0a835e68..6eb65a03 100644 --- a/docs/reference/CLI/commands/uds_dev.md +++ b/docs/reference/CLI/commands/uds_dev.md @@ -32,4 +32,5 @@ description: UDS CLI command reference for uds dev. * [uds dev deploy](/reference/cli/commands/uds_dev_deploy/) - [beta] Creates and deploys a UDS bundle in dev mode * [uds dev extract](/reference/cli/commands/uds_dev_extract/) - [alpha] Extract the Zarf Package tarballs from a Bundle * [uds dev tofu-create](/reference/cli/commands/uds_dev_tofu-create/) - create bundle from a uds-bundle.tf config +* [uds dev tofu-deploy](/reference/cli/commands/uds_dev_tofu-deploy/) - Deploy a bundle from a local tarball or oci:// URL diff --git a/docs/reference/CLI/commands/uds_dev_tofu-deploy.md b/docs/reference/CLI/commands/uds_dev_tofu-deploy.md new file mode 100644 index 00000000..de726c44 --- /dev/null +++ b/docs/reference/CLI/commands/uds_dev_tofu-deploy.md @@ -0,0 +1,37 @@ +--- +title: uds dev tofu-deploy +description: UDS CLI command reference for uds dev tofu-deploy. +--- +## uds dev tofu-deploy + +Deploy a bundle from a local tarball or oci:// URL + +``` +uds dev tofu-deploy [BUNDLE_TARBALL|OCI_REF] [flags] +``` + +### Options + +``` + -h, --help help for tofu-deploy + --tf-state string Path to TF statefile (default "terraform.tfstate") +``` + +### Options inherited from parent commands + +``` + -a, --architecture string Architecture for UDS bundles and Zarf packages + --insecure Allow access to insecure registries and disable other recommended security enforcements such as package checksum and signature validation. This flag should only be used if you have a specific reason and accept the reduced security posture. + -l, --log-level string Log level when running UDS-CLI. Valid options are: warn, info, debug, trace (default "info") + --no-color Disable color output + --no-log-file Disable log file creation + --no-progress Disable fancy UI progress bars, spinners, logos, etc + --oci-concurrency int Number of concurrent layer operations to perform when interacting with a remote bundle. (default 3) + --tmpdir string Specify the temporary directory to use for intermediate files + --uds-cache string Specify the location of the UDS cache directory (default "~/.uds-cache") +``` + +### SEE ALSO + +* [uds dev](/reference/cli/commands/uds_dev/) - [beta] Commands useful for developing bundles + From 090d7bb5fc239f71252af4611459c039bc9e14e9 Mon Sep 17 00:00:00 2001 From: Jon Perry Date: Mon, 3 Feb 2025 10:43:37 -0500 Subject: [PATCH 6/7] chore: update tfparser tests --- src/pkg/tfparser/parser_test.go | 35 ++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/pkg/tfparser/parser_test.go b/src/pkg/tfparser/parser_test.go index 6b17abf9..6868ec06 100644 --- a/src/pkg/tfparser/parser_test.go +++ b/src/pkg/tfparser/parser_test.go @@ -42,12 +42,13 @@ resource "uds_bundle_metadata" "basic" { } resource "uds_package" "init" { - oci_url = "ghcr.io/zarf-dev/packages/init@v0.46.0" - ref = "v0.46.0" + repository = "ghcr.io/zarf-dev/packages/init" + version = "v0.46.0" } resource "uds_package" "prometheus" { - oci_url = "localhost:888/prometheus@v0.1.0" + repository = "localhost:888/prometheus" + version = "v0.1.0" depends_on = [ uds_package.init ] @@ -63,13 +64,14 @@ resource "uds_package" "prometheus" { Packages: []Packages{ { Name: "init", - Repository: "ghcr.io/zarf-dev/packages/init@v0.46.0", + Repository: "ghcr.io/zarf-dev/packages/init", Version: "v0.46.0", Type: "uds_package", }, { Name: "prometheus", - Repository: "localhost:888/prometheus@v0.1.0", + Repository: "localhost:888/prometheus", + Version: "v0.1.0", Type: "uds_package", }, }, @@ -120,8 +122,8 @@ terraform { provider "uds" {} resource "uds_package" "init" { - oci_url = "ghcr.io/zarf-dev/packages/init@v0.46.0" - ref = "v0.46.0" + repository = "ghcr.io/zarf-dev/packages/init" + version = "v0.46.0" } resource "aws_instance" "test" { @@ -142,7 +144,7 @@ resource "aws_instance" "test" { Packages: []Packages{ { Name: "init", - Repository: "ghcr.io/zarf-dev/packages/init@v0.46.0", + Repository: "ghcr.io/zarf-dev/packages/init", Version: "v0.46.0", Type: "uds_package", }, @@ -166,7 +168,9 @@ terraform { version = "4.0.0" } } -}`, +} +resource "uds_package" "empty" {} +`, expected: &TerraformConfig{ Providers: map[string]Provider{ "uds": { @@ -178,6 +182,12 @@ terraform { Version: stringPtr("4.0.0"), }, }, + Packages: []Packages{ + { + Name: "empty", + Type: "uds_package", + }, + }, }, wantErr: false, }, @@ -219,6 +229,7 @@ terraform { } } } +resource "uds_package" "empty" {} `, expected: &TerraformConfig{ Providers: map[string]Provider{ @@ -226,6 +237,12 @@ terraform { Source: "defenseunicorns/uds", }, }, + Packages: []Packages{ + { + Name: "empty", + Type: "uds_package", + }, + }, }, wantErr: false, }, From 2449b424ac56e7faca07b8332555ca683ec170f3 Mon Sep 17 00:00:00 2001 From: Jonathan Perry Date: Tue, 4 Feb 2025 09:46:44 -0500 Subject: [PATCH 7/7] Remove commented out code Co-authored-by: Clint --- src/cmd/common.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cmd/common.go b/src/cmd/common.go index 9c46fff5..b7a35884 100644 --- a/src/cmd/common.go +++ b/src/cmd/common.go @@ -74,7 +74,6 @@ func deploy(bndlClient *bundle.Bundle) error { } // Determine the location of the local tfstate file - // stateFile := filepath.Join(cwd, "terraform.tfstate") stateFilepath, err := filepath.Abs(bndlClient.GetTofuStateFilepath()) if err != nil { return fmt.Errorf("failed to locate path to tfstate file: %s", err.Error())