biosphere 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a63904122980f99e791afdbd4e49ad165ef26ac
4
- data.tar.gz: d7d5ea118f8321eb6cac9173d633b2bd5ca49522
3
+ metadata.gz: bc686dce74249976a49fd057c0afe79a7fe09912
4
+ data.tar.gz: aa2aa286f7d61f3c9f0c8693f5368597303c1b8b
5
5
  SHA512:
6
- metadata.gz: 4b3666b2efec558ca7d2d29356d8194078534dc777bbe02d26aae34a7db284d900b0e6ae96e2e0cb419cebaa3996f06baa78dc72de6e7f0f83020bc097461da0
7
- data.tar.gz: 1af9536e8c8cbe9b0ebed3e93fbf0e2be42b6333640dc73ef56ac60fecb5aadd501998e5b09bd2443642c62c87b270d1f779c5a6d23a2e20061047ad3b5f3c7a
6
+ metadata.gz: 97e05ad763e9c9869e73b234cd6542f7b0c4451c170f1381b8ae88ed6365763de5653847b97e7bb3a3689cbb36939e389d57ee18e0d84c75f4026c8140c8b67b
7
+ data.tar.gz: 95c255c267f676aba43ff08b63cc3045a3c9cf7bcde66e6c2bea9c2c0a9dd0b6e19b4c94c8cc34aa30beaa6809a3f9da5657b383fa237e57795676ad22118491
@@ -180,8 +180,12 @@ elsif ARGV[0] == "commit" && options.src
180
180
  puts "\nOk, will not proceed with commit"
181
181
  elsif answer == "y"
182
182
  puts "\nApplying the changes (this may take several minutes)"
