forj 1.0.17 → 1.0.18

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9ef0968ac041ad0e35470fa80c10756c638fb911
4
- data.tar.gz: 46e08b9cb5d58abc63bc965a9f4fda5b0e173063
3
+ metadata.gz: 3713a3141ee28056dfc779808c37fbeb2653fb0e
4
+ data.tar.gz: 17ac0ed878a17cdda2af6928f063b1318a93b202
5
5
  SHA512:
6
- metadata.gz: d75b1a014f7f03bda260e21bcb1148e9107227c1c5586e3208662a1a9c1c3aa595a78bc3dbf6baafafbf938e7f1ec240bfc56bcd41057a97e31ffa57627babbb
7
- data.tar.gz: 920c86b6352be31551ad936a5a1edc678a3787e93254888466c275fee99bbe9a8a4c185c2078a78f19bf45509d78069726a5336bc0ae69a3a571a63715eca860
6
+ metadata.gz: ee0f4ac5e241c57d7b8b15c9d58ffdf4d55640d6cd58a4ab9c6fc8e207a0903cac2d50a2b1afa3359c2d3c624d72599b4ca1975af7078e494d923f1f917f8d6a
7
+ data.tar.gz: 7e3067f2f0cdf2a8c5f202ecbf043e55501dc776f1b06bf504126634721ba66a786dcc955aa3d9c8448ea71628b1396b464e0800e47ff1dbfb32063c6be28a13
@@ -19,8 +19,8 @@ Gem::Specification.new do |s|
19
19
  s.name = 'forj'
20
20
  s.homepage = 'https://www.forj.io'
21
21
 
22
- s.version = '1.0.17'
23
- s.date = '2015-06-26'
22
+ s.version = '1.0.18'
23
+ s.date = '2015-07-02'
24
24
  s.summary = 'forj command line'
25
25
  s.description = 'forj cli - See https://www.forj.io for documentation/information'
26
26
 
@@ -51,7 +51,7 @@ Gem::Specification.new do |s|
51
51
  s.add_runtime_dependency 'json', '1.7.5'
52
52
  s.add_runtime_dependency 'bundler'
53
53
  s.add_runtime_dependency 'nokogiri','1.5.11'
54
- s.add_runtime_dependency 'lorj_cloud', '>= 0.1.6'
54
+ s.add_runtime_dependency 'lorj_cloud', '>= 0.1.9'
55
55
 
56
56
  s.add_development_dependency "rake", "~> 10.0"
57
57
  s.add_development_dependency "rspec", "~> 3.1.0"
@@ -25,7 +25,7 @@
25
25
  :add:
26
26
  - :ssh_user
27
27
  :gardener_config:
28
- :desc: "Maestro gardener Cloud configuration:"
28
+ :desc: "Maestro FOG gardener Cloud configuration:"
29
29
  :explanation: |-
30
30
  Maestro gardener is currently the layer used by Maestro to access your cloud.
31
31
 
@@ -41,8 +41,8 @@
41
41
  As those changes are in transition, the old gardener behavior has been kept and can be re-enabled.
42
42
  See 'lorj_disabled' paramater in 'forj get/set' or --disable-lorj from cli.
43
43
 
44
- In order to switch easily on Maestro between FOG <=> LORJ_CLOUD, setup
45
- will still requires the openstack uri, project name, user and password.
44
+ In order to switch easily and re-activate FOG on gardener, setup will still requires
45
+ the openstack uri (auth V2.0 only), project name, user and password.
46
46
  :bp_config:
47
47
  :desc: "Maestro and blueprint configuration:"
48
48
  :maestro_access_config:
@@ -106,6 +106,7 @@
106
106
  :ask_step: :maestro_access_config
107
107
  :pre_step_function: :update_keypair_config
108
108
  :post_step_function: :forj_check_cloud_keypair
109
+ :export: true
109
110
  :auth_uri:
110
111
  :desc: "Generic service auth url"
111
112
  :account_exclusive: true
@@ -113,12 +114,14 @@
113
114
  :required: true
