dev-lxc 1.7.0 → 2.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.
@@ -1,141 +1,800 @@
1
1
  require "dev-lxc/server"
2
+ require "mixlib/install"
3
+ require "open-uri"
2
4
 
3
5
  module DevLXC
4
6
  class Cluster
5
- attr_reader :api_fqdn, :chef_server_bootstrap_backend, :analytics_fqdn, :analytics_bootstrap_backend, :compliance_fqdn, :supermarket_fqdn, :lxc_config_path
7
+ attr_reader :config
6
8
 
7
9
  def initialize(cluster_config)
8
- @cluster_config = cluster_config
10
+ FileUtils.mkdir_p('/var/dev-lxc') unless Dir.exist?('/var/dev-lxc')
11
+ validate_cluster_config(cluster_config)
9
12
 
10
- @lxc_config_path = @cluster_config["lxc_config_path"]
11
- @lxc_config_path ||= "/var/lib/dev-lxc"
13
+ @config = Hash.new { |hash, key| hash[key] = {} }
14
+ @server_configs = Hash.new
12
15
 
13
- if @cluster_config["adhoc"]
14
- @adhoc_servers = @cluster_config["adhoc"]["servers"].keys
15
- end
16
+ %w(adhoc analytics chef-backend chef-server compliance nodes supermarket).each do |server_type|
17
+ if cluster_config[server_type]
18
+ @config[server_type][:mounts] = cluster_config[server_type]["mounts"]
19
+ @config[server_type][:mounts] ||= cluster_config["mounts"]
20
+ @config[server_type][:mounts] ||= Array.new
21
+ @config[server_type][:mounts] << "/var/dev-lxc var/dev-lxc"
22
+ @config[server_type][:ssh_keys] = cluster_config[server_type]["ssh-keys"]
23
+ @config[server_type][:ssh_keys] ||= cluster_config["ssh-keys"]
24
+ @config[server_type][:base_container_name] = cluster_config[server_type]["base_container"]
25
+ @config[server_type][:base_container_name] ||= cluster_config["base_container"]
26
+
27
+ case server_type
28
+ when "adhoc"
29
+ if cluster_config[server_type]["servers"]
30
+ cluster_config[server_type]["servers"].each do |server_name, server_config|
31
+ products = server_config['products']
32
+ products ||= Hash.new
33
+ @server_configs[server_name] = {
34
+ server_type: server_type,
35
+ products: products,
36
+ ipaddress: server_config['ipaddress'],
37
+ additional_fqdn: nil,
38
+ mounts: @config[server_type][:mounts],
39
+ ssh_keys: @config[server_type][:ssh_keys]
40
+ }
41
+ end
42
+ end
43
+ when "analytics"
44
+ @config[server_type][:topology] = cluster_config[server_type]["topology"]
45
+ @config[server_type][:topology] ||= 'standalone'
46
+ @config[server_type][:fqdn] = cluster_config[server_type]["analytics_fqdn"]
47
+ @config[server_type][:frontends] = Array.new
48
+
49
+ if cluster_config[server_type]["servers"]
50
+ cluster_config[server_type]["servers"].each do |server_name, server_config|
51
+ additional_fqdn = nil
52
+ products = server_config['products']
53
+ products ||= Hash.new
54
+ @server_configs[server_name] = server_config
55
+ case @config[server_type][:topology]
56
+ when 'standalone'
57
+ @config[server_type][:bootstrap_backend] = server_name if server_config["role"].nil?
58
+ @config[server_type][:fqdn] ||= @config[server_type][:bootstrap_backend]
59
+ when 'tier'
60
+ @config[server_type][:bootstrap_backend] = server_name if server_config["role"] == "backend" && server_config["bootstrap"] == true
61
+ if server_config["role"] == "frontend"
62
+ additional_fqdn = @config[server_type][:fqdn]
63
+ @config[server_type][:frontends] << server_name
64
+ end
65
+ end
66
+ @server_configs[server_name] = {
67
+ server_type: server_type,
68
+ products: products,
69
+ ipaddress: server_config['ipaddress'],
70
+ additional_fqdn: additional_fqdn,
71
+ mounts: @config[server_type][:mounts],
72
+ ssh_keys: @config[server_type][:ssh_keys]
73
+ }
74
+ end
75
+ end
76
+ when "chef-backend"
77
+ @config[server_type][:fqdn] = cluster_config[server_type]["api_fqdn"]
78
+ @config[server_type][:backends] = Array.new
79
+ @config[server_type][:frontends] = Array.new
16
80
 
