Skip to content

Commit 13be897

Browse files
committed
Put providers.tf & required_providers.tf to each app folder
1 parent 40aba4c commit 13be897

File tree

5 files changed

+116
-54
lines changed

5 files changed

+116
-54
lines changed

lib/command/terraform/generate.rb

+21-18
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,20 @@ class Generate < Base
1616
WITH_INFO_HEADER = false
1717

1818
def call
19-
generate_common_configs
20-
generate_app_configs
21-
end
22-
23-
private
24-
25-
def generate_common_configs
26-
cpln_provider = TerraformConfig::RequiredProvider.new(
27-
"cpln",
28-
source: "controlplane-com/cpln",
29-
version: "~> 1.0"
30-
)
31-
32-
File.write(terraform_dir.join("providers.tf"), cpln_provider.to_tf)
33-
end
34-
35-
def generate_app_configs
3619
Array(config.app || config.apps.keys).each do |app|
37-
config.instance_variable_set(:@app, app)
20+
config.instance_variable_set(:@app, app.to_s)
3821
generate_app_config
3922
end
4023
end
4124

25+
private
26+
4227
def generate_app_config
4328
terraform_app_dir = recreate_terraform_app_dir
4429

30+
generate_required_providers(terraform_app_dir)
31+
generate_providers(terraform_app_dir)
32+
4533
templates.each do |template|
4634
generator = TerraformConfig::Generator.new(config: config, template: template)
4735

@@ -52,6 +40,21 @@ def generate_app_config
5240
end
5341
end
5442

43+
def generate_required_providers(terraform_app_dir)
44+
required_cpln_provider = TerraformConfig::RequiredProvider.new(
45+
"cpln",
46+
source: "controlplane-com/cpln",
47+
version: "~> 1.0"
48+
)
49+
50+
File.write(terraform_app_dir.join("required_providers.tf"), required_cpln_provider.to_tf)
51+
end
52+
53+
def generate_providers(terraform_app_dir)
54+
cpln_provider = TerraformConfig::Provider.new("cpln", org: config.org)
55+
File.write(terraform_app_dir.join("providers.tf"), cpln_provider.to_tf)
56+
end
57+
5558
def recreate_terraform_app_dir
5659
full_path = terraform_dir.join(config.app)
5760

lib/core/terraform_config/provider.rb

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# frozen_string_literal: true
2+
3+
module TerraformConfig
4+
class Provider < Base
5+
attr_reader :name, :options
6+
7+
def initialize(name, **options)
8+
super()
9+
10+
@name = name
11+
@options = options
12+
end
13+
14+
def to_tf
15+
block :provider, name do
16+
options.each do |option, value|
17+
argument option, value
18+
end
19+
end
20+
end
21+
end
22+
end

lib/core/terraform_config/required_provider.rb

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ def initialize(name, **options)
1313

1414
def to_tf
1515
block :terraform do
16+
block :cloud do
17+
argument :organization, "PLACEHOLDER"
18+
end
19+
1620
block :required_providers do
1721
argument name, options
1822
end

spec/command/terraform/generate_spec.rb

+43-36
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,32 @@
2424
FileUtils.rm_rf GENERATOR_PLAYGROUND_PATH
2525
end
2626

27-
it "generates terraform config files", :aggregate_failures do
28-
config_file_paths.each { |config_file_path| expect(config_file_path).not_to exist }
27+
shared_examples "generates terraform config files" do
28+
specify do
29+
all_config_paths.each { |path| expect(path).not_to exist }
2930

30-
expect(result[:status]).to eq(0)
31+
expect(result[:status]).to eq(ExitCode::SUCCESS)
32+
expect(result[:stderr]).to err_msg ? include(err_msg) : be_empty
3133

32-
expect(config_file_paths).to all(exist)
34+
expect(expected_config_paths).to all(exist)
35+
(all_config_paths - expected_config_paths).each { |path| expect(path).not_to exist }
36+
end
37+
end
38+
39+
shared_examples "does not generate any terraform config files" do |err_msg|
40+
it "fails with an error" do
41+
all_config_paths.each { |path| expect(path).not_to exist }
42+
43+
expect(result[:status]).to eq(ExitCode::ERROR_DEFAULT)
44+
expect(result[:stderr]).to include(err_msg)
45+
46+
all_config_paths.each { |path| expect(path).not_to exist }
47+
end
48+
end
49+
50+
it_behaves_like "generates terraform config files" do
51+
let(:expected_config_paths) { all_config_paths }
52+
let(:err_msg) { nil }
3353
end
3454