114
115
  :ask_sort: 0
115
116
  :ask_step: :provider_config
117
+ :export: true
116
118
  :account_id:
117
119
  :desc: "Generic Cloud Account name."
118
120
  :account_exclusive: true
119
121
  :account: true
120
122
  :required: true
121
123
  :ask_step: :provider_config
124
+ :export: true
122
125
  :account_key:
123
126
  :desc: "Generic cloud account key"
124
127
  :account_exclusive: true
@@ -126,15 +129,17 @@
126
129
  :required: true
127
130
  :encrypted: true
128
131
  :ask_step: :provider_config
132
+ :export: true
129
133
  :tenant:
130
134
  :desc: "Openstack Tenant Name (Project name)"
131
135
  :account_exclusive: true
132
136
  :account: true
133
137
  :required: true
134
138
  :ask_step: :provider_config
139
+ :export: true
135
140
  :gardener:
136
141
  :os_user:
137
- :desc: "Openstack compute cloud User name"
142
+ :desc: "Openstack compute cloud User name for Fog Gardener"
138
143
  :account_exclusive: true
139
144
  :account: true
140
145
  :required: true
@@ -143,7 +148,7 @@
143
148
  :default_value: "<%= (config[:provider] == 'openstack')?config['credentials#account_id']:nil %>"
144
149
  :ask_sort: 2
145
150
  :os_enckey:
146
- :desc: "Openstack compute cloud password"
151
+ :desc: "Openstack compute cloud password for Fog Gardener"
147
152
  :account_exclusive: true
148
153
  :encrypted: true
149
154
  :account: true
@@ -152,12 +157,9 @@
152
157
  :default_value: "<%= (config[:provider] == 'openstack')?config['credentials#account_key']:nil %>"
153
158
  :ask_sort: 3
154
159
  :os_auth_uri:
155
- :desc: "Openstack service auth url"
160
+ :desc: "Openstack service auth url for Fog Gardener"
156
161
  :explanation: |-
157
- If needed, you can set a different way for Maestro to authenticate itself to the cloud
158
-
159
- Currently, Gardener supports only openstack cloud type, with authentication version 2.
160
- Multiple provider support and Openstack authentication v3 will be implemented soon.
162
+ Only Openstack v2.0 authentication is supported by FOG gardener.
161
163
  :account_exclusive: true
162
164
  :account: true
163
165
  :required: true
@@ -175,6 +177,7 @@
175
177
  :account: true
176
178
  :post_step_function: :forj_dns_settings
177
179
  :ask_step: :dns_config
180
+ :export: true
178
181
  :dns_service:
179
182
  :desc: "DNS service region name Maestro will use."
180
183
  :account_exclusive: true
@@ -191,7 +194,7 @@
191
194
  :network:
192
195
  :webproxy:
193
196
  :desc: "HTTP/HTTPS proxy setting to access internet from your cloud"
194
-
197
+ :export: true
195
198
  # Defines maestro environment.
196
199
  :maestro:
197
200
  :tenant_name:
@@ -208,12 +211,14 @@
208
211
  :required: true
209
212
  :default_value: "forj"
210
213
  :ask_step: :maestro_config
214
+ :export: "server#network_name"
211
215
  :security_group:
212
216
  :desc: "Security group name to configure and attach to each forge boxes."
213
217
  :account: true
214
218
  :validate: !ruby/regexp /^\w?\w*$/
215
219
  :default_value: "forj"
216
220
  :ask_step: :maestro_config
221
+ :export: "server#security_group"
217
222
  :ports:
218
223
  :desc: "Ports open in the security groups given."
219
224
  :default_value: [22, 80, 443, 3000, 3131-3135, 4505-4506, 5000, 5666, 8000, 8080-8081, 8083, 8125, 8139-8140, 8773-8776, 9292, 29418, 35357]
@@ -243,6 +248,7 @@
243
248
  :desc: "Maestro Flavor name"
244
249
  :default_value: 'medium'
245
250
  :account: true