183
- tf_apply = %x( terraform apply -state=#{options.build_dir}/#{deployment}.tfstate #{options.build_dir})
183
+ state_file = "#{options.build_dir}/#{deployment}.tfstate"
184
+ tf_apply = %x( terraform apply -state=#{state_file} #{options.build_dir})
184
185
  puts "\n" + tf_apply
186
+ puts "Loading outputs from #{state_file}"
187
+ suite.deployments[deployment].load_outputs(state_file)
188
+ state.save()
185
189
  s3.save("#{options.build_dir}/#{deployment}.tfstate")
186
190
  s3.save("#{options.build_dir}/state.node")
187
191
  end
@@ -58,6 +58,7 @@ class Biosphere
58
58
  @resources = []
59
59
  @actions = {}
60
60
  @deployments = []
61
+ @outputs = []
61
62
 
62
63
  self.setup(settings)
63
64
 
@@ -124,10 +125,46 @@ class Biosphere
124
125
 
125
126
  end
126
127
 
127
- def output(name, value)
128
+ def output(name, value, &block)
128
129
  @export["output"][name] = {
129
130
  "value" => value
130
131
  }
132
+
133
+ if block_given?
134
+ output = {
135
+ :name => name,
136
+ :block => block
137
+ }
138
+
139
+ @outputs << output
140
+ end
141
+ end
142
+
143
+ def evaluate_outputs(outputs)
144
+
145
+ # Call first sub-deployments
146
+ @deployments.each do |deployment|
147
+ deployment.evaluate_outputs(outputs)
148
+ end
149
+
150
+ @outputs.each do |output|
151
+ value = outputs[output[:name]]
152
+ instance_exec(value["value"], value, &output[:block])
153
+ end
154
+ end
155
+
156
+ def load_outputs(tfstate_filename)
157
+
158
+ begin
159
+ tf_state = JSON.parse(File.read(tfstate_filename))
160
+ rescue SystemCallError
161
+ puts "Couldn't read Terraform statefile, can't continue"
162
+ exit
163
+ end
164
+
165
+ outputs = tf_state["modules"].first["outputs"]
166
+
167
+ evaluate_outputs(outputs)
131
168
  end
132
169
 
133
170
  def evaluate_resources()
@@ -2,6 +2,7 @@ require 'yaml'
2
2
  require 'kubeclient'
3
3
  require 'erb'
4
4
  require 'hashdiff'
5
+ require 'ostruct'
5
6
 
6
7
  class String
7
8
  # Converts "CamelCase"" into "camel_case"
@@ -114,6 +115,46 @@ class Biosphere
114
115
 
115
116
  end
116
117
 
118
+ def apply_resource(resource)
119
+ name = resource[:metadata][:name]
120
+ responses = []
121
+ not_found = false
122
+ begin
123
+ response = get(resource)
124
+ rescue RestClient::NotFound => e
125
+ not_found = true
126
+ end
127
+
128
+ if not_found
129
+ begin
130
+ response = post(resource)
131
+ puts "Created resource #{response[:resource]}"
132
+ responses << response
133
+ rescue RestClient::UnprocessableEntity => e
134
+ pp e
135
+ pp JSON.parse(e.response.body)
136
+ end
137
+ else
138
+ puts "Updating resource #{response[:resource]}"
139
+
140
+ # Get the current full resource from apiserver
141
+ current_resource = response[:body]
142
+
143
+ update_resource = Kube.kube_merge_resource_for_put!(current_resource, resource)
144
+
145
+ begin
146
+ responses << put(update_resource)
147
+ rescue RestClient::Exception => e
148
+ puts "Error updating resource: #{e} #{e.class}"
149
+ pp JSON.parse(e.response)
150
+ rescue RestClient::Exception => e
151
+ puts "Misc exception: #{e}, #{e.class}, #{e.response}"
152
+ end
153
+
154
+ return responses
155
+ end
156
+ end
157
+
117
158
  end # end of class Client
118
159
 
119
160
  def kube_test(str)
@@ -124,25 +165,18 @@ class Biosphere
124
165
  return Client.new(hostname, ssl_options)
125
166
  end
126
167
 
127
- def kube_load_manifest_files(dir)
128
- files = Dir[dir + "/**/*.erb"]
129
- resources = []
130
- files.each do |file|
131
- resources += kube_load_manifest_file(file)
132
- end
133
-
134
- files = Dir[dir + "/**/*.yaml"]
135
- files.each do |file|
136
- resources += kube_load_manifest_file(file)
137
- end
168
+ def self.find_manifest_files(dir)
169
+ files = []
170
+ files += Dir[dir + "/**/*.erb"]
138
171
 
139
- resources
172
+ files += Dir[dir + "/**/*.yaml"]
173
+ files
140
174
  end
141
175
 
142
- def kube_load_manifest_file(file)
176
+ def self.load_resources(file, context={})
143
177
  resources = []
144
178
  puts "Loading file #{file}"
145
- str = ERB.new(IO.read(file)).result(binding)
179
+ str = ERB.new(IO.read(file)).result(OpenStruct.new(context).instance_eval { binding })
146
180
  begin
147
181
  Psych.load_stream(str) do |document|
148
182
  kind = document["kind"]
@@ -206,44 +240,6 @@ class Biosphere
206
240
  return new_version
207
241
  end
208
242
 
209
- def kube_apply_resource(client, resource)
210
- name = resource[:metadata][:name]
211
- responses = []
212
- not_found = false
213
- begin
214
- response = client.get(resource)
215
- rescue RestClient::NotFound => e
216
- not_found = true
217
- end
218
-
219
- if not_found
220
- begin
221
- response = client.post(resource)
222
- puts "Created resource #{response[:resource]}"
223
- responses << response
224
- rescue RestClient::UnprocessableEntity => e
225
- pp e
226
- pp JSON.parse(e.response.body)
227
- end
228
- else
229
- puts "Updating resource #{response[:resource]}"
230
-
231
- # Get the current full resource from apiserver
232
- current_resource = response[:body]
233
-
234
- update_resource = Kube.kube_merge_resource_for_put!(current_resource, resource)
235
243
 
236
- begin
237
- responses << client.put(update_resource)
238
- rescue RestClient::Exception => e
239
- puts "Error updating resource: #{e} #{e.class}"
240
- pp JSON.parse(e.response)
241
- rescue RestClient::Exception => e
242
- puts "Misc exception: #{e}, #{e.class}, #{e.response}"
243
- end
244
-
245
- return responses
246
- end
247
- end
248
244
  end
249
245
  end
@@ -100,6 +100,5 @@ class Biosphere
100
100
  end
101
101
 
102
102
  end
103
-
104
103
  end
105
104
  end
@@ -1,3 +1,3 @@
1
1
  class Biosphere
2
- Version = "0.1.0"
2
+ Version = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: biosphere
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juho Mäkinen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-16 00:00:00.000000000 Z
11
+ date: 2017-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec