terraform-wrapper 0.1.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +1 -1
- data/Gemfile +0 -4
- data/lib/terraform-wrapper/common.rb +12 -1
- data/lib/terraform-wrapper/shared/auths/azure.rb +29 -22
- data/lib/terraform-wrapper/shared/auths/common.rb +3 -7
- data/lib/terraform-wrapper/shared/backends/aws.rb +16 -16
- data/lib/terraform-wrapper/shared/backends/azure.rb +14 -14
- data/lib/terraform-wrapper/shared/backends/common.rb +3 -7
- data/lib/terraform-wrapper/shared/backends/local.rb +9 -8
- data/lib/terraform-wrapper/shared/binary.rb +2 -2
- data/lib/terraform-wrapper/shared/code.rb +2 -2
- data/lib/terraform-wrapper/shared/config.rb +19 -59
- data/lib/terraform-wrapper/shared/runner.rb +5 -10
- data/lib/terraform-wrapper/shared/variables.rb +73 -10
- data/lib/terraform-wrapper/tasks/binary.rb +1 -1
- data/lib/terraform-wrapper/version.rb +1 -1
- data/terraform-wrapper.gemspec +3 -0
- metadata +31 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cec70134c0df1674effb0b5e07ffaa3ff7d1a2ca034dd6452563f616e67e09c1
|
4
|
+
data.tar.gz: b4c6416feea1f68b3db4f593f7e2692a7553869977dad45aa0da045477841add
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cb74ef36d96167259fec72539932d7614a25ad2f442fd75940bdaff3fe63b17aa7a793f17f90368c930112d7ab433950bf0c900ed46694d4dfd8e1cba3d311b
|
7
|
+
data.tar.gz: '090b646a9d688e4e12149752cffa4f71414a47c70b4ec619a7a142e342e9ece421e929baf42045b767c896666406317f0aff602b12d35d123b767bf87793b303'
|
data/.gitlab-ci.yml
CHANGED
data/Gemfile
CHANGED
@@ -4,7 +4,7 @@ module TerraformWrapper
|
|
4
4
|
|
5
5
|
###############################################################################
|
6
6
|
|
7
|
-
def self.create_directory(directory:,
|
7
|
+
def self.create_directory(directory:, exists: true, purpose: nil)
|
8
8
|
return exists if File.directory?(directory)
|
9
9
|
|
10
10
|
result = false
|
@@ -20,6 +20,17 @@ module TerraformWrapper
|
|
20
20
|
result = File.directory?(directory)
|
21
21
|
end
|
22
22
|
|
23
|
+
###############################################################################
|
24
|
+
|
25
|
+
def self.find(base:, name:, exts:, description: "File")
|
26
|
+
exts.each do |ext|
|
27
|
+
path = File.join(base, name + ext)
|
28
|
+
return path if File.file?(path)
|
29
|
+
end
|
30
|
+
|
31
|
+
logger.fatal("#{description} name: #{name} not found in location: #{base}!")
|
32
|
+
end
|
33
|
+
|
23
34
|
###############################################################################
|
24
35
|
|
25
36
|
end
|
@@ -35,8 +35,8 @@ module TerraformWrapper
|
|
35
35
|
|
36
36
|
###############################################################################
|
37
37
|
|
38
|
-
def initialize(
|
39
|
-
construct(
|
38
|
+
def initialize(options:, variables:)
|
39
|
+
construct(options: options, variables: variables)
|
40
40
|
end
|
41
41
|
|
42
42
|
###############################################################################
|
@@ -78,7 +78,7 @@ module TerraformWrapper
|
|
78
78
|
stdout = `#{cmdline}`
|
79
79
|
code = $?.exitstatus
|
80
80
|
|
81
|
-
logger.fatal("Failed to get secret: #{name} from key vault: #{vault}!") if (code != 0
|
81
|
+
logger.fatal("Failed to get secret: #{name} from key vault: #{vault}!") if (code != 0 or stdout.strip.empty?)
|
82
82
|
|
83
83
|
return(stdout.strip)
|
84
84
|
end
|
@@ -97,11 +97,11 @@ module TerraformWrapper
|
|
97
97
|
details = YAML.load(stdout.strip)
|
98
98
|
|
99
99
|
logger.fatal("Returned details did not include the subscription ID!") unless details.key?("id")
|
100
|
-
logger.fatal("Returned subscription ID is not a
|
100
|
+
logger.fatal("Returned subscription ID is not a string!") unless details["id"].kind_of?(String)
|
101
101
|
logger.fatal("Returned subscription ID is empty!") if details["id"].strip.empty?
|
102
102
|
|
103
103
|
logger.fatal("Returned details did not include the tenant ID!") unless details.key?("tenant")
|
104
|
-
logger.fatal("Returned tenant ID is not a
|
104
|
+
logger.fatal("Returned tenant ID is not a string!") unless details["tenant"].kind_of?(String)
|
105
105
|
logger.fatal("Returned tenant ID is empty!") if details["tenant"].strip.empty?
|
106
106
|
|
107
107
|
details.transform_values! { |value| value.strip }
|
@@ -120,36 +120,43 @@ module TerraformWrapper
|
|
120
120
|
logger.fatal("Azure CLI must be installed and accessible to use the Azure authenticator.") unless cli
|
121
121
|
|
122
122
|
logger.fatal("Azure authenticator mandatory option 'subscription' has not been set!") unless @options.key?("subscription")
|
123
|
+
logger.fatal("Azure authenticator subscription must be a string!") unless @options["subscription"].kind_of?(String)
|
124
|
+
logger.fatal("Azure authenticator subscription must not be blank!") if @options["subscription"].strip.empty?
|
123
125
|
|
124
126
|
subscription = @options["subscription"]
|
125
127
|
|
126
|
-
logger.fatal("Azure authenticator subscription must be a String!") unless subscription.kind_of?(String)
|
127
|
-
logger.fatal("Azure authenticator subscription must not be blank!") if subscription.strip.empty?
|
128
|
-
|
129
128
|
if @options.key?("keyvault") then
|
130
|
-
keyvault
|
129
|
+
logger.fatal("Azure authenticator keyvault name must be a string if specified!") unless @options["keyvault"].kind_of?(String)
|
130
|
+
logger.fatal("Azure authenticator keyvault name must not be blank if specified!") if @options["keyvault"].strip.empty?
|
131
131
|
|
132
|
-
|
133
|
-
logger.fatal("Azure authenticator keyvault name must not be blank if specified!") if keyvault.strip.empty?
|
132
|
+
keyvault = @options["keyvault"]
|
134
133
|
|
135
|
-
|
134
|
+
if @options.key?("username-secret") then
|
135
|
+
logger.fatal("Azure authenticator keyvault secret for username must be a string if keyvault name is specified!") unless @options["username-secret"].kind_of?(String)
|
136
|
+
logger.fatal("Azure authenticator keyvault secret for username must not be blank if keyvault name is specified!") if @options["username-secret"].strip.empty?
|
136
137
|
|
137
|
-
|
138
|
-
|
138
|
+
username = @options["username-secret"]
|
139
|
+
else
|
140
|
+
username = "terraform-username"
|
141
|
+
end
|
139
142
|
|
140
|
-
|
143
|
+
if @options.key?("password-secret") then
|
144
|
+
logger.fatal("Azure authenticator keyvault secret for password must be a string if keyvault name is specified!") unless @options["password-secret"].kind_of?(String)
|
145
|
+
logger.fatal("Azure authenticator keyvault secret for password must not be blank if keyvault name is specified!") if @options["password-secret"].strip.empty?
|
141
146
|
|
142
|
-
|
143
|
-
|
147
|
+
password = @options["password-secret"]
|
148
|
+
else
|
149
|
+
password = "terraform-password"
|
150
|
+
end
|
144
151
|
end
|
145
152
|
|
146
153
|
begin
|
147
|
-
subscription = subscription % @variables
|
148
|
-
keyvault = keyvault % @variables unless keyvault.nil?
|
149
|
-
username = username % @variables unless keyvault.nil?
|
150
|
-
password = password % @variables unless keyvault.nil?
|
154
|
+
subscription = subscription % @variables.identifiers
|
155
|
+
keyvault = keyvault % @variables.identifiers unless keyvault.nil?
|
156
|
+
username = username % @variables.identifiers unless keyvault.nil?
|
157
|
+
password = password % @variables.identifiers unless keyvault.nil?
|
151
158
|
rescue
|
152
|
-
logger.fatal("Azure authenticator options contain
|
159
|
+
logger.fatal("Azure authenticator options contain identifiers that are not included in the configuration file!")
|
153
160
|
end
|
154
161
|
|
155
162
|
details = subscription_details(subscription: subscription)
|
@@ -29,7 +29,7 @@ module TerraformWrapper
|
|
29
29
|
|
30
30
|
###############################################################################
|
31
31
|
|
32
|
-
def initialize(
|
32
|
+
def initialize(options:, variables:)
|
33
33
|
logger.fatal("This class should not be used directly! Please create an authenticator-specific class instead!")
|
34
34
|
end
|
35
35
|
|
@@ -59,13 +59,9 @@ module TerraformWrapper
|
|
59
59
|
|
60
60
|
###############################################################################
|
61
61
|
|
62
|
-
def construct(
|
62
|
+
def construct(options:, variables:)
|
63
63
|
@options = options
|
64
|
-
@variables = variables
|
65
|
-
component: code.name,
|
66
|
-
config: config,
|
67
|
-
service: service
|
68
|
-
})
|
64
|
+
@variables = variables
|
69
65
|
|
70
66
|
specific
|
71
67
|
end
|
@@ -35,8 +35,8 @@ module TerraformWrapper
|
|
35
35
|
|
36
36
|
###############################################################################
|
37
37
|
|
38
|
-
def initialize(
|
39
|
-
construct(
|
38
|
+
def initialize(options:, variables:)
|
39
|
+
construct(options: options, variables: variables)
|
40
40
|
end
|
41
41
|
|
42
42
|
###############################################################################
|
@@ -70,17 +70,17 @@ module TerraformWrapper
|
|
70
70
|
|
71
71
|
bucket = @options["bucket"]
|
72
72
|
|
73
|
-
logger.fatal("AWS backend S3 bucket name must be a
|
73
|
+
logger.fatal("AWS backend S3 bucket name must be a string!") unless bucket.kind_of?(String)
|
74
74
|
logger.fatal("AWS backend S3 bucket name must not be blank!") if bucket.strip.empty?
|
75
75
|
|
76
76
|
region = @options["region"]
|
77
77
|
|
78
|
-
logger.fatal("AWS backend S3 bucket region must be a
|
78
|
+
logger.fatal("AWS backend S3 bucket region must be a string!") unless region.kind_of?(String)
|
79
79
|
logger.fatal("AWS backend S3 bucket region must not be blank!") if region.strip.empty?
|
80
80
|
|
81
81
|
key = @options.key?("key") ? @options["key"] : File.join("%{service}", "%{config}", "%{component}" + @@ext)
|
82
82
|
|
83
|
-
logger.fatal("AWS backend S3 bucket key must be a
|
83
|
+
logger.fatal("AWS backend S3 bucket key must be a string!") unless key.kind_of?(String)
|
84
84
|
logger.fatal("AWS backend S3 bucket key must not be blank!") if key.strip.empty?
|
85
85
|
|
86
86
|
encrypt = @options.key?("encrypt") ? @options["encrypt"] : true
|
@@ -90,29 +90,29 @@ module TerraformWrapper
|
|
90
90
|
if @options.key?("kms") then
|
91
91
|
kms = @options["kms"]
|
92
92
|
|
93
|
-
logger.fatal("AWS backend S3 bucket encryption KMS key ARN must be a
|
93
|
+
logger.fatal("AWS backend S3 bucket encryption KMS key ARN must be a string if specified!") unless kms.kind_of?(String)
|
94
94
|
logger.fatal("AWS backend S3 bucket encryption KMS key ARN must not be blank if specified!") if kms.strip.empty?
|
95
95
|
end
|
96
96
|
|
97
97
|
if @options.key?("role") then
|
98
98
|
role = @options["role"]
|
99
99
|
|
100
|
-
logger.fatal("AWS backend role to assume ARN must be a
|
100
|
+
logger.fatal("AWS backend role to assume ARN must be a string if specified!") unless role.kind_of?(String)
|
101
101
|
logger.fatal("AWS backend role to assume ARN must not be blank if specified!") if role.strip.empty?
|
102
102
|
end
|
103
103
|
|
104
|
-
|
105
|
-
|
106
|
-
|
104
|
+
@variables.core.keys.map{ |sym| sym.to_s }.each do |core|
|
105
|
+
logger.fatal("AWS backend S3 bucket name or key must include %{#{core}}.") unless (bucket.include?("%{#{core}}") or key.include?("%{#{core}}"))
|
106
|
+
end
|
107
107
|
|
108
108
|
begin
|
109
|
-
bucket = bucket % @variables
|
110
|
-
region = region % @variables
|
111
|
-
key = key % @variables
|
112
|
-
kms = kms % @variables unless kms.nil?
|
113
|
-
role = role % @variables unless role.nil?
|
109
|
+
bucket = bucket % @variables.identifiers
|
110
|
+
region = region % @variables.identifiers
|
111
|
+
key = key % @variables.identifiers
|
112
|
+
kms = kms % @variables.identifiers unless kms.nil?
|
113
|
+
role = role % @variables.identifiers unless role.nil?
|
114
114
|
rescue
|
115
|
-
logger.fatal("AWS backend options contain
|
115
|
+
logger.fatal("AWS backend options contain identifiers that are not included in the configuration file!")
|
116
116
|
end
|
117
117
|
|
118
118
|
logger.fatal("Key: #{key} is too long for backend of type: #{@@type}") if key.length > 1024
|
@@ -31,8 +31,8 @@ module TerraformWrapper
|
|
31
31
|
|
32
32
|
###############################################################################
|
33
33
|
|
34
|
-
def initialize(
|
35
|
-
construct(
|
34
|
+
def initialize(options:, variables:)
|
35
|
+
construct(options: options, variables: variables)
|
36
36
|
end
|
37
37
|
|
38
38
|
###############################################################################
|
@@ -57,35 +57,35 @@ module TerraformWrapper
|
|
57
57
|
|
58
58
|
group = @options["group"]
|
59
59
|
|
60
|
-
logger.fatal("Azure backend group must be a
|
60
|
+
logger.fatal("Azure backend group must be a string!") unless group.kind_of?(String)
|
61
61
|
logger.fatal("Azure backend group must not be blank!") if group.strip.empty?
|
62
62
|
|
63
63
|
account = @options.key?("account") ? @options["account"] : group + "tf"
|
64
64
|
|
65
|
-
logger.fatal("Azure backend storage account must be a
|
65
|
+
logger.fatal("Azure backend storage account must be a string!") unless account.kind_of?(String)
|
66
66
|
logger.fatal("Azure backend storage account must not be blank!") if account.strip.empty?
|
67
67
|
|
68
68
|
container = @options.key?("container") ? @options["container"] : "default"
|
69
69
|
|
70
|
-
logger.fatal("Azure backend storage account container must be a
|
70
|
+
logger.fatal("Azure backend storage account container must be a string!") unless container.kind_of?(String)
|
71
71
|
logger.fatal("Azure backend storage account container must not be blank!") if container.strip.empty?
|
72
72
|
|
73
73
|
key = @options.key?("key") ? @options["key"] : File.join("%{service}", "%{config}", "%{component}" + @@ext)
|
74
74
|
|
75
|
-
logger.fatal("Azure backend storage account key must be a
|
75
|
+
logger.fatal("Azure backend storage account key must be a string!") unless key.kind_of?(String)
|
76
76
|
logger.fatal("Azure backend storage account key must not be blank!") if key.strip.empty?
|
77
77
|
|
78
|
-
|
79
|
-
|
80
|
-
|
78
|
+
@variables.core.keys.map{ |sym| sym.to_s }.each do |core|
|
79
|
+
logger.fatal("Azure backend container or key must include %{#{core}}.") unless (container.include?("%{#{core}}") or key.include?("%{#{core}}"))
|
80
|
+
end
|
81
81
|
|
82
82
|
begin
|
83
|
-
group = group % @variables
|
84
|
-
account = account % @variables
|
85
|
-
container = container % @variables
|
86
|
-
key = key % @variables
|
83
|
+
group = group % @variables.identifiers
|
84
|
+
account = account % @variables.identifiers
|
85
|
+
container = container % @variables.identifiers
|
86
|
+
key = key % @variables.identifiers
|
87
87
|
rescue
|
88
|
-
logger.fatal("Azure backend options contain
|
88
|
+
logger.fatal("Azure backend options contain identifiers that are not included in the configuration file!")
|
89
89
|
end
|
90
90
|
|
91
91
|
if key.length > 1024 then
|
@@ -30,7 +30,7 @@ module TerraformWrapper
|
|
30
30
|
|
31
31
|
###############################################################################
|
32
32
|
|
33
|
-
def initialize(
|
33
|
+
def initialize(options:, variables:)
|
34
34
|
logger.fatal("This class should not be used directly! Please create a backend-specific class instead!")
|
35
35
|
end
|
36
36
|
|
@@ -54,13 +54,9 @@ module TerraformWrapper
|
|
54
54
|
|
55
55
|
###############################################################################
|
56
56
|
|
57
|
-
def construct(
|
57
|
+
def construct(options:, variables:)
|
58
58
|
@options = options
|
59
|
-
@variables = variables
|
60
|
-
component: code.name,
|
61
|
-
config: config,
|
62
|
-
service: service
|
63
|
-
})
|
59
|
+
@variables = variables
|
64
60
|
|
65
61
|
specific
|
66
62
|
end
|
@@ -28,8 +28,8 @@ module TerraformWrapper
|
|
28
28
|
|
29
29
|
###############################################################################
|
30
30
|
|
31
|
-
def initialize(
|
32
|
-
construct(
|
31
|
+
def initialize(options:, variables:)
|
32
|
+
construct(options: options, variables: variables)
|
33
33
|
end
|
34
34
|
|
35
35
|
###############################################################################
|
@@ -49,17 +49,18 @@ module TerraformWrapper
|
|
49
49
|
def specific()
|
50
50
|
path = @options.key?("path") ? @options["path"] : File.join(Dir.pwd, "state", "terraform", "%{config}", "%{component}" + @@ext)
|
51
51
|
|
52
|
-
logger.fatal("Local backend path must be a
|
52
|
+
logger.fatal("Local backend path must be a string!") unless path.kind_of?(String)
|
53
53
|
logger.fatal("Local backend path must not be blank!") if path.strip.empty?
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
@variables.core.keys.map{ |sym| sym.to_s }.each do |core|
|
56
|
+
next if (core == "service") and (path.include?(Dir.pwd))
|
57
|
+
logger.fatal("Local backend path must include %{#{core}}.") unless path.include?("%{#{core}}")
|
58
|
+
end
|
58
59
|
|
59
60
|
begin
|
60
|
-
path = path % @variables
|
61
|
+
path = path % @variables.identifiers
|
61
62
|
rescue
|
62
|
-
logger.fatal("Local backend options contain
|
63
|
+
logger.fatal("Local backend options contain identifiers that are not included in the configuration file!")
|
63
64
|
end
|
64
65
|
|
65
66
|
directory = File.dirname(path)
|
@@ -28,12 +28,12 @@ module TerraformWrapper
|
|
28
28
|
###############################################################################
|
29
29
|
|
30
30
|
def initialize(options:)
|
31
|
-
logger.fatal("Binary base path must be a
|
31
|
+
logger.fatal("Binary base path must be a string!") unless options["base"].kind_of?(String)
|
32
32
|
logger.fatal("Binary base path must not be blank!") if options["base"].strip.empty?
|
33
33
|
|
34
34
|
@base = options["base"]
|
35
35
|
|
36
|
-
logger.fatal("Binary version must be a
|
36
|
+
logger.fatal("Binary version must be a string!") unless options["version"].kind_of?(String)
|
37
37
|
logger.fatal("Binary version must not be blank!") if options["version"].strip.empty?
|
38
38
|
|
39
39
|
@version = options["version"]
|
@@ -23,12 +23,12 @@ module TerraformWrapper
|
|
23
23
|
###############################################################################
|
24
24
|
|
25
25
|
def initialize(options:)
|
26
|
-
logger.fatal("Code base path must be a
|
26
|
+
logger.fatal("Code base path must be a string!") unless options["base"].kind_of?(String)
|
27
27
|
logger.fatal("Code base path must not be blank!") if options["base"].strip.empty?
|
28
28
|
|
29
29
|
@base = options["base"]
|
30
30
|
|
31
|
-
logger.fatal("Code component name must be a
|
31
|
+
logger.fatal("Code component name must be a string!") unless options["name"].kind_of?(String)
|
32
32
|
logger.fatal("Code component name must not be blank!") if options["name"].strip.empty?
|
33
33
|
|
34
34
|
@name = options["name"]
|
@@ -22,11 +22,6 @@ module TerraformWrapper
|
|
22
22
|
|
23
23
|
@@config_exts = [ "", ".yaml", ".yml" ]
|
24
24
|
|
25
|
-
###############################################################################
|
26
|
-
|
27
|
-
@@variable_files_name = "tfvars"
|
28
|
-
@@variable_files_ext = ".tfvars"
|
29
|
-
|
30
25
|
###############################################################################
|
31
26
|
|
32
27
|
attr_reader :auths
|
@@ -36,23 +31,22 @@ module TerraformWrapper
|
|
36
31
|
attr_reader :name
|
37
32
|
attr_reader :path
|
38
33
|
attr_reader :service
|
39
|
-
attr_reader :variable_files
|
40
34
|
attr_reader :variables
|
41
35
|
|
42
36
|
###############################################################################
|
43
37
|
|
44
38
|
def initialize(code:, options:)
|
45
|
-
logger.fatal("Configuration base path must be a
|
39
|
+
logger.fatal("Configuration base path must be a string!") unless options["base"].kind_of?(String)
|
46
40
|
logger.fatal("Configuration base path must not be blank!") if options["base"].strip.empty?
|
47
41
|
|
48
42
|
@base = options["base"]
|
49
43
|
|
50
|
-
logger.fatal("Configuration service name must be a
|
44
|
+
logger.fatal("Configuration service name must be a string!") unless options["service"].kind_of?(String)
|
51
45
|
logger.fatal("Configuration service name must not be blank!") if options["service"].strip.empty?
|
52
46
|
|
53
47
|
@service = options["service"]
|
54
48
|
|
55
|
-
logger.fatal("Configuration name must be a
|
49
|
+
logger.fatal("Configuration name must be a string!") unless options["name"].kind_of?(String)
|
56
50
|
logger.fatal("Configuration name must not be blank!") if options["name"].strip.empty?
|
57
51
|
|
58
52
|
@name = options["name"]
|
@@ -65,7 +59,7 @@ module TerraformWrapper
|
|
65
59
|
|
66
60
|
auth_azure_options = options["auth-azure-options"]
|
67
61
|
|
68
|
-
logger.fatal("Configuration backend name must be a
|
62
|
+
logger.fatal("Configuration backend name must be a string!") unless options["backend"].kind_of?(String)
|
69
63
|
logger.fatal("Configuration backend name must not be blank!") if options["backend"].strip.empty?
|
70
64
|
|
71
65
|
backend = options["backend"]
|
@@ -75,71 +69,37 @@ module TerraformWrapper
|
|
75
69
|
backend_options = options["backend-options"]
|
76
70
|
|
77
71
|
@code = code
|
78
|
-
@path = find
|
72
|
+
@path = ::TerraformWrapper.find(base: @base, name: @name, exts: @@config_exts, description: "Configuration")
|
79
73
|
|
80
74
|
yaml = YAML.load(File.read(@path))
|
81
|
-
|
82
75
|
logger.fatal("Invalid YAML in configuration file: #{@path}") unless yaml.kind_of?(Hash)
|
83
76
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
else
|
88
|
-
@variables = TerraformWrapper::Shared::Variables.new()
|
89
|
-
end
|
77
|
+
identifiers = yaml.key?("identifiers") ? yaml["identifiers"] : Hash.new
|
78
|
+
@variables = TerraformWrapper::Shared::Variables.new(config: @name, component: @code.name, service: @service, identifiers: identifiers)
|
79
|
+
@variables.add_variables(variables: yaml["globals"]) if yaml.key?("globals")
|
90
80
|
|
91
|
-
|
81
|
+
if yaml.key?("terraform") then
|
82
|
+
logger.fatal("Key 'terraform' is not a hash in configuration file: #{@path}") unless yaml["terraform"].kind_of?(Hash)
|
83
|
+
terraform = yaml["terraform"]
|
84
|
+
|
85
|
+
@variables.add_variables(variables: terraform["variables"]) if terraform.key?("variables")
|
86
|
+
@variables.add_files(base: @base, files: terraform["files"]) if terraform.key?("files")
|
87
|
+
end
|
92
88
|
|
93
89
|
@auths = Array.new
|
94
|
-
@auths.append(TerraformWrapper::Shared::Auths::Azure.new(
|
90
|
+
@auths.append(TerraformWrapper::Shared::Auths::Azure.new(options: auth_azure_options, variables: @variables)) if auth_azure
|
95
91
|
|
96
92
|
if backend == "local" then
|
97
|
-
@backend = TerraformWrapper::Shared::Backends::Local.new(
|
93
|
+
@backend = TerraformWrapper::Shared::Backends::Local.new(options: backend_options, variables: @variables)
|
98
94
|
elsif backend == "aws" then
|
99
|
-
@backend = TerraformWrapper::Shared::Backends::AWS.new(
|
95
|
+
@backend = TerraformWrapper::Shared::Backends::AWS.new(options: backend_options, variables: @variables)
|
100
96
|
elsif backend == "azure" then
|
101
|
-
@backend = TerraformWrapper::Shared::Backends::Azure.new(
|
97
|
+
@backend = TerraformWrapper::Shared::Backends::Azure.new(options: backend_options, variables: @variables)
|
102
98
|
else
|
103
99
|
logger.fatal("Backend: #{backend} is not valid!")
|
104
100
|
end
|
105
101
|
end
|
106
102
|
|
107
|
-
###############################################################################
|
108
|
-
|
109
|
-
private
|
110
|
-
|
111
|
-
###############################################################################
|
112
|
-
|
113
|
-
def find
|
114
|
-
@@config_exts.each do |config_ext|
|
115
|
-
path = File.join(@base, @name + config_ext)
|
116
|
-
return path if File.file?(path)
|
117
|
-
end
|
118
|
-
|
119
|
-
logger.fatal("Terraform configuration name: #{@name} not found in location: #{@base}!")
|
120
|
-
end
|
121
|
-
|
122
|
-
###############################################################################
|
123
|
-
|
124
|
-
def validate(variable_files:)
|
125
|
-
logger.fatal("Optional key 'variable_files' must be a list of strings!") unless variable_files.kind_of?(Array)
|
126
|
-
|
127
|
-
result = Array.new
|
128
|
-
|
129
|
-
variable_files.each do |variable_file|
|
130
|
-
logger.fatal("All elements of 'variable_files' must be strings!") unless variable_file.kind_of?(String)
|
131
|
-
logger.fatal("All elements of 'variable_files' must not be blank!") if variable_file.strip.empty?
|
132
|
-
path = File.join(@base, @@variable_files_name, variable_file.strip + @@variable_files_ext)
|
133
|
-
if File.file?(path) then
|
134
|
-
result.append(path)
|
135
|
-
else
|
136
|
-
logger.fatal("Terraform variables file: #{variable_file}, path: #{path} does not exist!")
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
return result
|
141
|
-
end
|
142
|
-
|
143
103
|
###############################################################################
|
144
104
|
|
145
105
|
end
|
@@ -29,7 +29,6 @@ module TerraformWrapper
|
|
29
29
|
@code = code
|
30
30
|
|
31
31
|
@initialised = false
|
32
|
-
@ready = false
|
33
32
|
end
|
34
33
|
|
35
34
|
###############################################################################
|
@@ -48,11 +47,11 @@ module TerraformWrapper
|
|
48
47
|
def import(address: nil, id: nil)
|
49
48
|
logger.fatal("Cannot Terraform import before initialising backend!") unless initialised
|
50
49
|
|
51
|
-
logger.fatal("Terraform state address for import must be a
|
52
|
-
logger.fatal("Terraform state address for import must be a
|
50
|
+
logger.fatal("Terraform state address for import must be a string!") unless address.kind_of?(String)
|
51
|
+
logger.fatal("Terraform state address for import must be a string!") unless address.kind_of?(String)
|
53
52
|
logger.fatal("Terraform state address for import must not be blank!") if address.strip.empty?
|
54
53
|
|
55
|
-
logger.fatal("Identification for infrastructure to import must be a
|
54
|
+
logger.fatal("Identification for infrastructure to import must be a string!") unless id.kind_of?(String)
|
56
55
|
logger.fatal("Identification for infrastructure to import must not be blank!") if id.strip.empty?
|
57
56
|
|
58
57
|
parameters = Array.new
|
@@ -152,8 +151,8 @@ module TerraformWrapper
|
|
152
151
|
|
153
152
|
result = Array.new
|
154
153
|
|
155
|
-
@config.
|
156
|
-
result.append("-var-file=\"#{
|
154
|
+
@config.variables.files.each do |file|
|
155
|
+
result.append("-var-file=\"#{file}\"")
|
157
156
|
end
|
158
157
|
|
159
158
|
return result
|
@@ -166,10 +165,6 @@ module TerraformWrapper
|
|
166
165
|
|
167
166
|
result = Array.new
|
168
167
|
|
169
|
-
result.append("-var=\"component=#{@code.name}\"")
|
170
|
-
result.append("-var=\"config=#{@config.name}\"")
|
171
|
-
result.append("-var=\"service=#{@config.service}\"")
|
172
|
-
|
173
168
|
@config.variables.values.each do |key, value|
|
174
169
|
result.append("-var=\"#{key.to_s}=#{value}\"")
|
175
170
|
end
|
@@ -16,17 +16,80 @@ module TerraformWrapper
|
|
16
16
|
|
17
17
|
###############################################################################
|
18
18
|
|
19
|
-
@@
|
19
|
+
@@variable_files_name = "tfvars"
|
20
|
+
@@variable_files_exts = [ ".tfvars" ]
|
20
21
|
|
21
22
|
###############################################################################
|
22
23
|
|
24
|
+
attr_reader :core
|
25
|
+
attr_reader :files
|
26
|
+
attr_reader :identifiers
|
23
27
|
attr_reader :values
|
24
28
|
|
25
29
|
###############################################################################
|
26
30
|
|
27
|
-
def initialize(
|
28
|
-
|
29
|
-
|
31
|
+
def initialize(component:, config:, service:, identifiers: Hash.new, sort: false)
|
32
|
+
logger.fatal("Identifiers provided must be a hash!") unless identifiers.kind_of?(Hash)
|
33
|
+
|
34
|
+
@core = Hash.new()
|
35
|
+
@core[:component] = component
|
36
|
+
@core[:config] = config
|
37
|
+
@core[:service] = service
|
38
|
+
|
39
|
+
user = cleanse(variables: identifiers, reserved: @core.keys)
|
40
|
+
merged = @core.merge(user)
|
41
|
+
|
42
|
+
@identifiers = sort ? merged.sort.to_h : merged
|
43
|
+
@values = @identifiers
|
44
|
+
@files = Array.new
|
45
|
+
end
|
46
|
+
|
47
|
+
###############################################################################
|
48
|
+
|
49
|
+
def add_files(base:, files:)
|
50
|
+
logger.fatal("Variable files provided must be an array!") unless files.kind_of?(Array)
|
51
|
+
|
52
|
+
files.each do |file|
|
53
|
+
logger.fatal("All provided variable file names must be strings!") unless file.kind_of?(String)
|
54
|
+
logger.fatal("All provided variable file names must not be blank!") if file.strip.empty?
|
55
|
+
|
56
|
+
path = ::TerraformWrapper.find(base: File.join(base, @@variable_files_name), name: file.strip, exts: @@variable_files_exts, description: "Terraform values file")
|
57
|
+
|
58
|
+
if @files.include?(path) then
|
59
|
+
logger.warn("Terraform variables file is included more than once: #{file.strip}")
|
60
|
+
else
|
61
|
+
@files.append(path)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
###############################################################################
|
67
|
+
|
68
|
+
def add_variables(variables:, sort: false)
|
69
|
+
logger.fatal("Variables provided must be a hash!") unless variables.kind_of?(Hash)
|
70
|
+
|
71
|
+
cleansed = cleanse(variables: variables, reserved: @values.keys)
|
72
|
+
|
73
|
+
begin
|
74
|
+
cleansed = cleansed.map{ |key, value| [ key, value % @identifiers ] }.to_h
|
75
|
+
rescue
|
76
|
+
logger.fatal("Variables contain identifiers that are not included in the configuration file!")
|
77
|
+
end
|
78
|
+
|
79
|
+
merged = @values.merge(cleansed)
|
80
|
+
@values = sort ? merged.sort.to_h : merged
|
81
|
+
end
|
82
|
+
|
83
|
+
###############################################################################
|
84
|
+
|
85
|
+
def clear_files()
|
86
|
+
@files = Array.new
|
87
|
+
end
|
88
|
+
|
89
|
+
###############################################################################
|
90
|
+
|
91
|
+
def clear_variables()
|
92
|
+
@values = @identifers
|
30
93
|
end
|
31
94
|
|
32
95
|
###############################################################################
|
@@ -35,17 +98,17 @@ module TerraformWrapper
|
|
35
98
|
|
36
99
|
###############################################################################
|
37
100
|
|
38
|
-
def cleanse(
|
101
|
+
def cleanse(variables:, reserved:)
|
39
102
|
result = Hash.new
|
40
103
|
|
41
|
-
|
104
|
+
variables.keys.each do |key|
|
42
105
|
logger.fatal("Could not clean variables hash. All keys MUST be strings!") unless key.kind_of?(String)
|
43
|
-
logger.fatal("Could not clean variables hash, key: #{key.downcase} is reserved and cannot be used!") if
|
106
|
+
logger.fatal("Could not clean variables hash, key: #{key.downcase} is reserved or already in use and cannot be used!") if reserved.include?(key.downcase.to_sym)
|
44
107
|
logger.fatal("Could not clean variables hash, duplicate key found: #{key.downcase}!") if result.key?(key.downcase.to_sym)
|
45
|
-
logger.fatal("Could not clean variables hash, value for: #{key.downcase} is not a string!") unless
|
46
|
-
logger.fatal("Could not clean variables hash, value for: #{key.downcase} is empty!") if
|
108
|
+
logger.fatal("Could not clean variables hash, value for: #{key.downcase} is not a string!") unless variables[key].kind_of?(String)
|
109
|
+
logger.fatal("Could not clean variables hash, value for: #{key.downcase} is empty!") if variables[key].strip.empty?
|
47
110
|
|
48
|
-
result[key.downcase.to_sym] =
|
111
|
+
result[key.downcase.to_sym] = variables[key].strip
|
49
112
|
end
|
50
113
|
|
51
114
|
return result
|
@@ -133,7 +133,7 @@ module TerraformWrapper
|
|
133
133
|
def extract(archive:, binary:, destination:)
|
134
134
|
logger.info("Extracting: #{archive}")
|
135
135
|
|
136
|
-
Zip::
|
136
|
+
Zip::File.open(archive) do |zip|
|
137
137
|
zip.each do |file|
|
138
138
|
zip.extract(file, destination) if file.name == binary
|
139
139
|
end
|
data/terraform-wrapper.gemspec
CHANGED
@@ -31,6 +31,9 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.bindir = "exe"
|
32
32
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
33
33
|
spec.require_paths = ["lib"]
|
34
|
+
|
35
|
+
spec.add_dependency 'rake', '~> 13.0'
|
36
|
+
spec.add_dependency 'rubyzip', '~> 2.3'
|
34
37
|
end
|
35
38
|
|
36
39
|
###############################################################################
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: terraform-wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Lees
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
12
|
-
dependencies:
|
11
|
+
date: 2021-03-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '13.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '13.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubyzip
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.3'
|
13
41
|
description: A ruby wrapper for managing Terraform binaries and remote state. Each
|
14
42
|
Terraform command (plan, apply, etc) is wrapped so that the correct binary is used
|
15
43
|
and remote state referenced.
|