251
+ :export: "server#flavor_name"
246
252
  :list_values:
247
253
  :query_type: :query_call # Will execute a query on flavor, query_params is empty for all.
248
254
  :object: :flavor
@@ -272,6 +278,8 @@
272
278
 
273
279
  Checking image '<%= config['maestro#image_name'] %>'...
274
280
  :account: true
281
+ :export: "server#ssh_user"
282
+
275
283
  :ask_step: :maestro_img_config
276
284
  :ask_sort: 0
277
285
  :after: :image_name
@@ -302,15 +310,19 @@
302
310
  :server:
303
311
  :network_name:
304
312
  :get: false
313
+ :export: false
305
314
  :security_group:
306
315
  :get: false
316
+ :export: false
307
317
  :box_name:
308
318
  :get: false
309
319
  :flavor_name:
310
320
  :get: false
311
321
  :account: false
322
+ :export: false
312
323
  :image_name:
313
324
  :account: false
314
325
  :get: false
326
+ :export: false
315
327
  :ports:
316
328
  :get: false
@@ -55,8 +55,7 @@ class ForjCoreProcess
55
55
  o_address = hParams.refresh[:public_ip, :ObjectData]
56
56
  o_address = Lorj::Data.new if o_address.nil?
57
57
 
58
- s_status = active_server?(server, o_address, boot_options[:keys],
59
- boot_options[:coherent], s_status)
58
+ s_status = active_server?(server, o_address, boot_options, s_status)
60
59
 
61
60
  till_server_active(s_status, hParams, o_address, boot_options)
62
61
 
@@ -154,44 +153,32 @@ class ForjCoreProcess
154
153
  predef_keypair
155
154
  end
156
155
 
157
- def active_server?(o_server, o_address, private_key_file,
158
- keypair_coherent, s_status
159
- )
156
+ def active_server?(o_server, o_address, ssh_key, status)
160
157
  if o_server[:attrs][:status] == :active
161
158
  return :assign_ip if o_address[:public_ip].nil?
162
159
 
163
160
  image = server_get_image o_server
164
161
 
165
- s_msg = format('Your forj Maestro server is up and running and is '\
166
- "publically accessible through IP '%s'.\n\n"\
167
- "You can connect to '%s' with:\n"\
168
- 'ssh %s@%s -o StrictHostKeyChecking=no -i ',
169
- o_address[:public_ip], o_server[:name],
170
- image[:ssh_user], o_address[:public_ip])
162
+ s_msg = 'Your forj Maestro server is up and running and is publically'\
163
+ " accessible through IP '#{o_address[:public_ip]}'."
171
164
 
172
- if keypair_coherent
173
- s_msg += private_key_file
174
- else
175
- s_msg += ANSI.red(ANSI.bold('<no valid private key found>')) + "\n\n" +
176
- ANSI.bold('Unfortunatelly') + ', Forj was not able to find a '\
177
- 'valid keypair to connect to your server.' \
178
- "\nYou need to fix this issue to gain access to your server."
179
- end
180
165
  PrcLib.info(s_msg)
166
+ PrcLib.high_level_msg("\n%s\n", s_msg)
181
167
 
182
168
  o_log = process_get(:server_log, 25)[:attrs][:output]
183
169
  if /cloud-init boot finished/ =~ o_log
184
- s_status = :active
185
- PrcLib.high_level_msg("\n%s\nThe forge is ready...\n", s_msg)
170
+ status = :active
186
171
  else
187
- PrcLib.high_level_msg("\n%s\nThe forge is still building...\n", s_msg)
188
- s_status = :cloud_init
172
+ PrcLib.info(server_connect_info(o_server, image, o_address,
173
+ ssh_key, status))
174
+ PrcLib.high_level_msg("The forge is still building...\n")
175
+ status = :cloud_init
189
176
  end
190
177
  else
191
178
  sleep 5
192
- s_status = :starting
179
+ status = :starting
193
180
  end
194
- s_status
181
+ status
195
182
  end
196
183
  end