17
- if @cluster_config["chef-server"]
18
- @chef_server_topology = @cluster_config["chef-server"]["topology"]
19
- @chef_server_topology ||= 'standalone'
20
- @api_fqdn = @cluster_config["chef-server"]["api_fqdn"]
21
- @chef_server_servers = @cluster_config["chef-server"]["servers"]
22
- @chef_server_frontends = Array.new
23
- @chef_server_servers.each do |name, config|
24
- case @chef_server_topology
25
- when 'open-source', 'standalone'
26
- @chef_server_bootstrap_backend = name if config["role"].nil?
27
- @api_fqdn ||= @chef_server_bootstrap_backend
28
- when 'tier'
29
- @chef_server_bootstrap_backend = name if config["role"] == "backend" && config["bootstrap"] == true
30
- @chef_server_frontends << name if config["role"] == "frontend"
81
+ servers = cluster_config[server_type]["servers"]
82
+ if servers
83
+ @config[server_type][:leader_backend] = servers.select { |s,sc| sc['role'] == 'backend' && sc['leader'] == true }.keys.first
84
+ @config[server_type][:bootstrap_frontend] = servers.select { |s,sc| sc['role'] == 'frontend' && sc['bootstrap'] == true }.keys.first
85
+ @config[server_type][:backends] << @config[server_type][:leader_backend]
86
+ @config[server_type][:frontends] << @config[server_type][:bootstrap_frontend]
87
+ servers.each do |server_name, server_config|
88
+ additional_fqdn = nil
89
+ products = server_config['products']
90
+ products ||= Hash.new
91
+ case server_config["role"]
92
+ when "backend"
93
+ @config[server_type][:backends] << server_name unless server_name == @config[server_type][:leader_backend]
94
+ when "frontend"
95
+ additional_fqdn = @config[server_type][:fqdn]
96
+ @config[server_type][:frontends] << server_name unless server_name == @config[server_type][:bootstrap_frontend]
97
+ end
98
+ @server_configs[server_name] = {
99
+ server_type: server_type,
100
+ products: products,
101
+ ipaddress: server_config['ipaddress'],
102
+ additional_fqdn: additional_fqdn,
103
+ mounts: @config[server_type][:mounts],
104
+ ssh_keys: @config[server_type][:ssh_keys],
105
+ chef_server_type: 'chef-server'
106
+ }
107
+ end
108
+ end
109
+ when "chef-server"
110
+ @config[server_type][:topology] = cluster_config[server_type]["topology"]
111
+ @config[server_type][:topology] ||= 'standalone'
112
+ @config[server_type][:fqdn] = cluster_config[server_type]["api_fqdn"]
113
+ @config[server_type][:frontends] = Array.new
114
+
115
+ if cluster_config[server_type]["servers"]
116
+ cluster_config[server_type]["servers"].each do |server_name, server_config|
117
+ additional_fqdn = nil
118
+ products = server_config['products']
119
+ products ||= Hash.new
120
+ chef_server_type = 'private-chef' if products.has_key?('private-chef')
121
+ chef_server_type = 'chef-server' if products.has_key?('chef-server')
122
+ case @config[server_type][:topology]
123
+ when 'standalone'
124
+ @config[server_type][:bootstrap_backend] = server_name if server_config["role"].nil?
125
+ @config[server_type][:fqdn] ||= @config[server_type][:bootstrap_backend]
126
+ when 'tier'
127
+ @config[server_type][:bootstrap_backend] = server_name if server_config["role"] == "backend" && server_config["bootstrap"] == true
128
+ if server_config["role"] == "frontend"
129
+ additional_fqdn = @config[server_type][:fqdn]
130
+ @config[server_type][:frontends] << server_name
131
+ end
132
+ end
133
+ @server_configs[server_name] = {
134
+ server_type: server_type,
135
+ products: products,
136
+ ipaddress: server_config['ipaddress'],
137
+ additional_fqdn: additional_fqdn,
138
+ mounts: @config[server_type][:mounts],
139
+ ssh_keys: @config[server_type][:ssh_keys],
140
+ chef_server_type: chef_server_type
141
+ }
142
+ end
143
+ end
144
+ when "compliance", "supermarket"
145
+ unless cluster_config[server_type]["servers"].first.nil?
146
+ (server_name, server_config) = cluster_config[server_type]["servers"].first
147
+ @config[server_type][:fqdn] = server_name
148
+ products = server_config['products']
149
+ products ||= Hash.new
150
+ @server_configs[server_name] = {
151
+ server_type: server_type,
152
+ products: products,
153
+ ipaddress: server_config['ipaddress'],
154
+ additional_fqdn: nil,
155
+ mounts: @config[server_type][:mounts],
156
+ ssh_keys: @config[server_type][:ssh_keys]
157
+ }
158
+ end
159
+ when "nodes"
160
+ if cluster_config[server_type]["servers"]
161
+ cluster_config[server_type]["servers"].each do |server_name, server_config|
162
+ products = server_config['products']
163
+ products ||= Hash.new
164
+ @server_configs[server_name] = {
165
+ server_type: server_type,
166
+ products: products,
167
+ ipaddress: server_config['ipaddress'],
168
+ additional_fqdn: nil,
169
+ mounts: @config[server_type][:mounts],
170
+ ssh_keys: @config[server_type][:ssh_keys],
171
+ chef_server_url: server_config['chef_server_url'],
172
+ validation_client_name: server_config['validation_client_name'],
173
+ validation_key: server_config['validation_key']
174
+ }
175
+ end
176
+ end
31
177
  end
32
178
  end
33
179
  end
180
+ end
181
+
182
+ def validate_cluster_config(cluster_config)
183
+ hostnames = Array.new
184
+ mounts = Array.new
185
+ base_container_names = Array.new
186
+ ssh_keys = Array.new
34
187
 
35
- if @cluster_config["analytics"]
36
- @analytics_topology = @cluster_config["analytics"]["topology"]
37
- @analytics_topology ||= 'standalone'
38
- @analytics_fqdn = @cluster_config["analytics"]["analytics_fqdn"]
39
- @analytics_servers = @cluster_config["analytics"]["servers"]
40
- @analytics_frontends = Array.new
41
- @analytics_servers.each do |name, config|
42
- case @analytics_topology
43
- when 'standalone'
44
- @analytics_bootstrap_backend = name if config["role"].nil?
45
- @analytics_fqdn ||= @analytics_bootstrap_backend
46
- when 'tier'
47
- @analytics_bootstrap_backend = name if config["role"] == "backend" && config["bootstrap"] == true
48
- @analytics_frontends << name if config["role"] == "frontend"
188
+ base_container_names << cluster_config['base_container'] unless cluster_config['base_container'].nil?
189
+ mounts.concat(cluster_config['mounts']) unless cluster_config['mounts'].nil?
190
+ ssh_keys.concat(cluster_config['ssh-keys']) unless cluster_config['ssh-keys'].nil?
191
+
192
+ %w(adhoc analytics chef-backend chef-server compliance nodes supermarket).each do |server_type|
193
+ unless cluster_config[server_type].nil?
194
+ base_container_names << cluster_config[server_type]['base_container'] unless cluster_config[server_type]['base_container'].nil?
195
+ hostnames << cluster_config[server_type]['api_fqdn'] unless cluster_config[server_type]['api_fqdn'].nil?
196
+ hostnames << cluster_config[server_type]['analytics_fqdn'] unless cluster_config[server_type]['analytics_fqdn'].nil?
197
+ hostnames.concat(cluster_config[server_type]['servers'].keys) unless cluster_config[server_type]['servers'].nil?
198
+ mounts.concat(cluster_config[server_type]['mounts']) unless cluster_config[server_type]['mounts'].nil?
199
+ ssh_keys.concat(cluster_config[server_type]['ssh-keys']) unless cluster_config[server_type]['ssh-keys'].nil?
200
+ end
201
+ end
202
+ unless base_container_names.empty?
203
+ base_container_names.each do |base_container_name|
204
+ unless ::DevLXC::Container.new(base_container_name).defined?
205
+ puts "ERROR: Base container #{base_container_name} does not exist."
206
+ exit 1
207
+ end
208
+ end
209
+ end
210
+ unless hostnames.empty?
211
+ hostnames.each do |hostname|
212
+ unless hostname.end_with?(".lxc")
213
+ puts "ERROR: Hostname #{hostname} does not end with '.lxc'."
214
+ exit 1
49
215
  end
50
216
  end
51
217
  end
218
+ unless mounts.empty?
219
+ mounts.each do |mount|
220
+ unless File.exists?(mount.split.first)
221
+ puts "ERROR: Mount source #{mount.split.first} does not exist."
222
+ exit 1
223
+ end
224
+ end
225
+ end
226
+ unless ssh_keys.empty?
227
+ ssh_keys.each do |ssh_key|
228
+ unless File.exists?(ssh_key)
229
+ puts "ERROR: SSH key #{ssh_key} does not exist."
230
+ exit 1
231
+ end
232
+ end
233
+ end
234
+ end
235
+
236
+ def get_server(server_name)
237
+ ipaddress = @server_configs[server_name][:ipaddress]
238
+ additional_fqdn = @server_configs[server_name][:additional_fqdn]
239
+ mounts = @server_configs[server_name][:mounts]
240
+ ssh_keys = @server_configs[server_name][:ssh_keys]
241
+ Server.new(server_name, ipaddress, additional_fqdn, mounts, ssh_keys)
242
+ end
52
243
 