3555
context "when templates folder is empty" do
@@ -39,13 +59,9 @@
3959
allow_any_instance_of(TemplateParser).to receive(:template_dir).and_return(template_dir) # rubocop:disable RSpec/AnyInstance
4060
end
4161

42-
it "generates only common config files" do
43-
config_file_paths.each { |config_file_path| expect(config_file_path).not_to exist }
44-
45-
expect(result[:stderr]).to include("No templates found in #{template_dir}")
46-
47-
expect(common_config_files).to all(exist)
48-
app_config_files.each { |config_file_path| expect(config_file_path).not_to exist }
62+
it_behaves_like "generates terraform config files" do
63+
let(:expected_config_paths) { provider_config_paths }
64+
let(:err_msg) { "No templates found in #{template_dir}" }
4965
end
5066
end
5167

@@ -54,49 +70,40 @@
5470
allow_any_instance_of(TemplateParser).to receive(:parse).and_raise("error") # rubocop:disable RSpec/AnyInstance
5571
end
5672

57-
it "generates only common config files" do
58-
config_file_paths.each { |config_file_path| expect(config_file_path).not_to exist }
59-
60-
expect(result[:stderr]).to include("Error parsing templates: error")
61-
62-
expect(common_config_files).to all(exist)
63-
app_config_files.each { |config_file_path| expect(config_file_path).not_to exist }
73+
it_behaves_like "generates terraform config files" do
74+
let(:expected_config_paths) { provider_config_paths }
75+
let(:err_msg) { "Error parsing templates: error" }
6476
end
6577
end
6678

6779
context "when --dir option is outside of project dir" do
6880
let(:options) { ["-a", app, "--dir", GEM_TEMP_PATH.join("path-outside-of-project").to_s] }
6981

70-
it "aborts command execution" do
71-
expect(result[:status]).to eq(ExitCode::ERROR_DEFAULT)
72-
expect(result[:stderr]).to include(
73-
"Directory to save terraform configuration files cannot be outside of current directory"
74-
)
75-
end
82+
it_behaves_like "does not generate any terraform config files",
83+
"Directory to save terraform configuration files cannot be outside of current directory"
7684
end
7785

7886
context "when terraform config directory creation fails" do
7987
before do
8088
allow(FileUtils).to receive(:mkdir_p).and_raise("error")
8189
end
8290

83-
it "aborts command execution" do
84-
expect(result[:status]).to eq(ExitCode::ERROR_DEFAULT)
85-
expect(result[:stderr]).to include("error")
86-
end
91+
it_behaves_like "does not generate any terraform config files", "error"
8792
end
8893

89-
def config_file_paths
90-
common_config_files + app_config_files
94+
def all_config_paths
95+
provider_config_paths + template_config_paths
9196
end
9297

93-
def common_config_files
94-
[TERRAFORM_CONFIG_DIR_PATH.join("providers.tf")]
98+
def provider_config_paths
99+
%w[required_providers.tf providers.tf].map { |filename| config_path(filename) }
95100
end
96101

97-
def app_config_files
98-
%w[gvc.tf identities.tf secrets.tf policies.tf].map do |config_file_path|
99-
TERRAFORM_CONFIG_DIR_PATH.join(app, config_file_path)
100-
end
102+
def template_config_paths
103+
%w[gvc.tf identities.tf secrets.tf policies.tf].map { |filename| config_path(filename) }
104+
end
105+
106+
def config_path(name)
107+
TERRAFORM_CONFIG_DIR_PATH.join(app, name)
101108
end
102109
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# frozen_string_literal: true
2+
3+
require "spec_helper"
4+
5+
describe TerraformConfig::Provider do
6+
let(:config) { described_class.new(name, **options) }
7+
8+
describe "#to_tf" do
9+
subject(:generated) { config.to_tf }
10+
11+
context "when provider is cpln" do
12+
let(:name) { "cpln" }
13+
let(:options) { { org: "test-org" } }
14+
15+
it "generates correct config" do
16+
expect(generated).to eq(
17+
<<~EXPECTED
18+
provider "cpln" {
19+
org = "test-org"
20+
}
21+
EXPECTED
22+
)
23+
end
24+
end
25+
end
26+
end

0 commit comments

Comments
 (0)