197
184
 
@@ -244,6 +231,8 @@ class ForjCoreProcess
244
231
  pending_count = 0
245
232
  server_error = 0
246
233
  o_server = hParams.refresh[:server, :ObjectData]
234
+ server_name = o_server[:attrs, :name]
235
+ image = server_get_image o_server
247
236
 
248
237
  while s_status != :active
249
238
  if i_cur_act == 4
@@ -258,7 +247,7 @@ class ForjCoreProcess
258
247
  if s_status == :restart
259
248
  process_delete(:server)
260
249
  PrcLib.message("Bad server '%s' removed. Creating a new one...",
261
- o_server[:name])
250
+ server_name)
262
251
  sleep(5)
263
252
  process_create(:internet_server)
264
253
  s_status = :starting
@@ -266,7 +255,10 @@ class ForjCoreProcess
266
255
  next
267
256
  end
268
257
 
269
- o_server = load_server(o_server)
258
+ unless o_server.refresh
259
+ sleep(5)
260
+ next
261
+ end
270
262
 
271
263
  if o_server[:status] == :error
272
264
  if server_error == 1
@@ -275,7 +267,7 @@ class ForjCoreProcess
275
267
  server_error = 1
276
268
  PrcLib.warning("The creation of server '%s' has currently failed. "\
277
269
  'Trying to rebuild it, once before give up.',
278
- o_server[:name])
270
+ server_name)
279
271
  s_status = :restart
280
272
  next
281
273
  end
@@ -300,7 +292,6 @@ class ForjCoreProcess
300
292
  lorj_detect(hParams, o_old_log, boot_options)
301
293
 
302
294
  if pending_count == 60
303
- image = server_get_image o_server
304
295
  highlight = ANSI.yellow('-' * 40)
305
296
  PrcLib.warning("No more server activity detected.\n"\
306
297
  "#{highlight}\n"\
@@ -312,12 +303,17 @@ class ForjCoreProcess
312
303
  "situation.\nYou can connect to the server if you "\
313
304
  "want to.\nTo connect, use:\n"\
314
305
  'ssh %s@%s -o StrictHostKeyChecking=no -i %s',
315
- o_old_log, o_server[:name], image[:ssh_user],
306
+ o_old_log, server_name, image[:ssh_user],
316
307
  o_address[:public_ip], boot_options[:keys])
317
308
  end
318
309
  end
319
310
  sleep(5) if s_status != :active
320
311
  end
312
+ PrcLib.info('The Forge build is over!')
313
+ msg = server_connect_info(o_server, image, o_address, boot_options,
314
+ s_status)
315
+ PrcLib.info(msg)
316
+ PrcLib.high_level_msg("\nThe forge is ready...\n#{msg}\n")
321
317
  end
322
318
 
323
319
  # Function to get the image data from the server
@@ -336,22 +332,6 @@ class ForjCoreProcess
336
332
 
337
333
  # rubocop:enable CyclomaticComplexity
338
334
  # rubocop:enable PerceivedComplexity
339
-
340
- # Function to get the server, tracking errors
341
- #
342
- # *return*
343
- # - Server found.
344
- #
345
- def load_server(server)
346
- begin
347
- found_server = process_get(:server, server[:attrs][:id])
348
- rescue => e
349
- PrcLib.error(e.message)
350
- else
351
- return found_server
352
- end
353
- server
354
- end
355
335
  end
356
336
 
357
337
  # Functions for boot - build_forge
@@ -369,30 +349,74 @@ class ForjCoreProcess
369
349
  end
370
350
  end
371
351
  image = hParams.refresh[:image]