53
- if @cluster_config["compliance"]
54
- compliance_servers = @cluster_config["compliance"]["servers"]
55
- compliance_servers.each_key do |name|
56
- @compliance_fqdn = name
244
+ def get_sorted_servers(server_name_regex=nil)
245
+ servers = Array.new
246
+
247
+ # the order of this list of server_types matters
248
+ # it determines the order in which actions are applied to each server_type
249
+ %w(chef-backend chef-server analytics compliance supermarket nodes adhoc).each do |server_type|
250
+ unless @config[server_type].empty?
251
+ case server_type
252
+ when "chef-backend"
253
+ @config[server_type][:backends].each do |backend_name|
254
+ servers << get_server(backend_name)
255
+ end
256
+ @config[server_type][:frontends].each do |frontend_name|
257
+ servers << get_server(frontend_name)
258
+ end
259
+ when "analytics", "chef-server"
260
+ if @config[server_type][:bootstrap_backend]
261
+ server_name = @config[server_type][:bootstrap_backend]
262
+ servers << get_server(server_name)
263
+ end
264
+ @config[server_type][:frontends].each do |frontend_name|
265
+ servers << get_server(frontend_name)
266
+ end
267
+ when "adhoc", "compliance", "nodes", "supermarket"
268
+ server_configs = @server_configs.select { |server_name, server_config| server_config[:server_type] == server_type }
269
+ server_configs.each_key { |server_name| servers << get_server(server_name) }
270
+ end
57
271
  end
58
272
  end
