diff --git a/terraform/spec/dependabot/terraform/file_updater_spec.rb b/terraform/spec/dependabot/terraform/file_updater_spec.rb index 05c7326adf..328a312c4d 100644 --- a/terraform/spec/dependabot/terraform/file_updater_spec.rb +++ b/terraform/spec/dependabot/terraform/file_updater_spec.rb @@ -76,6 +76,52 @@ module "s3-webapp" { end end + context "with a private module with v prefix" do + let(:project_name) { "private_module_with_v_prefix" } + + let(:dependencies) do + [ + Dependabot::Dependency.new( + name: "example-org-5d3190/s3-webapp/aws", + version: "2.0.0", + previous_version: "v1.0.0", + requirements: [{ + requirement: "2.0.0", + groups: [], + file: "main.tf", + source: { + type: "registry", + registry_hostname: "app.terraform.io", + module_identifier: "example-org-5d3190/s3-webapp/aws" + } + }], + previous_requirements: [{ + requirement: "v1.0.0", + groups: [], + file: "main.tf", + source: { + type: "registry", + registry_hostname: "app.terraform.io", + module_identifier: "example-org-5d3190/s3-webapp/aws" + } + }], + package_manager: "terraform" + ) + ] + end + + it "updates the private module version and drops the v prefix" do + updated_file = subject.find { |file| file.name == "main.tf" } + + expect(updated_file.content).to include(<<~HCL) + module "s3-webapp" { + source = "app.terraform.io/example-org-5d3190/s3-webapp/aws" + version = "2.0.0" + } + HCL + end + end + context "with a private provider" do let(:project_name) { "private_provider" } @@ -346,6 +392,52 @@ module "consul" { end end + context "with a legacy registry dependency with v prefix" do + let(:project_name) { "registry_with_v_prefix" } + let(:dependencies) do + [ + Dependabot::Dependency.new( + name: "hashicorp/consul/aws", + version: "0.3.1", + previous_version: "v0.1.0", + requirements: [{ + requirement: "0.3.1", + groups: [], + file: "main.tf", + source: { + type: "registry", + registry_hostname: "registry.terraform.io", + module_identifier: "hashicorp/consul/aws" + } + }], + previous_requirements: [{ + requirement: "v0.1.0", + groups: [], + file: "main.tf", + source: { + type: "registry", + registry_hostname: "registry.terraform.io", + module_identifier: "hashicorp/consul/aws" + } + }], + package_manager: "terraform" + ) + ] + end + + it "updates the requirement and drops the v prefix" do + updated_file = subject.find { |file| file.name == "main.tf" } + + expect(updated_file.content).to include( + <<~DEP + module "consul" { + source = "hashicorp/consul/aws" + version = "0.3.1" + DEP + ) + end + end + context "with an hcl2-based registry dependency" do let(:project_name) { "registry_012" } let(:dependencies) do @@ -393,6 +485,52 @@ module "consul" { end end + context "with an hcl2-based registry dependency with a v prefix" do + let(:project_name) { "registry_012_with_v_prefix" } + let(:dependencies) do + [ + Dependabot::Dependency.new( + name: "hashicorp/consul/aws", + version: "0.3.1", + previous_version: "v0.1.0", + requirements: [{ + requirement: "0.3.1", + groups: [], + file: "main.tf", + source: { + type: "registry", + registry_hostname: "registry.terraform.io", + module_identifier: "hashicorp/consul/aws" + } + }], + previous_requirements: [{ + requirement: "v0.1.0", + groups: [], + file: "main.tf", + source: { + type: "registry", + registry_hostname: "registry.terraform.io", + module_identifier: "hashicorp/consul/aws" + } + }], + package_manager: "terraform" + ) + ] + end + + it "updates the requirement and drops the v prefix" do + updated_file = subject.find { |file| file.name == "main.tf" } + + expect(updated_file.content).to include( + <<~DEP + module "consul" { + source = "hashicorp/consul/aws" + version = "0.3.1" + DEP + ) + end + end + context "with an hcl-based terragrunt file" do let(:project_name) { "terragrunt_hcl" } @@ -872,6 +1010,53 @@ module "github_terraform" { end end + describe "for a nested module with a v prefix" do + let(:project_name) { "nested_modules_with_v_prefix" } + let(:dependencies) do + [ + Dependabot::Dependency.new( + name: "terraform-aws-modules/iam/aws", + version: "4.1.0", + previous_version: "v4.0.0", + requirements: [{ + requirement: "4.1.0", + groups: [], + file: "main.tf", + source: { + type: "registry", + registry_hostname: "registry.terraform.io", + module_identifier: "iam/aws" + } + }], + previous_requirements: [{ + requirement: "v4.0.0", + groups: [], + file: "main.tf", + source: { + type: "registry", + registry_hostname: "registry.terraform.io", + module_identifier: "iam/aws" + } + }], + package_manager: "terraform" + ) + ] + end + + it "updates the requirement and drops the v prefix" do + updated_file = subject.find { |file| file.name == "main.tf" } + + expect(updated_file.content).to include( + <<~DEP + module "github_terraform" { + source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role" + version = "4.1.0" + } + DEP + ) + end + end + describe "with a lockfile and modules that need to be installed" do let(:project_name) { "lockfile_with_modules" } let(:dependencies) do @@ -965,6 +1150,53 @@ module "caf" { end end + describe "when updating a module with a v prefix in a project with a provider lockfile" do + let(:project_name) { "lockfile_with_modules_with_v_prefix" } + let(:dependencies) do + [ + Dependabot::Dependency.new( + name: "aztfmod/caf/azurerm", + version: "5.3.10", + previous_version: "v5.1.0", + requirements: [{ + requirement: "5.3.10", + groups: [], + file: "caf_module.tf", + source: { + type: "registry", + registry_hostname: "registry.terraform.io", + module_identifier: "aztfmod/caf/azurerm" + } + }], + previous_requirements: [{ + requirement: "v5.1.0", + groups: [], + file: "caf_module.tf", + source: { + type: "registry", + registry_hostname: "registry.terraform.io", + module_identifier: "aztfmod/caf/azurerm" + } + }], + package_manager: "terraform" + ) + ] + end + + it "updates the module version and drops the v prefix" do + module_file = subject.find { |file| file.name == "caf_module.tf" } + + expect(module_file.content).to include( + <<~DEP + module "caf" { + source = "aztfmod/caf/azurerm" + version = "5.3.10" + } + DEP + ) + end + end + describe "when updating a provider with local path modules" do let(:project_name) { "provider_with_local_path_modules" } let(:dependencies) do diff --git a/terraform/spec/fixtures/projects/lockfile_with_modules_with_v_prefix/.terraform.lock.hcl b/terraform/spec/fixtures/projects/lockfile_with_modules_with_v_prefix/.terraform.lock.hcl new file mode 100644 index 0000000000..29b0caf8ce --- /dev/null +++ b/terraform/spec/fixtures/projects/lockfile_with_modules_with_v_prefix/.terraform.lock.hcl @@ -0,0 +1,22 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/integrations/github" { + version = "4.4.0" + constraints = "~> 4.4" + hashes = [ + "h1:dgn+oL1cC8kz3ODIuT/PyHqgso00SpItPN089ZuUGt4=", + "h1:eKArqtLcYoYUFf4dgNzVemqu2GsoEf7K0ZLEXjSoPBo=", + "zh:0ebb07c4971ca7d60fce8614270d056328a121fd4ffbda4b29a06d4a1e90e939", + "zh:178b333f2f285c1a59b9335320f584bd01304179c2d6a1919366945b55cfb293", + "zh:2c9087e987a5e1af2aad803a79fa5bd847ac060d4c766b5a187b9aabb3f734a4", + "zh:419597d8d284616ed93a2c13b3833b129aaba7af7a057d2f48aeb7bc3610cefc", + "zh:61686d578880ad76cb8e9c2cc72ad14ef2896fde973cca18b8f7c8848781c71d", + "zh:662e125ac42a0c113d811afd2e7a0f81ba061f00cc62ba7435bd685f889290b9", + "zh:87fb3d97070cae7f0b623d1a9b59e8cfad0dfece4a27ee964c4c77f228592a80", + "zh:e9dcc85ef2f2e09d298f3bbbb9b0d673596d62c1d7d480b2999b4badb2f4aeff", + "zh:f052c377a0630a6881c183ac5de0dbef4e5627638a23434a6aa7fce8977b43de", + "zh:f7456ec2a6a31caa5d2c85f4da660689f8bac5541c70324803de0c26a14586e1", + "zh:fbf6bfddde6f209dc65052ca27e0c83e96bae5fde6940edf029ca42e7e4f1110", + ] +} diff --git a/terraform/spec/fixtures/projects/lockfile_with_modules_with_v_prefix/caf_module.tf b/terraform/spec/fixtures/projects/lockfile_with_modules_with_v_prefix/caf_module.tf new file mode 100644 index 0000000000..15c92f1e64 --- /dev/null +++ b/terraform/spec/fixtures/projects/lockfile_with_modules_with_v_prefix/caf_module.tf @@ -0,0 +1,4 @@ +module "caf" { + source = "aztfmod/caf/azurerm" + version = "v5.1.0" +} diff --git a/terraform/spec/fixtures/projects/lockfile_with_modules_with_v_prefix/versions.tf b/terraform/spec/fixtures/projects/lockfile_with_modules_with_v_prefix/versions.tf new file mode 100644 index 0000000000..bb84e4dfe6 --- /dev/null +++ b/terraform/spec/fixtures/projects/lockfile_with_modules_with_v_prefix/versions.tf @@ -0,0 +1,9 @@ +terraform { + required_providers { + github = { + source = "integrations/github" + version = "~> 4.4, <= 4.12.0" + } + } + required_version = ">= v0.14" +} diff --git a/terraform/spec/fixtures/projects/nested_modules_with_v_prefix/main.tf b/terraform/spec/fixtures/projects/nested_modules_with_v_prefix/main.tf new file mode 100644 index 0000000000..4c092f6481 --- /dev/null +++ b/terraform/spec/fixtures/projects/nested_modules_with_v_prefix/main.tf @@ -0,0 +1,4 @@ +module "github_terraform" { + source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role" + version = "v4.0.0" +} diff --git a/terraform/spec/fixtures/projects/private_module_with_v_prefix/main.tf b/terraform/spec/fixtures/projects/private_module_with_v_prefix/main.tf new file mode 100644 index 0000000000..ab94e798a4 --- /dev/null +++ b/terraform/spec/fixtures/projects/private_module_with_v_prefix/main.tf @@ -0,0 +1,4 @@ +module "s3-webapp" { + source = "app.terraform.io/example-org-5d3190/s3-webapp/aws" + version = "v1.0.0" +} diff --git a/terraform/spec/fixtures/projects/registry_012_with_v_prefix/main.tf b/terraform/spec/fixtures/projects/registry_012_with_v_prefix/main.tf new file mode 100644 index 0000000000..d7fef2bb70 --- /dev/null +++ b/terraform/spec/fixtures/projects/registry_012_with_v_prefix/main.tf @@ -0,0 +1,29 @@ +module "consul" { + source = "hashicorp/consul/aws" + version = "v0.1.0" +} + +module "vpc" { + source = "app.terraform.io/example_corp/vpc/aws" + version = "v0.9.3" +} + +module "rds" { + source = "terraform-aws-modules/rds/aws" + version = "~> v1.0.0" +} + +module "members-github" { + source = "devops-workflow/members/github" +} + +module "merged" { + source = "mongodb/ecs-task-definition/aws//modules/merge" + + container_definitions = [ + var.web_container_definition, + module.xray.container_definitions, + module.reverse_proxy.container_definitions, + module.datadog.container_definitions, + ] +} diff --git a/terraform/spec/fixtures/projects/registry_with_v_prefix/main.tf b/terraform/spec/fixtures/projects/registry_with_v_prefix/main.tf new file mode 100644 index 0000000000..1b9d5c5b4a --- /dev/null +++ b/terraform/spec/fixtures/projects/registry_with_v_prefix/main.tf @@ -0,0 +1,29 @@ +module "consul" { + source = "hashicorp/consul/aws" + version = "v0.1.0" +} + +module "vpc" { + source = "app.terraform.io/example_corp/vpc/aws" + version = "v0.9.3" +} + +module "rds" { + source = "terraform-aws-modules/rds/aws" + version = "~> v1.0.0" +} + +module "members-github" { + source = "devops-workflow/members/github" +} + +module "merged" { + source = "mongodb/ecs-task-definition/aws//modules/merge" + + container_definitions = [ + "${var.web_container_definition}", + "${module.xray.container_definitions}", + "${module.reverse_proxy.container_definitions}", + "${module.datadog.container_definitions}", + ] +}