372
- s_msg = <<-END
373
- Public IP for server '%s' is assigned.
374
- Now, as soon as the server respond to the ssh port,
375
- you will be able to get a tail of the build with:
376
- while [ 1 = 1 ]
377
- do
378
- ssh %s@%s -o StrictHostKeyChecking=no -i %s tail -f /var/log/cloud-init.log
379
- sleep 5
380
- done
381
- END
382
- s_msg = format(s_msg, o_server[:name], image[:ssh_user],
383
- o_address[:public_ip], boot_options[:keys]
384
- )
385
- unless boot_options[:coherent]
386
- s_msg += ANSI.bold("\nUnfortunatelly") + " your current keypair' \
387
- ' is not usable to connect to your server.\nYou need to fix' \
388
- ' this issue to gain access to your server."
389
- end
352
+ s_msg = "Public IP for server '#{o_address[:public_ip]}' is assigned."
353
+ s_msg += server_connect_info(o_server, image, o_address,
354
+ boot_options, s_status)
355
+
390
356
  PrcLib.info(s_msg)
391
357
  PrcLib.high_level_msg("\n%s\nThe forge is still building...\n", s_msg)
392
358
  s_status = :cloud_init
393
359
  s_status
394
360
  end
395
361
 
362
+ # function to print out the ssh connection information to the user
363
+ #
364
+ # * *args*:
365
+ # - server : Server object with :name
366
+ # - image : Image object with :ssh_user
367
+ # - address: Server address with :public_ip
368
+ # - ssh_key: Server ssh keys with :keys
369
+ # - status : Boot status. If boot status is :active
370
+ # the msg will simply display how to connect to.
371
+ # otherwise, it display, how to show instant log.
372
+ #
373
+ # * *returns*:
374
+ # - msg : A composite message to display
375
+ def server_connect_info(server, image, address, ssh_key, status)
376
+ server_name = server.nil? ? 'undefined' : server[:name]
377
+ image_user = image.nil? ? 'undefined' : image[:ssh_user]
378
+ public_ip = address.nil? ? 'undefined' : address[:public_ip]
379
+
380
+ if ssh_key[:coherent]
381
+ private_key = ssh_key[:keys]
382
+ else
383
+ private_key ANSI.red(ANSI.bold('<no valid private key found>'))
384
+ more = "\n\n" +
385
+ ANSI.bold('Unfortunatelly') + ', Forj was not able to find a '\
386
+ 'valid keypair to connect to your server.' \
387
+ "\nYou need to fix this issue to gain access to your server."
388
+ end
389
+
390
+ if status == :active
391
+ "Maestro is accessible through http://#{public_ip}. This will provide"\
392
+ " you access to your complete forge implemented by your blueprint.\n\n"\
393
+ 'If you want to access your server through ssh, you have several '\
394
+ "options:\n- using `forj ssh`\n- using ssh cli with:\n"\
395
+ " ssh #{image_user}@#{public_ip} -o StrictHostKeyChecking=no -i "\
396
+ "#{private_key}\n\n"\
397
+ " You can also create a new host in your ssh config with:\n"\
398
+ " echo 'host c_#{server_name}\n"\
399
+ " hostname #{public_ip}\n"\
400
+ " identity_file #{private_key}\n"\
401
+ " User #{image_user}\n"\
402
+ " # If you need to set a proxy to access this server\n"\
403
+ " # ProxyCommand corkscrew web-proxy 8080 %%h %%p' >> "\
404
+ "~/.ssh/config\n"\
405
+ "\n So, you will be able to connect to your server with:\n"\
406
+ " ssh c_#{server_name}#{more}\n"
407
+ else
408
+ "Your forge is still building...\n"\
409
+ "Now, as soon as the server respond to the ssh port,\n"\
410
+ "you will be able to get a tail of the build with:\n"\
411
+ "while [ 1 = 1 ]\n"\
412
+ "do\n"\
413
+ " ssh #{image_user}@#{public_ip} -o StrictHostKeyChecking=no -i "\
414
+ "#{private_key} tail -f /var/log/cloud-init.log\n"\
415
+ " sleep 5\n"\
416
+ "done#{more}"
417
+ end
418
+ end
419
+
396
420
  def analyze_log_output(output_options, s_status, hParams)
397
421
  o_log = process_get(:server_log, 25)
398
422
  return output_options if o_log.nil? || o_log.empty?