273
+ servers.select { |s| s.name =~ /#{server_name_regex}/ }
274
+ end
59
275
 
60
- if @cluster_config["supermarket"]
61
- supermarket_servers = @cluster_config["supermarket"]["servers"]
62
- supermarket_servers.each_key do |name|
63
- @supermarket_fqdn = name
276
+ def up(server_name_regex=nil)
277
+ abort_up = false
278
+ configured_servers = Array.new
279
+ servers = get_sorted_servers(server_name_regex)
280
+ servers.each do |server|
281
+ next if server.container.defined?
282
+ if (@config['chef-server'][:frontends] && @config['chef-server'][:frontends].include?(server.name)) || server.name == @config['analytics'][:bootstrap_backend]
283
+ if @config['chef-server'][:bootstrap_backend].nil?
284
+ puts "ERROR: '#{server.name}' requires a Chef Server bootstrap backend to be configured first."
285
+ abort_up = true
286
+ elsif !get_server(@config['chef-server'][:bootstrap_backend]).container.defined? && servers.select { |s| s.name == @config['chef-server'][:bootstrap_backend] }.empty?
287
+ puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be configured first."
288
+ abort_up = true
289
+ end
64
290
  end
291
+ if @config['chef-server'][:bootstrap_backend] && @server_configs[server.name][:server_type] == 'supermarket'
292
+ if !get_server(@config['chef-server'][:bootstrap_backend]).container.defined? && servers.select { |s| s.name == @config['chef-server'][:bootstrap_backend] }.empty?
293
+ puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be configured first."
294
+ abort_up = true
295
+ end
296
+ end
297
+ if @config['analytics'][:frontends] && @config['analytics'][:frontends].include?(server.name)
298
+ if @config['analytics'][:bootstrap_backend].nil?
299
+ puts "ERROR: '#{server.name}' requires an Analytics Server bootstrap backend to be configured first."
300
+ abort_up = true
301
+ elsif !get_server(@config['analytics'][:bootstrap_backend]).container.defined? && servers.select { |s| s.name == @config['analytics'][:bootstrap_backend] }.empty?
302
+ puts "ERROR: '#{server.name}' requires '#{@config['analytics'][:bootstrap_backend]}' to be configured first."
303
+ abort_up = true
304
+ end
305
+ end
306
+ if @config['chef-backend'][:frontends] && @config['chef-backend'][:frontends].include?(server.name) && server.name != @config['chef-backend'][:bootstrap_frontend]
307
+ if @config['chef-backend'][:bootstrap_frontend].nil?
308
+ puts "ERROR: '#{server.name}' requires a Chef Server bootstrap frontend to be configured first."
309
+ abort_up = true
310
+ elsif !get_server(@config['chef-backend'][:bootstrap_frontend]).container.defined? && servers.select { |s| s.name == @config['chef-backend'][:bootstrap_frontend] }.empty?
311
+ puts "ERROR: '#{server.name}' requires '#{@config['chef-backend'][:bootstrap_frontend]}' to be configured first."
312
+ abort_up = true
313
+ end
314
+ end
315
+ if server.name == @config['chef-backend'][:bootstrap_frontend]
316
+ if (@config['chef-backend'][:backends].select { |s| get_server(s).container.running? }.length + servers.select { |s| @config['chef-backend'][:backends].include?(s.name) }.length) < 2
317
+ puts "ERROR: '#{server.name}' requires at least two nodes in the backend cluster to be running first."
318
+ abort_up = true
319
+ end
320
+ end
321
+ if @config['chef-backend'][:backends] && @config['chef-backend'][:backends].include?(server.name) && server.name != @config['chef-backend'][:leader_backend]
322
+ if !get_server(@config['chef-backend'][:leader_backend]).container.running? && servers.select { |s| s.name == @config['chef-backend'][:leader_backend] }.empty?
323
+ puts "ERROR: '#{server.name}' requires '#{@config['chef-backend'][:leader_backend]}' to be running first."
324
+ abort_up = true
325
+ end
326
+ end
327
+ if @server_configs[server.name][:server_type] == 'nodes'
328
+ if @server_configs[server.name][:chef_server_url].nil? && @server_configs[server.name][:validation_client_name].nil? & @server_configs[server.name][:validation_key].nil?
329
+ if @config['chef-server'][:bootstrap_backend] && !get_server(@config['chef-server'][:bootstrap_backend]).container.defined? && servers.select { |s| s.name == @config['chef-server'][:bootstrap_backend] }.empty?
330
+ puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be configured first."
331
+ abort_up = true
332
+ elsif @config['chef-backend'][:bootstrap_frontend] && !get_server(@config['chef-backend'][:bootstrap_frontend]).container.defined? && servers.select { |s| s.name == @config['chef-backend'][:bootstrap_frontend] }.empty?
333
+ puts "ERROR: '#{server.name}' requires '#{@config['chef-backend'][:bootstrap_frontend]}' to be configured first."
334
+ abort_up = true
335
+ end
336
+ end
337
+ end
338
+ end
339
+ exit 1 if abort_up
340
+ prep_product_cache(servers)
341
+ servers.each do |server|
342
+ clone_from_base_container(server) unless server.container.defined?
343
+ end
344
+ servers = get_sorted_servers(server_name_regex)
345
+ servers.each do |server|
346
+ install_products(server) unless @server_configs[server.name][:required_products].empty?
65
347
  end
348
+ servers.each do |server|
349
+ if server.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: completed") }.empty?
350
+ if server.name == @config["chef-backend"][:bootstrap_frontend]
351
+ running_backends = Array.new
352
+ @config["chef-backend"][:backends].reverse_each do |server_name|
353
+ backend = get_server(server_name)
354
+ if backend.container.defined? && backend.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: backend cluster configured but frontend not bootstrapped") }.empty?
355
+ if backend.container.running?
356
+ running_backends << backend.name
357
+ backend.stop
358
+ end
359
+ backend.snapshot("dev-lxc build: backend cluster configured but frontend not bootstrapped")
360
+ snapshot = backend.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: completed") }.first
361
+ backend.snapshot_destroy(snapshot.first) if snapshot
362
+ end
363
+ end
364
+ @config["chef-backend"][:backends].each do |server_name|
365
+ if running_backends.include?(server_name)
366
+ get_server(server_name).start
367
+ configured_servers << server_name unless configured_servers.include?(server_name)
368
+ end
369
+ end
370
+ end
371
+ configure_products(server)
372
+ configured_servers << server.name
373
+ end
374
+ server.start unless server.container.running?
375
+ end
376
+ configured_servers.reverse_each do |server_name|
377
+ server = get_server(server_name)
378
+ server.stop if server.container.running?
379
+ server.snapshot("dev-lxc build: completed")
380
+ end
381
+ configured_servers.each do |server_name|
382
+ server = get_server(server_name)
383
+ server.start if server.container.defined?
384
+ end
385
+ end
386
+
387
+ def clone_from_base_container(server)
388
+ server_type = @server_configs[server.name][:server_type]
389
+ base_container = DevLXC::Container.new(@config[server_type][:base_container_name])
390
+ puts "Cloning base container '#{base_container.name}' into container '#{server.name}'"
391
+ base_container.clone(server.name, {:flags => LXC::LXC_CLONE_SNAPSHOT})
392
+ server.container.load_config
393
+ puts "Deleting SSH Server Host Keys"
394
+ FileUtils.rm_f(Dir.glob("#{server.container.config_item('lxc.rootfs')}/etc/ssh/ssh_host*_key*"))
395
+ puts "Adding lxc.hook.post-stop hook"
396
+ server.container.set_config_item("lxc.hook.post-stop", "/usr/local/share/lxc/hooks/post-stop-dhcp-release")
397
+ server.container.save_config
66
398
  end
67
399
 
68
- def servers
69
- chef_servers = Array.new
70
- chef_servers << Server.new(@chef_server_bootstrap_backend, 'chef-server', @cluster_config) if @chef_server_bootstrap_backend
71
- if @chef_server_topology == "tier"
72
- @chef_server_frontends.each do |frontend_name|
73
- chef_servers << Server.new(frontend_name, 'chef-server', @cluster_config)
400
+ def get_product_url(server, product_name, product_options)
401
+ server_type = @server_configs[server.name][:server_type]
402
+ base_container = DevLXC::Container.new(@config[server_type][:base_container_name])
403
+ mixlib_install_platform_detection_path = "#{base_container.config_item('lxc.rootfs')}/mixlib-install-platform-detection"
404
+ IO.write(mixlib_install_platform_detection_path, Mixlib::Install::Generator::Bourne.detect_platform_sh)
405
+ platform_results = `chroot #{base_container.config_item('lxc.rootfs')} bash mixlib-install-platform-detection`
406
+ File.unlink(mixlib_install_platform_detection_path)
407
+ if platform_results.empty?
408
+ puts "ERROR: Unable to detect the platform of container '#{base_container.name}'"
409
+ exit 1
410
+ end
411
+ (platform, platform_version, architecture) = platform_results.split
412
+ product_version = product_options['version'] if product_options
413
+ product_version ||= 'latest'
414
+ channel = product_options['channel'] if product_options
415
+ channel ||= 'stable'
416
+ channel = channel.to_sym
417
+ options = {
418
+ product_name: product_name,
419
+ product_version: product_version,
420
+ channel: channel,
421
+ platform: platform,
422
+ platform_version: platform_version,
423
+ architecture: architecture
424
+ }
425
+ artifact = Mixlib::Install.new(options).artifact_info
426
+ if artifact.class != Mixlib::Install::ArtifactInfo
427
+ puts "ERROR: Unable to find download URL for the following product"
428
+ puts JSON.pretty_generate(options)
429
+ exit 1
430
+ end
431
+ artifact.url
432
+ end
433
+
434
+ def prep_product_cache(servers)
435
+ all_required_products = Hash.new
436
+ servers.each do |server|
437
+ products = @server_configs[server.name][:products]
438
+ @server_configs[server.name][:required_products] = Hash.new
439
+ if !server.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: products installed") }.empty?
440
+ puts "Skipping product cache preparation for container '#{server.name}' because it has a 'products installed' snapshot"
441
+ next
442
+ end
443
+ products.each do |product_name, product_options|
444
+ if product_options && product_options['package_source']
445
+ package_source = product_options['package_source']
446
+ all_required_products[package_source] = product_name
447
+ @server_configs[server.name][:required_products][product_name] = package_source
448
+ else
449
+ package_source = get_product_url(server, product_name, product_options)
450
+ all_required_products[package_source] = product_name
451
+ product_cache_path = "/var/dev-lxc/cache/chef-products/#{product_name}/#{File.basename(package_source)}"
452
+ @server_configs[server.name][:required_products][product_name] = product_cache_path
453
+ end
454
+ end
455
+ end
456
+ all_required_products.each do |package_source, product_name|
457
+ if package_source.start_with?('http')
458
+ product_cache_path = "/var/dev-lxc/cache/chef-products/#{product_name}/#{File.basename(package_source)}"
459
+ if !File.exist?(product_cache_path)
460
+ FileUtils.mkdir_p(File.dirname(product_cache_path)) unless Dir.exist?(File.dirname(product_cache_path))
461
+ puts "Downloading #{package_source} to #{product_cache_path}"
462
+ open(package_source) { |url| File.open(product_cache_path, 'wb') { |f| f.write(url.read) } }
463
+ end
464
+ elsif !File.exist?(package_source)
465
+ puts "ERROR: Package source #{package_source} does not exist."
466
+ exit 1
74
467
  end
75
468
  end
76
- analytics_servers = Array.new
77
- analytics_servers << Server.new(@analytics_bootstrap_backend, 'analytics', @cluster_config) if @analytics_bootstrap_backend
78
- if @analytics_topology == "tier"
79
- @analytics_frontends.each do |frontend_name|
80
- analytics_servers << Server.new(frontend_name, 'analytics', @cluster_config)
469
+ end
470
+
471
+ def install_products(server)
472
+ if !server.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: products installed") }.empty?
473
+ puts "Skipping product installation for container '#{server.name}' because it already has a 'products installed' snapshot"
474
+ return
475
+ end
476
+ if server.container.running?
477
+ server_was_running = true
478
+ else
479
+ server_was_running = false
480
+ server.start
481
+ end
482
+ @server_configs[server.name][:required_products].each do |product_name, package_source|
483
+ server.install_package(package_source)
484
+ end
485
+ server.stop
486
+ server.snapshot("dev-lxc build: products installed")
487
+ server.start if server_was_running
488
+ end
489
+
490
+ def configure_products(server)
491
+ puts "Configuring container '#{server.name}'"
492
+ server.start unless server.container.running?
493
+ required_products = @server_configs[server.name][:required_products].keys if @server_configs[server.name][:required_products]
494
+ required_products ||= Array.new
495
+ server_type = @server_configs[server.name][:server_type]
496
+ case server_type
497
+ when 'adhoc'
498
+ # Allow adhoc servers time to generate SSH Server Host Keys
499
+ sleep 5
500
+ when 'analytics'
501
+ configure_analytics(server) if required_products.include?('analytics')
502
+ when 'chef-backend'
503
+ configure_chef_backend(server) if required_products.include?('chef-backend')
504
+ if required_products.include?('chef-server')
505
+ configure_chef_frontend(server)
506
+ create_users(server) if server.name == @config['chef-backend'][:bootstrap_frontend]
507
+ end
508
+ configure_manage(server) if required_products.include?('manage')
509
+ when 'chef-server'
510
+ if required_products.include?('chef-server') || required_products.include?('private-chef')
511
+ configure_chef_server(server)
512
+ create_users(server) if server.name == @config['chef-server'][:bootstrap_backend]
81
513
  end
514
+ configure_reporting(server) if required_products.include?('reporting')
515
+ configure_push_jobs_server(server) if required_products.include?('push-jobs-server')
516
+ configure_manage(server) if required_products.include?('manage')
517
+ when 'compliance'
518
+ configure_compliance(server) if required_products.include?('compliance')
519
+ when 'nodes'
520
+ configure_chef_client(server) if required_products.include?('chef') || required_products.include?('chefdk')
521
+ when 'supermarket'
522
+ configure_supermarket(server) if required_products.include?('supermarket')
523
+ end
524
+ end
525
+
526
+ def configure_chef_client(server)
527
+ if @server_configs[server.name][:chef_server_url] || @server_configs[server.name][:validation_client_name] || @server_configs[server.name][:validation_key]
528
+ chef_server_url = @server_configs[server.name][:chef_server_url]
529
+ validation_client_name = @server_configs[server.name][:validation_client_name]
530
+ validation_key = @server_configs[server.name][:validation_key]
531
+ elsif @config['chef-server'][:bootstrap_backend] && get_server(@config['chef-server'][:bootstrap_backend]).container.defined?
532
+ chef_server_url = "https://#{@config['chef-server'][:fqdn]}/organizations/demo"
533
+ validation_client_name = 'demo-validator'
534
+ validation_key = "#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/root/chef-repo/.chef/demo-validator.pem"
535
+ elsif @config['chef-backend'][:bootstrap_frontend] && get_server(@config['chef-backend'][:bootstrap_frontend]).container.defined?
536
+ chef_server_url = "https://#{@config['chef-backend'][:fqdn]}/organizations/demo"
537
+ validation_client_name = 'demo-validator'
538
+ validation_key = "#{get_server(@config['chef-backend'][:bootstrap_frontend]).container.config_item('lxc.rootfs')}/root/chef-repo/.chef/demo-validator.pem"
539
+ end
540
+
541
+ puts "Configuring Chef Client in container '#{server.name}' for Chef Server '#{chef_server_url}'"
542
+
543
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/chef")
544
+
545
+ client_rb = %Q(chef_server_url '#{chef_server_url}'
546
+ validation_client_name '#{validation_client_name}'
547
+ ssl_verify_mode :verify_none
548
+ )
549
+ IO.write("#{server.container.config_item('lxc.rootfs')}/etc/chef/client.rb", client_rb)
550
+
551
+ if validation_key && File.exist?(validation_key)
552
+ FileUtils.cp(validation_key, "#{server.container.config_item('lxc.rootfs')}/etc/chef/validation.pem")
553
+ else
554
+ puts "WARNING: The validation key '#{validation_key}' does not exist."
555
+ end
556
+ end
557
+
558
+ def configure_chef_backend(server)
559
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-backend")
560
+ FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-backend/.license.accepted")
561
+ if server.name == @config['chef-backend'][:leader_backend]
562
+ puts "Creating /etc/chef-backend/chef-backend.rb"
563
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/chef-backend")
564
+ chef_backend_config = "publish_address '#{@server_configs[server.name][:ipaddress]}'\n"
565
+ IO.write("#{server.container.config_item('lxc.rootfs')}/etc/chef-backend/chef-backend.rb", chef_backend_config)
566
+ run_ctl(server, "chef-backend", "bootstrap --yes")
567
+ else
568
+ puts "Joining #{server.name} to the chef-backend cluster"
569
+ leader_backend = get_server(@config['chef-backend'][:leader_backend])
570
+ FileUtils.cp("#{leader_backend.container.config_item('lxc.rootfs')}/etc/chef-backend/secrets.json",
571
+ "#{server.container.config_item('lxc.rootfs')}/root/")
572
+ run_ctl(server, "chef-backend", "join-cluster #{@server_configs[leader_backend.name][:ipaddress]} -p #{@server_configs[server.name][:ipaddress]} -s /root/secrets.json --yes")
82
573
  end
83
- adhoc_servers = Array.new
84
- if @adhoc_servers
85
- @adhoc_servers.each do |name|
86
- adhoc_servers << Server.new(name, 'adhoc', @cluster_config)
574
+ end
575
+
576
+ def configure_chef_frontend(server)
577
+ puts "Creating /etc/opscode/chef-server.rb"
578
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/opscode")
579
+ leader_backend = get_server(@config['chef-backend'][:leader_backend])
580
+ run_ctl(leader_backend, "chef-backend", "gen-server-config #{server.name} --filename /tmp/#{server.name}.rb")
581
+ FileUtils.cp("#{leader_backend.container.config_item('lxc.rootfs')}/tmp/#{server.name}.rb",
582
+ "#{server.container.config_item('lxc.rootfs')}/etc/opscode/chef-server.rb")
583
+ unless server.name == @config['chef-backend'][:bootstrap_frontend]
584
+ bootstrap_frontend = get_server(@config['chef-backend'][:bootstrap_frontend])
585
+ puts "Copying /etc/opscode/private-chef-secrets.json from bootstrap frontend '#{bootstrap_frontend.name}'"
586
+ FileUtils.cp("#{bootstrap_frontend.container.config_item('lxc.rootfs')}/etc/opscode/private-chef-secrets.json",
587
+ "#{server.container.config_item('lxc.rootfs')}/etc/opscode/")
588
+ puts "Copying /etc/opscode/pivotal.pem from bootstrap frontend '#{bootstrap_frontend.name}'"
589
+ FileUtils.cp("#{bootstrap_frontend.container.config_item('lxc.rootfs')}/etc/opscode/pivotal.pem",
590
+ "#{server.container.config_item('lxc.rootfs')}/etc/opscode/")
591
+ end
592
+ run_ctl(server, "chef-server", "reconfigure")
593
+ end
594
+
595
+ def configure_chef_server(server)
596
+ if @config['chef-server'][:topology] == "standalone" || @config['chef-server'][:bootstrap_backend] == server.name
597
+ case @server_configs[server.name][:chef_server_type]
598
+ when 'private-chef'
599
+ puts "Creating /etc/opscode/private-chef.rb"
600
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/opscode")
601
+ IO.write("#{server.container.config_item('lxc.rootfs')}/etc/opscode/private-chef.rb", chef_server_config)
602
+ when 'chef-server'
603
+ puts "Creating /etc/opscode/chef-server.rb"
604
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/opscode")
605
+ IO.write("#{server.container.config_item('lxc.rootfs')}/etc/opscode/chef-server.rb", chef_server_config)
87
606
  end
607
+ elsif @config['chef-server'][:frontends].include?(server.name)
608
+ puts "Copying /etc/opscode from bootstrap backend '#{@config['chef-server'][:bootstrap_backend]}'"
609
+ FileUtils.cp_r("#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode",
610
+ "#{server.container.config_item('lxc.rootfs')}/etc", preserve: true)
611
+ end
612
+ run_ctl(server, @server_configs[server.name][:chef_server_type], "reconfigure")
613
+ end
614
+
615
+ def configure_reporting(server)
616
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/opscode-reporting")
617
+ FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/opscode-reporting/.license.accepted")
618
+ if @config['chef-server'][:frontends].include?(server.name)
619
+ puts "Copying /etc/opscode-reporting from bootstrap backend '#{@config['chef-server'][:bootstrap_backend]}'"
620
+ FileUtils.cp_r("#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode-reporting",
621
+ "#{server.container.config_item('lxc.rootfs')}/etc", preserve: true)
622
+ end
623
+ run_ctl(server, @server_configs[server.name][:chef_server_type], "reconfigure")
624
+ run_ctl(server, "opscode-reporting", "reconfigure")
625
+ end
626
+
627
+ def configure_push_jobs_server(server)
628
+ run_ctl(server, "opscode-push-jobs-server", "reconfigure")
629
+ run_ctl(server, @server_configs[server.name][:chef_server_type], "reconfigure")
630
+ end
631
+
632
+ def configure_manage(server)
633
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-manage")
634
+ FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-manage/.license.accepted")
635
+ if @server_configs[server.name][:chef_server_type] == 'private-chef'
636
+ puts "Disabling old opscode-webui in /etc/opscode/private-chef.rb"
637
+ DevLXC.search_file_delete_line("#{server.container.config_item('lxc.rootfs')}/etc/opscode/private-chef.rb", /opscode_webui[.enable.]/)
638
+ DevLXC.append_line_to_file("#{server.container.config_item('lxc.rootfs')}/etc/opscode/private-chef.rb", "\nopscode_webui['enable'] = false\n")
639
+ run_ctl(server, @server_configs[server.name][:chef_server_type], "reconfigure")
640
+ end
641
+ run_ctl(server, "opscode-manage", "reconfigure")
642
+ end
643
+
644
+ def configure_analytics(server)
645
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/opscode-analytics")
646
+ FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/opscode-analytics/.license.accepted")
647
+ if @config['analytics'][:topology] == "standalone" || @config['analytics'][:bootstrap_backend] == server.name
648
+ puts "Copying /etc/opscode-analytics from Chef Server bootstrap backend '#{@config['chef-server'][:bootstrap_backend]}'"
649
+ FileUtils.cp_r("#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode-analytics",
650
+ "#{server.container.config_item('lxc.rootfs')}/etc", preserve: true)
651
+
652
+ IO.write("#{server.container.config_item('lxc.rootfs')}/etc/opscode-analytics/opscode-analytics.rb", analytics_config)
653
+ elsif @config['analytics'][:frontends].include?(server.name)
654
+ puts "Copying /etc/opscode-analytics from Analytics bootstrap backend '#{@config['analytics'][:bootstrap_backend]}'"
655
+ FileUtils.cp_r("#{get_server(@config['analytics'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode-analytics",
656
+ "#{server.container.config_item('lxc.rootfs')}/etc", preserve: true)
657
+ end
658
+ run_ctl(server, "opscode-analytics", "reconfigure")
659
+ end
660
+
661
+ def configure_compliance(server)
662
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-compliance")
663
+ FileUtils.touch("#{server.container.config_item('lxc.rootfs')}/var/opt/chef-compliance/.license.accepted")
664
+ run_ctl(server, "chef-compliance", "reconfigure")
665
+ end
666
+
667
+ def configure_supermarket(server)
668
+ if @config['chef-server'][:bootstrap_backend] && get_server(@config['chef-server'][:bootstrap_backend]).container.defined?
669
+ chef_server_supermarket_config = JSON.parse(IO.read("#{get_server(@config['chef-server'][:bootstrap_backend]).container.config_item('lxc.rootfs')}/etc/opscode/oc-id-applications/supermarket.json"))
670
+ supermarket_config = {
671
+ 'chef_server_url' => "https://#{@config['chef-server'][:fqdn]}/",
672
+ 'chef_oauth2_app_id' => chef_server_supermarket_config['uid'],
673
+ 'chef_oauth2_secret' => chef_server_supermarket_config['secret'],
674
+ 'chef_oauth2_verify_ssl' => false
675
+ }
676
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/supermarket")
677
+ IO.write("#{server.container.config_item('lxc.rootfs')}/etc/supermarket/supermarket.json", JSON.pretty_generate(supermarket_config))
678
+ end
679
+ run_ctl(server, "supermarket", "reconfigure")
680
+ end
681
+
682
+ def run_ctl(server, component, subcommand)
683
+ server.run_command("#{component}-ctl #{subcommand}")
684
+ end
685
+
686
+ def create_users(server)
687
+ puts "Creating org, user, keys and knife.rb in /root/chef-repo/.chef"
688
+ FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef")
689
+
690
+ chef_server_root = "https://127.0.0.1"
691
+ chef_server_url = "https://127.0.0.1/organizations/demo"
692
+ admin_username = "mary-admin"
693
+ username = "joe-user"
694
+ validator_name = "demo-validator"
695
+
696
+ FileUtils.cp( "#{server.container.config_item('lxc.rootfs')}/etc/opscode/pivotal.pem", "#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef" )
697
+
698
+ pivotal_rb = %Q(
699
+ current_dir = File.dirname(__FILE__)
700
+
701
+ chef_server_root "#{chef_server_root}"
702
+ chef_server_url "#{chef_server_root}"
703
+
704
+ node_name "pivotal"
705
+ client_key "\#{current_dir}/pivotal.pem"
706
+
707
+ cookbook_path Dir.pwd + "/cookbooks"
708
+ knife[:chef_repo_path] = Dir.pwd
709
+
710
+ ssl_verify_mode :verify_none
711
+ )
712
+ IO.write("#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/pivotal.rb", pivotal_rb)
713
+
714
+ knife_rb = %Q(
715
+ current_dir = File.dirname(__FILE__)
716
+
717
+ chef_server_url "#{chef_server_url}"
718
+
719
+ node_name "#{admin_username}"
720
+ client_key "\#{current_dir}/#{admin_username}.pem"
721
+ )
722
+
723
+ knife_rb += %Q(
724
+ #node_name "#{username}"
725
+ #client_key "\#{current_dir}/#{username}.pem"
726
+ ) unless username.nil?
727
+
728
+ knife_rb += %Q(
729
+ validation_client_name "#{validator_name}"
730
+ validation_key "\#{current_dir}/#{validator_name}.pem"
731
+
732
+ cookbook_path Dir.pwd + "/cookbooks"
733
+ knife[:chef_repo_path] = Dir.pwd
734
+
735
+ ssl_verify_mode :verify_none
736
+ )
737
+ IO.write("#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/knife.rb", knife_rb)
738
+
739
+ case @server_configs[server.name][:chef_server_type]
740
+ when 'private-chef'
741
+ # give time for all services to come up completely
742
+ sleep 60
743
+ server.run_command("/opt/opscode/embedded/bin/gem install knife-opc --no-ri --no-rdoc -v 0.3.1")
744
+ server.run_command("/opt/opscode/embedded/bin/knife opc org create demo demo --filename /root/chef-repo/.chef/demo-validator.pem -c /root/chef-repo/.chef/pivotal.rb")
745
+ server.run_command("/opt/opscode/embedded/bin/knife opc user create mary-admin mary admin mary-admin@noreply.com mary-admin --filename /root/chef-repo/.chef/mary-admin.pem -c /root/chef-repo/.chef/pivotal.rb")
746
+ server.run_command("/opt/opscode/embedded/bin/knife opc org user add demo mary-admin --admin -c /root/chef-repo/.chef/pivotal.rb")
747
+ server.run_command("/opt/opscode/embedded/bin/knife opc user create joe-user joe user joe-user@noreply.com joe-user --filename /root/chef-repo/.chef/joe-user.pem -c /root/chef-repo/.chef/pivotal.rb")
748
+ server.run_command("/opt/opscode/embedded/bin/knife opc org user add demo joe-user -c /root/chef-repo/.chef/pivotal.rb")
749
+ when 'chef-server'
750
+ # give time for all services to come up completely
751
+ sleep 10
752
+ run_ctl(server, "chef-server", "org-create demo demo --filename /root/chef-repo/.chef/demo-validator.pem")
753
+ run_ctl(server, "chef-server", "user-create mary-admin mary admin mary-admin@noreply.com mary-admin --filename /root/chef-repo/.chef/mary-admin.pem")
754
+ run_ctl(server, "chef-server", "org-user-add demo mary-admin --admin")
755
+ run_ctl(server, "chef-server", "user-create joe-user joe user joe-user@noreply.com joe-user --filename /root/chef-repo/.chef/joe-user.pem")
756
+ run_ctl(server, "chef-server", "org-user-add demo joe-user")
88
757
  end
89
- servers = chef_servers + analytics_servers
90
- servers << Server.new(@compliance_fqdn, 'compliance', @cluster_config) if @compliance_fqdn
91
- servers << Server.new(@supermarket_fqdn, 'supermarket', @cluster_config) if @supermarket_fqdn
92
- servers += adhoc_servers
93
- servers
94
758
  end
95
759
 
96
760
  def chef_repo(force=false, pivotal=false)
97
- if @chef_server_bootstrap_backend.nil?
761
+ if @config['chef-server'][:bootstrap_backend].nil?
98
762
  puts "ERROR: A bootstrap backend Chef Server is not defined in the cluster's config. Please define it first."
99
763
  exit 1
100
764
  end
101
- chef_server = Server.new(@chef_server_bootstrap_backend, 'chef-server', @cluster_config)
102
- if ! chef_server.server.defined?
103
- puts "ERROR: The '#{chef_server.server.name}' Chef Server does not exist. Please create it first."
765
+ chef_server = get_server(@config['chef-server'][:bootstrap_backend])
766
+ if ! chef_server.container.defined?
767
+ puts "ERROR: The '#{chef_server.name}' Chef Server does not exist."
104
768
  exit 1
105
769
  end
106
770
 
107
771
  puts "Creating chef-repo with pem files and knife.rb in the current directory"
108
772
  FileUtils.mkdir_p("./chef-repo/.chef")
109
773
 
110
- pem_files = Dir.glob("#{chef_server.realpath('/root/chef-repo/.chef')}/*.pem")
774
+ pem_files = Dir.glob("#{chef_server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/*.pem")
111
775
  if pem_files.empty?
112
- puts "The pem files can not be copied because they do not exist in '#{chef_server.server.name}' Chef Server's `/root/chef-repo/.chef` directory"
776
+ puts "The pem files can not be copied because they do not exist in '#{chef_server.name}' Chef Server's `/root/chef-repo/.chef` directory"
113
777
  else
114
778
  pem_files.delete_if { |pem_file| pem_file.end_with?("/pivotal.pem") } unless pivotal
115
779
  FileUtils.cp( pem_files, "./chef-repo/.chef" )
116
780
  end
117
781
 
118
- if @chef_server_topology == "open-source"
119
- chef_server_url = "https://#{@api_fqdn}"
120
- validator_name = "chef-validator"
121
- else
122
- chef_server_root = "https://#{@api_fqdn}"
123
- chef_server_url = "https://#{@api_fqdn}/organizations/demo"
124
- validator_name = "demo-validator"
782
+ chef_server_root = "https://#{@config['chef-server'][:fqdn]}"
783
+ chef_server_url = "https://#{@config['chef-server'][:fqdn]}/organizations/demo"
784
+ validator_name = "demo-validator"
125
785
 
126
- if pivotal
127
- if File.exists?("./chef-repo/.chef/pivotal.rb") && ! force
128
- puts "Skipping pivotal.rb because it already exists in `./chef-repo/.chef`"
786
+ if pivotal
787
+ if File.exists?("./chef-repo/.chef/pivotal.rb") && ! force
788
+ puts "Skipping pivotal.rb because it already exists in `./chef-repo/.chef`"
789
+ else
790
+ pivotal_rb_path = "#{chef_server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/pivotal.rb"
791
+ if File.exists?(pivotal_rb_path)
792
+ pivotal_rb = IO.read(pivotal_rb_path)
793
+ pivotal_rb.sub!(/^chef_server_root .*/, "chef_server_root \"#{chef_server_root}\"")
794
+ pivotal_rb.sub!(/^chef_server_url .*/, "chef_server_url \"#{chef_server_root}\"")
795
+ IO.write("./chef-repo/.chef/pivotal.rb", pivotal_rb)
129
796
  else
130
- pivotal_rb_path = "#{chef_server.realpath('/root/chef-repo/.chef')}/pivotal.rb"
131
- if File.exists?(pivotal_rb_path)
132
- pivotal_rb = IO.read(pivotal_rb_path)
133
- pivotal_rb.sub!(/^chef_server_root .*/, "chef_server_root \"#{chef_server_root}\"")
134
- pivotal_rb.sub!(/^chef_server_url .*/, "chef_server_url \"#{chef_server_root}\"")
135
- IO.write("./chef-repo/.chef/pivotal.rb", pivotal_rb)
136
- else
137
- puts "The pivotal.rb file can not be copied because it does not exist in '#{chef_server.server.name}' Chef Server's `/root/chef-repo/.chef` directory"
138
- end
797
+ puts "The pivotal.rb file can not be copied because it does not exist in '#{chef_server.name}' Chef Server's `/root/chef-repo/.chef` directory"
139
798
  end
140
799
  end
141
800
  end
@@ -143,54 +802,54 @@ module DevLXC
143
802
  if File.exists?("./chef-repo/.chef/knife.rb") && ! force
144
803
  puts "Skipping knife.rb because it already exists in `./chef-repo/.chef`"
145
804
  else
146
- knife_rb_path = "#{chef_server.realpath('/root/chef-repo/.chef')}/knife.rb"
805
+ knife_rb_path = "#{chef_server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/knife.rb"
147
806
  if File.exists?(knife_rb_path)
148
807
  knife_rb = IO.read(knife_rb_path)
149
808
  knife_rb.sub!(/^chef_server_url .*/, "chef_server_url \"#{chef_server_url}\"")
150
809
  IO.write("./chef-repo/.chef/knife.rb", knife_rb)
151
810
  else
152
- puts "The knife.rb file can not be copied because it does not exist in '#{chef_server.server.name}' Chef Server's `/root/chef-repo/.chef` directory"
811
+ puts "The knife.rb file can not be copied because it does not exist in '#{chef_server.name}' Chef Server's `/root/chef-repo/.chef` directory"
153
812
  end
154
813
  end
155
814
  end
156
815
 
157
816
  def chef_server_config
158
- chef_server_config = %Q(api_fqdn "#{@api_fqdn}"\n)
159
- if @chef_server_topology == 'tier'
817
+ chef_server_config = %Q(api_fqdn "#{@config['chef-server'][:fqdn]}"\n)
818
+ if @config['chef-server'][:topology] == 'tier'
160
819
  chef_server_config += %Q(
161
- topology "#{@chef_server_topology}"
820
+ topology "#{@config['chef-server'][:topology]}"
162
821
 
163
- server "#{@chef_server_bootstrap_backend}",
164
- :ipaddress => "#{@chef_server_servers[@chef_server_bootstrap_backend]["ipaddress"]}",
822
+ server "#{@config['chef-server'][:bootstrap_backend]}",
823
+ :ipaddress => "#{@server_configs[@config['chef-server'][:bootstrap_backend]][:ipaddress]}",
165
824
  :role => "backend",
166
825
  :bootstrap => true
167
826
 
168
- backend_vip "#{@chef_server_bootstrap_backend}",
169
- :ipaddress => "#{@chef_server_servers[@chef_server_bootstrap_backend]["ipaddress"]}"
827
+ backend_vip "#{@config['chef-server'][:bootstrap_backend]}",
828
+ :ipaddress => "#{@server_configs[@config['chef-server'][:bootstrap_backend]][:ipaddress]}"
170
829
  )
171
- @chef_server_frontends.each do |frontend_name|
830
+ @config['chef-server'][:frontends].each do |frontend_name|
172
831
  chef_server_config += %Q(
173
832
  server "#{frontend_name}",
174
- :ipaddress => "#{@chef_server_servers[frontend_name]["ipaddress"]}",
833
+ :ipaddress => "#{@server_configs[frontend_name][:ipaddress]}",
175
834
  :role => "frontend"
176
835
  )
177
836
  end
178
837
  end
179
- if @analytics_fqdn
838
+ if @config['analytics'][:fqdn]
180
839
  chef_server_config += %Q(
181
840
  oc_id['applications'] ||= {}
182
841
  oc_id['applications']['analytics'] = {
183
- 'redirect_uri' => 'https://#{@analytics_fqdn}/'
842
+ 'redirect_uri' => 'https://#{@config['analytics'][:fqdn]}/'
184
843
  }
185
- rabbitmq['vip'] = '#{@chef_server_bootstrap_backend}'
844
+ rabbitmq['vip'] = '#{@config['chef-server'][:bootstrap_backend]}'
186
845
  rabbitmq['node_ip_address'] = '0.0.0.0'
187
846
  )
188
847
  end
189
- if @supermarket_fqdn
848
+ if @config['supermarket'][:fqdn]
190
849
  chef_server_config += %Q(
191
850
  oc_id['applications'] ||= {}
192
851
  oc_id['applications']['supermarket'] = {
193
- 'redirect_uri' => 'https://#{@supermarket_fqdn}/auth/chef_oauth2/callback'
852
+ 'redirect_uri' => 'https://#{@config['supermarket'][:fqdn]}/auth/chef_oauth2/callback'
194
853
  }
195
854
  )
196
855
  end
@@ -198,23 +857,23 @@ oc_id['applications']['supermarket'] = {
198
857
  end
199
858
 
200
859
  def analytics_config
201
- analytics_config = %Q(analytics_fqdn "#{@analytics_fqdn}"
202
- topology "#{@analytics_topology}"
860
+ analytics_config = %Q(analytics_fqdn "#{@config['analytics'][:fqdn]}"
861
+ topology "#{@config['analytics'][:topology]}"
203
862
  )
204
- if @analytics_topology == 'tier'
863
+ if @config['analytics'][:topology] == 'tier'
205
864
  analytics_config += %Q(
206
- server "#{@analytics_bootstrap_backend}",
207
- :ipaddress => "#{@analytics_servers[@analytics_bootstrap_backend]["ipaddress"]}",
865
+ server "#{@config['analytics'][:bootstrap_backend]}",
866
+ :ipaddress => "#{@server_configs[@config['analytics'][:bootstrap_backend]][:ipaddress]}",
208
867
  :role => "backend",
209
868
  :bootstrap => true
210
869
 
211
- backend_vip "#{@analytics_bootstrap_backend}",
212
- :ipaddress => "#{@analytics_servers[@analytics_bootstrap_backend]["ipaddress"]}"
870
+ backend_vip "#{@config['analytics'][:bootstrap_backend]}",
871
+ :ipaddress => "#{@server_configs[@config['analytics'][:bootstrap_backend]][:ipaddress]}"
213
872
  )
214
- @analytics_frontends.each do |frontend_name|
873
+ @config['analytics'][:frontends].each do |frontend_name|
215
874
  analytics_config += %Q(
216
875
  server "#{frontend_name}",
217
- :ipaddress => "#{@analytics_servers[frontend_name]["ipaddress"]}",
876
+ :ipaddress => "#{@server_configs[frontend_name][:ipaddress]}",
218
877
  :role => "frontend"
219
878
  )
220
879
  end