@@ -474,30 +498,15 @@ class ForjCoreProcess
474
498
  o_address = params[:public_ip, :ObjectData]
475
499
  blueprint = params[:blueprint]
476
500
  instance_name = params[:instance_name]
477
- s_msg = format(
478
- "Your Forge '%s' is ready and accessible from" \
479
- " IP #{o_address[:public_ip]}.",
480
- instance_name
481
- )
501
+ s_msg = "Your Forge '#{instance_name}' is ready and accessible from" \
502
+ " IP #{o_address[:public_ip]}."
503
+
482
504
  # TODO: read the blueprint/layout to identify which services
483
505
  # are implemented and can be accessible.
484
506
  if blueprint
485
- s_msg += format(
486
- "\n" + 'Maestro has implemented the following server(s) for your' \
487
- " blueprint '%s':",
488
- blueprint
489
- )
490
- server_options = display_servers_with_ip(o_forge, s_msg)
491
- s_msg += server_options[:message]
492
- i_count = server_options[:count]
493
- if i_count > 0
494
- s_msg += format("\n%d server(s) identified.\n", i_count)
495
- else
496
- s_msg = 'No servers found except maestro'
497
- PrcLib.warning('Something went wrong, while creating nodes for '\
498
- "blueprint '%s'. check maestro logs "\
499
- '(Usually /var/log/cloud-init.log).', blueprint)
500
- end
507
+ s_msg += "\nMaestro has implemented the following server(s) for your"\
508
+ " blueprint '#{blueprint}':"
509
+ s_msg = display_servers_with_ip(o_forge, blueprint, s_msg)
501
510
  else
502
511
  s_msg += "\nMaestro has NOT implemented any servers, because you did" \
503
512
  ' not provided a blueprint. Connect to Maestro, and ask Maestro to' \
@@ -508,7 +517,7 @@ class ForjCoreProcess
508
517
  PrcLib.high_level_msg("\n%s\nEnjoy!\n", s_msg)
509
518
  end
510
519
 
511
- def display_servers_with_ip(o_forge, s_msg)
520
+ def display_servers_with_ip(o_forge, blueprint, s_msg)
512
521
  i_count = 0
513
522
  o_forge[:servers].each do |_type, server|
514
523
  next if /^maestro\./ =~ server[:name]
@@ -521,8 +530,21 @@ class ForjCoreProcess
521
530
  end
522
531
  i_count += 1
523
532
  end
524
- server_options = { :message => s_msg, :count => i_count }
525
- server_options
533
+
534
+ if i_count > 0
535
+ s_msg += format("\n%d server(s) identified.\n", i_count)
536
+
537
+ else
538
+ s_msg = 'No servers found except maestro'
539
+ PrcLib.warning('Something went wrong, while creating nodes for blueprint'\
540
+ " '#{blueprint}'. check maestro logs "\
541
+ "(Usually /var/log/cloud-init.log).\n"\
542
+ 'Consider Lorj Gardener by setting :default/:lorj: '\
543
+ 'false in /opt/config/lorj/config.yaml if puppet'\
544
+ ' returned some strange ruby error.')
545
+ end
546
+
547
+ s_msg
526
548
  end
527
549
  end
528
550
 
@@ -728,11 +750,14 @@ class ForjCoreProcess
728
750
  if b_rebuild_infra
729
751
  PrcLib.state("Building your infra workspace in '%s'", infra)
730
752
 
731
- PrcLib.debug("Copying recursively '%s' to '%s'", cloud_init, infra)
732
- FileUtils.copy_entry(cloud_init, dest_cloud_init)
753
+ if File.directory?(cloud_init)
754
+ PrcLib.debug("Copying recursively '%s' to '%s'", cloud_init, infra)
755
+ FileUtils.copy_entry(cloud_init, dest_cloud_init)
756
+ end
733
757
 
734
758
  file_ver = File.join(infra, 'forj-cli.ver')
735
759
  File.write(file_ver, INFRA_VERSION)
760
+ infra_cleanup(infra, maestro_repo)
736
761
  PrcLib.info("The infra workspace '%s' has been built from maestro" \
737
762
  ' predefined files.', infra)
738
763
  else
@@ -744,19 +769,57 @@ class ForjCoreProcess
744
769
  o_infra
745
770
  end
746
771
 
747
- def load_infra(template, dest_cloud_init, h_result, b_result)
772
+ # check from the list of files under maestro control
773
+ # Do cleanup for files that disappeared.
774
+ #
775
+ # Then it update the hidden maestro controlled file.
776
+ #
777
+ def infra_cleanup(infra_dir, maestro_dir)
778
+ md5_list_file = File.join(infra_dir, '.maestro_original.yaml')
779
+
780
+ md5_list = {}
781
+ md5_list = YAML.load_file(md5_list_file) if File.exist?(md5_list_file)
782
+
783
+ cur_md5_list = {}
784
+
785
+ template_dir = File.join(maestro_dir, 'templates', 'infra')
786
+ cloud_init_dir = File.join(infra_dir, 'cloud-init')
787
+
788
+ load_infra(template_dir, cloud_init_dir, cur_md5_list)
789
+
790
+ md5_list.each do |path, _md5|
791
+ if cur_md5_list.key?(path)
792
+ md5_list[path] = cur_md5_list[path]
793
+ else
794
+ begin
795
+ File.delete(File.join(template_dir, path))
796
+ rescue
797
+ PrcLib.debug("'%s' infra file has already been removed.", path)
798
+ else
799
+ PrcLib.debug("'%s' infra file has been removed.", path)
800
+ end
801
+ md5_list.delete(path)
802
+ end
803
+ end
804
+ infra_save_md5(md5_list_file, md5_list)
805
+ end
806
+
807
+ def load_infra(template, dest_cloud_init, md5_list, is_original = false)
748
808
  # We are taking care on bootstrap files only.
749
- Find.find(File.join(template, 'cloud-init')) do |path|
750
- # unless File.directory?(path)
809
+ cloud_init_path = File.join(template, 'cloud-init')
810
+ return is_original unless File.directory?(cloud_init_path)
811
+
812
+ Find.find(cloud_init_path) do |path|
751
813
  next if File.directory?(path)
814
+ file_original = true # By default we consider it to be original
752
815
  s_maestro_rel_path = path.clone
753
- s_maestro_rel_path[File.join(template, 'cloud-init/')] = ''
816
+ s_maestro_rel_path[cloud_init_path + '/'] = ''
754
817
  s_infra_path = File.join(dest_cloud_init, s_maestro_rel_path)
755
818
  if File.exist?(s_infra_path)
756
819
  md5_file = Digest::MD5.file(s_infra_path).hexdigest
757
- if h_result.key?(s_maestro_rel_path) &&
758
- h_result[s_maestro_rel_path] != md5_file
759
- b_result = false
820
+ if md5_list.key?(s_maestro_rel_path) &&
821
+ md5_list.rh_get(s_maestro_rel_path, :md5) != md5_file
822
+ file_original = false
760
823
  PrcLib.info("'%s' infra file has changed from original template" \
761
824
  ' in maestro.', s_infra_path)
762
825
  else
@@ -764,49 +827,51 @@ class ForjCoreProcess
764
827
  end
765
828
  end
766
829
  md5_file = Digest::MD5.file(path).hexdigest
767
- h_result[s_maestro_rel_path] = md5_file
768
- # end
830
+ md5_list[s_maestro_rel_path] = { :md5 => md5_file,
831
+ :original => file_original }
832
+ is_original &= false
769
833
  end
770
- b_result
834
+ is_original
771
835
  end
772
836
 
773
- def open_md5(s_md5_list, h_result)
774
- # begin
775
- File.open(s_md5_list, 'w') do |out|
776
- YAML.dump(h_result, out)
777
- end
778
- rescue => e
779
- PrcLib.error("%s\n%s", e.message, e.backtrace.join("\n"))
780
- # end
837
+ def infra_save_md5(md5_list_file, data)
838
+ File.open(md5_list_file, 'w') { |out| YAML.dump(data, out) }
839
+ rescue => e
840
+ PrcLib.error("File '%s': %s\n%s", md5_list_file, e.message,
841
+ e.backtrace.join("\n"))
781
842
  end
782
843
  end
783
844
 
784
845
  # Functions for boot - create_or_use_infra
785
846
  class ForjCoreProcess
786
847
  # Function which compare directories from maestro templates to infra.
848
+ #
849
+ # * *return*:
850
+ # - true if the infra repository file contains some files managed by maestro
851
+ # which has not been updated manually.
852
+ # - false otherwise.
787
853
  def infra_is_original?(infra_dir, maestro_dir)
788
854
  dest_cloud_init = File.join(infra_dir, 'cloud-init')
789
855
  template = File.join(maestro_dir, 'templates', 'infra')
790
856
  return false unless File.exist?(template)
791
857
  s_md5_list = File.join(infra_dir, '.maestro_original.yaml')
792
858
  b_result = true
793
- h_result = {}
859
+ md5_list = {}
794
860
  if File.exist?(s_md5_list)
795
861
  begin
796
- h_result = YAML.load_file(s_md5_list)
862
+ md5_list = YAML.load_file(s_md5_list)
797
863
  rescue
798
864
  PrcLib.error("Unable to load valid Original files list '%s'. " \
799
865
  "Your infra workspace won't be migrated, until fixed.",
800
866
  s_md5_list)
801
867
  b_result = false
802
868
  end
803
- unless h_result
804
- h_result = {}
869
+ unless md5_list
870
+ md5_list = {}
805
871
  b_result = false
806
872
  end
807
873
  end
808
- b_result = load_infra(template, dest_cloud_init, h_result, b_result)
809
- open_md5(s_md5_list, h_result)
874
+ b_result = load_infra(template, dest_cloud_init, md5_list, b_result)
810
875
  if b_result
811
876
  PrcLib.debug(
812
877
  'No original files found has been updated. Infra workspace' \
@@ -21,25 +21,21 @@ require 'lorj'
21
21
  # lorj_account process functions
22
22
  class ForjCoreProcess
23
23
  def build_lorj_account(sObjectType, hParams)
24
- data = {}
24
+ map = {}
25
+
26
+ Lorj.data.meta_each do |section, key, data|
27
+ section_key = "#{section}##{key}"
28
+
29
+ next if data.nil? || data[:export].nil?
25
30
 
26
- map = {
27
- 'credentials#auth_uri' => {},
28
- 'credentials#account_id' => {},
29
- 'credentials#account_key' => {},
30
- 'credentials#tenant' => {},
31
- 'credentials#keypair_name' => {},
32
- 'services#compute' => {},
33
- 'services#network' => {},
34
- 'maestro#image_name' => { :keys => [:server, :image_name] },
35
- 'maestro#ssh_user' => { :keys => [:server, :ssh_user] },
36
- 'maestro#flavor_name' => { :keys => [:server, :flavor_name] },
37
- 'maestro#network_name' => { :keys => [:server, :network_name] },
38
- 'maestro#security_group' => { :keys => [:server, :security_group] },
39
- 'dns#domain_name' => {},
40
- 'network#webproxy' => {}
41
- }
31
+ if data[:export].boolean?
32
+ map[section_key] = {} if data[:export]
33
+ next
34
+ end
42
35
 
36
+ map[section_key] = { :keys => data[:export] }
37
+ end
38
+ data = {}
43
39
  data[:key], data[:data] = account_export(map, true, true,
44
40
  :exclude => ['forj_core'])
45
41
  data_registered = register(data, sObjectType)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forj
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.17
4
+ version: 1.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - forj team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-26 00:00:00.000000000 Z
11
+ date: 2015-07-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: 0.1.6
131
+ version: 0.1.9
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: 0.1.6
138
+ version: 0.1.9
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rake
141
141
  requirement: !ruby/object:Gem::Requirement