dev-lxc 2.0.3 → 2.1.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.
@@ -8,38 +8,46 @@ module DevLXC
8
8
 
9
9
  def initialize(cluster_config)
10
10
  FileUtils.mkdir_p('/var/dev-lxc') unless Dir.exist?('/var/dev-lxc')
11
- validate_cluster_config(cluster_config)
12
11
 
13
12
  @config = Hash.new { |hash, key| hash[key] = {} }
14
13
  @server_configs = Hash.new
15
14
 
16
- %w(adhoc analytics chef-backend chef-server compliance nodes supermarket).each do |server_type|
15
+ %w(adhoc analytics automate build-nodes chef-backend chef-server compliance nodes supermarket).each do |server_type|
17
16
  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"]
17
+ mounts = ["/var/dev-lxc var/dev-lxc"]
18
+ if cluster_config[server_type]["mounts"]
19
+ mounts.concat(cluster_config[server_type]["mounts"])
20
+ elsif cluster_config["mounts"]
21
+ mounts.concat(cluster_config["mounts"])
22
+ end
23
+ ssh_keys = cluster_config[server_type]["ssh-keys"]
24
+ ssh_keys ||= cluster_config["ssh-keys"]
25
+ base_container_name = cluster_config[server_type]["base_container"]
26
+ base_container_name ||= cluster_config["base_container"]
27
+
28
+ if cluster_config[server_type]["servers"]
29
+ cluster_config[server_type]["servers"].each do |server_name, server_config|
30
+ server_config ||= Hash.new
31
+ products = server_config['products']
32
+ products ||= Hash.new
33
+ mounts = ["/var/dev-lxc var/dev-lxc"] + server_config["mounts"] if server_config["mounts"]
34
+ ssh_keys = server_config["ssh-keys"] if server_config["ssh-keys"]
35
+ base_container_name = server_config["base_container"] if server_config["base_container"]
36
+ @server_configs[server_name] = {
37
+ server_type: server_type,
38
+ products: products,
39
+ ipaddress: server_config['ipaddress'],
40
+ additional_fqdn: nil,
41
+ mounts: mounts,
42
+ ssh_keys: ssh_keys,
43
+ base_container_name: base_container_name
44
+ }
45
+ # gather configuration from only the first "automate", "compliance" or "supermarket" server
46
+ break if %w(automate compliance supermarket).include?(server_type)
47
+ end
48
+ end
26
49
 
27
50
  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
51
  when "analytics"
44
52
  @config[server_type][:topology] = cluster_config[server_type]["topology"]
45
53
  @config[server_type][:topology] ||= 'standalone'
@@ -48,10 +56,8 @@ module DevLXC
48
56
 
49
57
  if cluster_config[server_type]["servers"]
50
58
  cluster_config[server_type]["servers"].each do |server_name, server_config|
59
+ server_config ||= Hash.new
51
60
  additional_fqdn = nil
52
- products = server_config['products']
53
- products ||= Hash.new
54
- @server_configs[server_name] = server_config
55
61
  case @config[server_type][:topology]
56
62
  when 'standalone'
57
63
  @config[server_type][:bootstrap_backend] = server_name if server_config["role"].nil?
@@ -63,18 +69,17 @@ module DevLXC
63
69
  @config[server_type][:frontends] << server_name
64
70
  end
65
71
  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
- }
72
+ @server_configs[server_name].merge!({
73
+ additional_fqdn: additional_fqdn
74
+ })
74
75
  end
75
76
  end
76
77
  when "chef-backend"
77
78
  @config[server_type][:fqdn] = cluster_config[server_type]["api_fqdn"]
79
+ @config[server_type][:users] = cluster_config[server_type]["users"]
80
+ @config[server_type][:users] ||= Array.new
81
+ @config[server_type][:orgs] = cluster_config[server_type]["orgs"]
82
+ @config[server_type][:orgs] ||= Hash.new
78
83
  @config[server_type][:backends] = Array.new
79
84
  @config[server_type][:frontends] = Array.new
80
85
 
@@ -85,9 +90,8 @@ module DevLXC
85
90
  @config[server_type][:backends] << @config[server_type][:leader_backend]
86
91
  @config[server_type][:frontends] << @config[server_type][:bootstrap_frontend]
87
92
  servers.each do |server_name, server_config|
93
+ server_config ||= Hash.new
88
94
  additional_fqdn = nil
89
- products = server_config['products']
90
- products ||= Hash.new
91
95
  case server_config["role"]
92
96
  when "backend"
93
97
  @config[server_type][:backends] << server_name unless server_name == @config[server_type][:leader_backend]
@@ -95,30 +99,28 @@ module DevLXC
95
99
  additional_fqdn = @config[server_type][:fqdn]
96
100
  @config[server_type][:frontends] << server_name unless server_name == @config[server_type][:bootstrap_frontend]
97
101
  end
98
- @server_configs[server_name] = {
99
- server_type: server_type,
100
- products: products,
101
- ipaddress: server_config['ipaddress'],
102
+ @server_configs[server_name].merge!({
102
103
  additional_fqdn: additional_fqdn,
103
- mounts: @config[server_type][:mounts],
104
- ssh_keys: @config[server_type][:ssh_keys],
105
104
  chef_server_type: 'chef-server'
106
- }
105
+ })
107
106
  end
108
107
  end
109
108
  when "chef-server"
110
109
  @config[server_type][:topology] = cluster_config[server_type]["topology"]
111
110
  @config[server_type][:topology] ||= 'standalone'
112
111
  @config[server_type][:fqdn] = cluster_config[server_type]["api_fqdn"]
112
+ @config[server_type][:users] = cluster_config[server_type]["users"]
113
+ @config[server_type][:users] ||= Array.new
114
+ @config[server_type][:orgs] = cluster_config[server_type]["orgs"]
115
+ @config[server_type][:orgs] ||= Hash.new
113
116
  @config[server_type][:frontends] = Array.new
114
117
 
115
118
  if cluster_config[server_type]["servers"]
116
119
  cluster_config[server_type]["servers"].each do |server_name, server_config|
120
+ server_config ||= Hash.new
117
121
  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
+ chef_server_type = 'private-chef' if @server_configs[server_name][:products].has_key?('private-chef')
123
+ chef_server_type = 'chef-server' if @server_configs[server_name][:products].has_key?('chef-server')
122
124
  case @config[server_type][:topology]
123
125
  when 'standalone'
124
126
  @config[server_type][:bootstrap_backend] = server_name if server_config["role"].nil?
@@ -130,75 +132,77 @@ module DevLXC
130
132
  @config[server_type][:frontends] << server_name
131
133
  end
132
134
  end
133
- @server_configs[server_name] = {
134
- server_type: server_type,
135
- products: products,
136
- ipaddress: server_config['ipaddress'],
135
+ @server_configs[server_name].merge!({
137
136
  additional_fqdn: additional_fqdn,
138
- mounts: @config[server_type][:mounts],
139
- ssh_keys: @config[server_type][:ssh_keys],
140
137
  chef_server_type: chef_server_type
141
- }
138
+ })
142
139
  end
143
140
  end
144
- when "compliance", "supermarket"
141
+ when "supermarket"
145
142
  unless cluster_config[server_type]["servers"].first.nil?
146
143
  (server_name, server_config) = cluster_config[server_type]["servers"].first
147
144
  @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
- }
145
+ end
146
+ when "automate"
147
+ unless cluster_config[server_type]["servers"].first.nil?
148
+ (server_name, server_config) = cluster_config[server_type]["servers"].first
149
+ server_config ||= Hash.new
150
+ @server_configs[server_name].merge!({
151
+ license_path: server_config['license_path'],
152
+ chef_org: server_config['chef_org'],
153
+ enterprise_name: server_config['enterprise_name']
154
+ })
158
155
  end
159
156
  when "nodes"
157
+ chef_server_url = cluster_config[server_type]['chef_server_url']
158
+ validation_client_name = cluster_config[server_type]['validation_client_name']
159
+ validation_key = cluster_config[server_type]['validation_key']
160
160
  if cluster_config[server_type]["servers"]
161
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
- }
162
+ server_config ||= Hash.new
163
+ chef_server_url = server_config['chef_server_url'] if server_config['chef_server_url']
164
+ validation_client_name = server_config['validation_client_name'] if server_config['validation_client_name']
165
+ validation_key = server_config['validation_key'] if server_config['validation_key']
166
+ @server_configs[server_name].merge!({
167
+ chef_server_url: chef_server_url,
168
+ validation_client_name: validation_client_name,
169
+ validation_key: validation_key
170
+ })
175
171
  end
176
172
  end
177
173
  end
178
174
  end
179
175
  end
176
+ validate_cluster_config
180
177
  end
181
178
 
182
- def validate_cluster_config(cluster_config)
183
- hostnames = Array.new
184
- mounts = Array.new
179
+ def validate_cluster_config
185
180
  base_container_names = Array.new
181
+ mounts = Array.new
186
182
  ssh_keys = Array.new
183
+ hostnames = Array.new
187
184
 
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?
185
+ @config.map { |server_type, config| hostnames.push(config[:fqdn]) }
186
+
187
+ @server_configs.each do |server_name, server_config|
188
+ base_container_names.push(server_config[:base_container_name]).uniq! if server_config[:base_container_name]
189
+ mounts.concat(server_config[:mounts]).uniq! if server_config[:mounts]
190
+ ssh_keys.concat(server_config[:ssh_keys]).uniq! if server_config[:ssh_keys]
191
+ hostnames.push(server_name)
192
+ case server_config[:server_type]
193
+ when "automate"
194
+ if server_config[:license_path] && !File.exists?(server_config[:license_path])
195
+ puts "ERROR: Automate license #{server_config[:license_path]} does not exist."
196
+ exit 1
197
+ end
198
+ when "nodes"
199
+ if server_config[:validation_key] && !File.exists?(server_config[:validation_key])
200
+ puts "ERROR: Validation key #{server_config[:validation_key]} does not exist."
201
+ exit 1
202
+ end
200
203
  end
201
204
  end
205
+
202
206
  unless base_container_names.empty?
203
207
  base_container_names.each do |base_container_name|
204
208
  unless ::DevLXC::Container.new(base_container_name).defined?
@@ -233,6 +237,15 @@ module DevLXC
233
237
  end
234
238
  end
235
239
 
240
+ def show_config
241
+ require 'pp'
242
+ puts "Cluster config:"
243
+ pp @config
244
+ puts
245
+ puts "Server configs:"
246
+ pp @server_configs
247
+ end
248
+
236
249
  def get_server(server_name)
237
250
  ipaddress = @server_configs[server_name][:ipaddress]
238
251
  additional_fqdn = @server_configs[server_name][:additional_fqdn]
@@ -246,7 +259,7 @@ module DevLXC
246
259
 
247
260
  # the order of this list of server_types matters
248
261
  # 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|
262
+ %w(chef-backend chef-server analytics compliance supermarket automate build-nodes nodes adhoc).each do |server_type|
250
263
  unless @config[server_type].empty?
251
264
  case server_type
252
265
  when "chef-backend"
@@ -264,11 +277,12 @@ module DevLXC
264
277
  @config[server_type][:frontends].each do |frontend_name|
265
278
  servers << get_server(frontend_name)
266
279
  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
280
  end
271
281
  end
282
+ if %w(adhoc automate build-nodes compliance nodes supermarket).include?(server_type)
283
+ server_configs = @server_configs.select { |server_name, server_config| server_config[:server_type] == server_type }
284
+ server_configs.each_key { |server_name| servers << get_server(server_name) }
285
+ end
272
286
  end
273
287
  servers.select { |s| s.name =~ /#{server_name_regex}/ }
274
288
  end
@@ -325,7 +339,7 @@ module DevLXC
325
339
  end
326
340
  end
327
341
  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?
342
+ if @server_configs[server.name][:chef_server_url] && @server_configs[server.name][:validation_client_name] && @server_configs[server.name][:validation_key].nil?
329
343
  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
344
  puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be configured first."
331
345
  abort_up = true
@@ -335,6 +349,43 @@ module DevLXC
335
349
  end
336
350
  end
337
351
  end
352
+ if @server_configs[server.name][:server_type] == 'automate'
353
+ if @config['chef-server'][:bootstrap_backend].nil?
354
+ puts "ERROR: '#{server.name}' requires a Chef Server bootstrap backend to be configured first."
355
+ abort_up = true
356
+ elsif !get_server(@config['chef-server'][:bootstrap_backend]).container.defined? && servers.select { |s| s.name == @config['chef-server'][:bootstrap_backend] }.empty?
357
+ puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be configured first."
358
+ abort_up = true
359
+ end
360
+ end
361
+ if @server_configs[server.name][:server_type] == 'build-nodes'
362
+ if @config['chef-server'][:bootstrap_backend].nil?
363
+ puts "ERROR: '#{server.name}' requires a Chef Server bootstrap backend to be configured first."
364
+ abort_up = true
365
+ elsif !get_server(@config['chef-server'][:bootstrap_backend]).container.running? && servers.select { |s| s.name == @config['chef-server'][:bootstrap_backend] }.empty?
366
+ puts "ERROR: '#{server.name}' requires '#{@config['chef-server'][:bootstrap_backend]}' to be running first."
367
+ abort_up = true
368
+ end
369
+ if @config['chef-server'][:topology] == 'tier'
370
+ if @config[server_type][:frontends].empty?
371
+ puts "ERROR: '#{server.name}' requires at least one Chef Server frontend to be configured first."
372
+ abort_up = true
373
+ elsif (@config['chef-server'][:frontends].select { |s| get_server(s).container.running? }.length + servers.select { |s| @config['chef-server'][:frontends].include?(s.name) }.length) < 1
374
+ puts "ERROR: '#{server.name}' requires at least one Chef Server frontend to be running first."
375
+ abort_up = true
376
+ end
377
+ end
378
+ automate_server_name = @server_configs.select {|name, config| config[:server_type] == 'automate'}.keys.first
379
+ if automate_server_name
380
+ if !get_server(automate_server_name).container.running? && servers.select { |s| s.name == automate_server_name }.empty?
381
+ puts "ERROR: '#{server.name}' requires '#{automate_server_name}' to be running first."
382
+ abort_up = true
383
+ end
384
+ else
385
+ puts "ERROR: '#{server.name}' requires an Automate Server to be configured first."
386
+ abort_up = true
387
+ end
388
+ end
338
389
  end
339
390
  exit 1 if abort_up
340
391
  prep_product_cache(servers)
@@ -386,7 +437,7 @@ module DevLXC
386
437
 
387
438
  def clone_from_base_container(server)
388
439
  server_type = @server_configs[server.name][:server_type]
389
- base_container = DevLXC::Container.new(@config[server_type][:base_container_name])
440
+ base_container = DevLXC::Container.new(@server_configs[server.name][:base_container_name])
390
441
  puts "Cloning base container '#{base_container.name}' into container '#{server.name}'"
391
442
  base_container.clone(server.name, {:flags => LXC::LXC_CLONE_SNAPSHOT})
392
443
  server.container.load_config
@@ -399,7 +450,7 @@ module DevLXC
399
450
 
400
451
  def get_product_url(server, product_name, product_options)
401
452
  server_type = @server_configs[server.name][:server_type]
402
- base_container = DevLXC::Container.new(@config[server_type][:base_container_name])
453
+ base_container = DevLXC::Container.new(@server_configs[server.name][:base_container_name])
403
454
  mixlib_install_platform_detection_path = "#{base_container.config_item('lxc.rootfs')}/mixlib-install-platform-detection"
404
455
  IO.write(mixlib_install_platform_detection_path, Mixlib::Install::Generator::Bourne.detect_platform_sh)
405
456
  platform_results = `chroot #{base_container.config_item('lxc.rootfs')} bash mixlib-install-platform-detection`
@@ -431,13 +482,13 @@ module DevLXC
431
482
  artifact.url
432
483
  end
433
484
 
434
- def prep_product_cache(servers)
485
+ def prep_product_cache(servers, force=false)
435
486
  all_required_products = Hash.new
436
487
  servers.each do |server|
437
488
  products = @server_configs[server.name][:products]
438
489
  @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"
490
+ if !force && !server.snapshot_list.select { |sn| sn[2].start_with?("dev-lxc build: products installed") }.empty?
491
+ # Skipping product cache preparation for container because it has a 'products installed' snapshot
441
492
  next
442
493
  end
443
494
  products.each do |product_name, product_options|
@@ -480,7 +531,11 @@ module DevLXC
480
531
  server.start
481
532
  end
482
533
  @server_configs[server.name][:required_products].each do |product_name, package_source|
483
- server.install_package(package_source)
534
+ if @server_configs[server.name][:server_type] == "automate" && product_name == "chefdk"
535
+ IO.write("#{server.container.config_item('lxc.rootfs')}/root/build_node_chefdk_package_path", "#{package_source}\n")
536
+ else
537
+ server.install_package(package_source)
538
+ end
484
539
  end
485
540
  server.stop
486
541
  server.snapshot("dev-lxc build: products installed")
@@ -493,66 +548,147 @@ module DevLXC
493
548
  required_products = @server_configs[server.name][:required_products].keys if @server_configs[server.name][:required_products]
494
549
  required_products ||= Array.new
495
550
  server_type = @server_configs[server.name][:server_type]
551
+ dot_chef_path = "/root/chef-repo/.chef"
496
552
  case server_type
497
553
  when 'adhoc'
498
554
  # Allow adhoc servers time to generate SSH Server Host Keys
499
555
  sleep 5
500
556
  when 'analytics'
501
557
  configure_analytics(server) if required_products.include?('analytics')
558
+ when 'build-nodes'
559
+ configure_build_node(server)
502
560
  when 'chef-backend'
503
561
  configure_chef_backend(server) if required_products.include?('chef-backend')
504
562
  if required_products.include?('chef-server')
505
563
  configure_chef_frontend(server)
506
- create_users(server) if server.name == @config['chef-backend'][:bootstrap_frontend]
564
+ if server.name == @config['chef-backend'][:bootstrap_frontend]
565
+ create_users_orgs_knife_configs(server, dot_chef_path)
566
+ end
507
567
  end
508
568
  configure_manage(server) if required_products.include?('manage')
509
569
  when 'chef-server'
510
570
  if required_products.include?('chef-server') || required_products.include?('private-chef')
511
571
  configure_chef_server(server)
512
- create_users(server) if server.name == @config['chef-server'][:bootstrap_backend]
572
+ if server.name == @config['chef-server'][:bootstrap_backend]
573
+ create_users_orgs_knife_configs(server, dot_chef_path)
574
+
575
+ automate_server_name = @server_configs.select {|name, config| config[:server_type] == 'automate'}.keys.first
576
+ if automate_server_name
577
+ automate_user = "delivery"
578
+ automate_chef_org = @server_configs[automate_server_name][:chef_org]
579
+ create_user(server, automate_user, dot_chef_path)
580
+ create_org(server, automate_chef_org, dot_chef_path)
581
+ org_add_user(server, automate_chef_org, automate_user, true, dot_chef_path)
582
+ end
583
+ end
513
584
  end
514
585
  configure_reporting(server) if required_products.include?('reporting')
515
586
  configure_push_jobs_server(server) if required_products.include?('push-jobs-server')
516
587
  configure_manage(server) if required_products.include?('manage')
517
588
  when 'compliance'
518
589
  configure_compliance(server) if required_products.include?('compliance')
590
+ when 'automate'
591
+ configure_automate(server) if required_products.include?('delivery')
519
592
  when 'nodes'
520
- configure_chef_client(server) if required_products.include?('chef') || required_products.include?('chefdk')
593
+ # Allow servers time to generate SSH Server Host Keys
594
+ sleep 5
595
+ configure_chef_client(server, dot_chef_path) if required_products.include?('chef') || required_products.include?('chefdk')
521
596
  when 'supermarket'
522
597
  configure_supermarket(server) if required_products.include?('supermarket')
523
598
  end
524
599
  end
525
600
 
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"
601
+ def configure_automate(server)
602
+ license_path = @server_configs[server.name][:license_path]
603
+ chef_org = @server_configs[server.name][:chef_org]
604
+ enterprise_name = @server_configs[server.name][:enterprise_name]
605
+ chef_server_url = @config['chef-server'][:fqdn]
606
+ supermarket_fqdn = @config['supermarket'][:fqdn]
607
+
608
+ FileUtils.cp(license_path, "#{server.container.config_item('lxc.rootfs')}/root/automate.license")
609
+
610
+ chef_server = get_server(@config['chef-server'][:bootstrap_backend])
611
+ automate_chef_user_key = "#{chef_server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/delivery.pem"
612
+ FileUtils.cp(automate_chef_user_key, "#{server.container.config_item('lxc.rootfs')}/root/automate_chef_user_key.pem")
613
+
614
+ setup_cmd = "setup"
615
+ setup_cmd += " --license /root/automate.license"
616
+ setup_cmd += " --fqdn #{server.name}"
617
+ setup_cmd += " --key /root/automate_chef_user_key.pem"
618
+ setup_cmd += " --server-url https://#{chef_server_url}/organizations/#{chef_org}"
619
+ setup_cmd += " --supermarket-fqdn #{supermarket_fqdn}" if supermarket_fqdn
620
+ setup_cmd += " --enterprise #{enterprise_name}"
621
+ setup_cmd += " --no-build-node"
622
+ setup_cmd += " --configure"
623
+ run_ctl(server, "delivery", setup_cmd)
624
+ end
625
+
626
+ def print_automate_credentials
627
+ automate_server_name = @server_configs.select {|name, config| config[:server_type] == 'automate'}.keys.first
628
+ if automate_server_name
629
+ automate_server = get_server(automate_server_name)
630
+ automate_credentials_files = Dir.glob("#{automate_server.container.config_item('lxc.rootfs')}/etc/delivery/*-credentials")
631
+ automate_credentials_files.each_with_index do |automate_credentials_file, index|
632
+ puts IO.read(automate_credentials_file)
633
+ puts if index + 1 < automate_credentials_files.length
634
+ end
635
+ else
636
+ puts "WARNING: An Automate server is not defined."
637
+ exit 1
539
638
  end
639
+ end
540
640
 
541
- puts "Configuring Chef Client in container '#{server.name}' for Chef Server '#{chef_server_url}'"
641
+ def configure_build_node(server)
642
+ automate_server_name = @server_configs.select {|name, config| config[:server_type] == 'automate'}.keys.first
643
+ if automate_server_name
644
+ automate_server = get_server(automate_server_name)
645
+ if File.exist?("#{automate_server.container.config_item('lxc.rootfs')}/root/build_node_chefdk_package_path")
646
+ build_node_chefdk_package_path = IO.read("#{automate_server.container.config_item('lxc.rootfs')}/root/build_node_chefdk_package_path").chomp
647
+ install_build_node_cmd = "install-build-node"
648
+ install_build_node_cmd += " --fqdn #{server.name}"
649
+ install_build_node_cmd += " --username dev-lxc"
650
+ install_build_node_cmd += " --password dev-lxc"
651
+ install_build_node_cmd += " --installer #{build_node_chefdk_package_path}"
652
+ run_ctl(automate_server, "delivery", install_build_node_cmd)
653
+ end
654
+ end
655
+ end
656
+
657
+ def configure_chef_client(server, dot_chef_path)
658
+ puts "Configuring Chef Client in container '#{server.name}'"
542
659
 
543
660
  FileUtils.mkdir_p("#{server.container.config_item('lxc.rootfs')}/etc/chef")
544
661
 
662
+ chef_server_url = @server_configs[server.name][:chef_server_url]
663
+ validation_client_name = @server_configs[server.name][:validation_client_name]
664
+ validation_key = @server_configs[server.name][:validation_key]
665
+ if validation_key.nil?
666
+ chef_server_name = @config['chef-server'][:bootstrap_backend]
667
+ chef_server_name ||= @config['chef-backend'][:bootstrap_frontend]
668
+ if chef_server_name
669
+ chef_server = get_server(chef_server_name)
670
+ if chef_server.container.defined?
671
+ validator_pem_files = Dir.glob("#{chef_server.container.config_item('lxc.rootfs')}#{dot_chef_path}/*-validator.pem")
672
+ FileUtils.cp(validator_pem_files, "#{server.container.config_item('lxc.rootfs')}/etc/chef/") unless validator_pem_files.empty?
673
+ end
674
+ end
675
+ end
676
+
545
677
  client_rb = %Q(chef_server_url '#{chef_server_url}'
546
678
  validation_client_name '#{validation_client_name}'
679
+ validation_key '/etc/chef/#{validation_client_name}.pem'
547
680
  ssl_verify_mode :verify_none
548
681
  )
549
- IO.write("#{server.container.config_item('lxc.rootfs')}/etc/chef/client.rb", client_rb)
550
682
 
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."
683
+ automate_server_name = @server_configs.select {|name, config| config[:server_type] == 'automate'}.keys.first
684
+ if automate_server_name
685
+ client_rb += %Q(
686
+ data_collector.server_url "https://#{automate_server_name}/data-collector/v0/"
687
+ data_collector.token "93a49a4f2482c64126f7b6015e6b0f30284287ee4054ff8807fb63d9cbd1c506"
688
+ )
555
689
  end
690
+
691
+ IO.write("#{server.container.config_item('lxc.rootfs')}/etc/chef/client.rb", client_rb)
556
692
  end
557
693
 
558
694
  def configure_chef_backend(server)
@@ -683,23 +819,46 @@ ssl_verify_mode :verify_none
683
819
  server.run_command("#{component}-ctl #{subcommand}")
684
820
  end
685
821
 
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" )
822
+ def create_users_orgs_knife_configs(server, dot_chef_path)
823
+ server_type = @server_configs[server.name][:server_type]
824
+ # give time for all services to come up completely
825
+ sleep 10
826
+ if @server_configs[server.name][:chef_server_type] == 'private-chef'
827
+ # give more time for all services to come up completely
828
+ sleep 50
829
+ server.run_command("/opt/opscode/embedded/bin/gem install knife-opc --no-ri --no-rdoc -v 0.3.1")
830
+ end
831
+ chef_server_dot_chef_path = "#{server.container.config_item('lxc.rootfs')}#{dot_chef_path}"
832
+ FileUtils.mkdir_p(chef_server_dot_chef_path)
833
+ FileUtils.cp( "#{server.container.config_item('lxc.rootfs')}/etc/opscode/pivotal.pem", chef_server_dot_chef_path )
834
+ create_pivotal_knife_config('127.0.0.1', chef_server_dot_chef_path)
835
+ create_knife_config('127.0.0.1', chef_server_dot_chef_path)
836
+ @config[server_type][:users].each do |username|
837
+ create_user(server, username, dot_chef_path)
838
+ end
839
+ @config[server_type][:orgs].each do |orgname, org_users|
840
+ create_org(server, orgname, dot_chef_path)
841
+ if org_users
842
+ if org_users['admins']
843
+ org_users['admins'].each do |username|
844
+ org_add_user(server, orgname, username, true, dot_chef_path)
845
+ end
846
+ end
847
+ if org_users['non-admins']
848
+ org_users['non-admins'].each do |username|
849
+ org_add_user(server, orgname, username, false, dot_chef_path)
850
+ end
851
+ end
852
+ end
853
+ end
854
+ end
697
855
 
856
+ def create_pivotal_knife_config(fqdn, dot_chef_path)
698
857
  pivotal_rb = %Q(
699
858
  current_dir = File.dirname(__FILE__)
700
859
 
701
- chef_server_root "#{chef_server_root}"
702
- chef_server_url "#{chef_server_root}"
860
+ chef_server_root "https://#{fqdn}"
861
+ chef_server_url "https://#{fqdn}"
703
862
 
704
863
  node_name "pivotal"
705
864
  client_key "\#{current_dir}/pivotal.pem"
@@ -709,107 +868,106 @@ knife[:chef_repo_path] = Dir.pwd
709
868
 
710
869
  ssl_verify_mode :verify_none
711
870
  )
712
- IO.write("#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/pivotal.rb", pivotal_rb)
871
+ IO.write("#{dot_chef_path}/pivotal.rb", pivotal_rb)
872
+ end
713
873
 
874
+ def create_knife_config(fqdn, dot_chef_path)
714
875
  knife_rb = %Q(
715
- current_dir = File.dirname(__FILE__)
876
+ username = "CHANGEME"
877
+ orgname = "CHANGEME"
716
878
 
717
- chef_server_url "#{chef_server_url}"
879
+ if [username, orgname].include?("CHANGEME")
880
+ puts "ERROR: Please set 'username' and 'orgname' to proper values in knife.rb"
881
+ exit!
882
+ end
718
883
 
719
- node_name "#{admin_username}"
720
- client_key "\#{current_dir}/#{admin_username}.pem"
721
- )
884
+ current_dir = File.dirname(__FILE__)
722
885
 
723
- knife_rb += %Q(
724
- #node_name "#{username}"
725
- #client_key "\#{current_dir}/#{username}.pem"
726
- ) unless username.nil?
886
+ chef_server_url "https://#{fqdn}/organizations/\#{orgname}"
727
887
 
728
- knife_rb += %Q(
729
- validation_client_name "#{validator_name}"
730
- validation_key "\#{current_dir}/#{validator_name}.pem"
888
+ node_name username
889
+ client_key "\#{current_dir}/\#{username}.pem"
890
+
891
+ validation_client_name "\#{orgname}-validator"
892
+ validation_key "\#{current_dir}/\#{orgname}-validator.pem"
731
893
 
732
894
  cookbook_path Dir.pwd + "/cookbooks"
733
895
  knife[:chef_repo_path] = Dir.pwd
734
896
 
735
897
  ssl_verify_mode :verify_none
736
898
  )
737
- IO.write("#{server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/knife.rb", knife_rb)
899
+ IO.write("#{dot_chef_path}/knife.rb", knife_rb)
900
+ end
738
901
 
902
+ def create_user(server, username, dot_chef_path)
903
+ create_user_string = "#{username} #{username} #{username} #{username}@noreply.com #{username} --filename #{dot_chef_path}/#{username}.pem"
739
904
  case @server_configs[server.name][:chef_server_type]
740
905
  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")
906
+ server.run_command("/opt/opscode/embedded/bin/knife opc user create #{create_user_string} -c #{dot_chef_path}/pivotal.rb")
907
+ when 'chef-server'
908
+ run_ctl(server, "chef-server", "user-create #{create_user_string}")
909
+ end
910
+ end
911
+
912
+ def create_org(server, orgname, dot_chef_path)
913
+ create_org_string = "#{orgname} #{orgname} --filename #{dot_chef_path}/#{orgname}-validator.pem"
914
+ case @server_configs[server.name][:chef_server_type]
915
+ when 'private-chef'
916
+ server.run_command("/opt/opscode/embedded/bin/knife opc org create #{create_org_string} -c #{dot_chef_path}/pivotal.rb")
917
+ when 'chef-server'
918
+ run_ctl(server, "chef-server", "org-create #{create_org_string}")
919
+ end
920
+ end
921
+
922
+ def org_add_user(server, orgname, username, admin, dot_chef_path)
923
+ org_add_user_string = "#{orgname} #{username}"
924
+ org_add_user_string += " --admin" if admin
925
+ case @server_configs[server.name][:chef_server_type]
926
+ when 'private-chef'
927
+ server.run_command("/opt/opscode/embedded/bin/knife opc org user add #{org_add_user_string} -c #{dot_chef_path}/pivotal.rb")
749
928
  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")
929
+ run_ctl(server, "chef-server", "org-user-add #{org_add_user_string}")
757
930
  end
758
931
  end
759
932
 
760
933
  def chef_repo(force=false, pivotal=false)
761
- if @config['chef-server'][:bootstrap_backend].nil?
762
- puts "ERROR: A bootstrap backend Chef Server is not defined in the cluster's config. Please define it first."
934
+ chef_server_dot_chef_path = "/root/chef-repo/.chef"
935
+ dot_chef_path = "./chef-repo/.chef"
936
+
937
+ if @config['chef-server'][:bootstrap_backend]
938
+ chef_server = get_server(@config['chef-server'][:bootstrap_backend])
939
+ chef_server_fqdn = @config['chef-server'][:fqdn]
940
+ elsif @config['chef-backend'][:bootstrap_frontend]
941
+ chef_server = get_server(@config['chef-backend'][:bootstrap_frontend])
942
+ chef_server_fqdn = @config['chef-backend'][:fqdn]
943
+ else
944
+ puts "ERROR: A Chef Server is not defined in the cluster's config. Please define it first."
763
945
  exit 1
764
946
  end
765
- chef_server = get_server(@config['chef-server'][:bootstrap_backend])
766
- if ! chef_server.container.defined?
947
+ unless chef_server.container.defined?
767
948
  puts "ERROR: The '#{chef_server.name}' Chef Server does not exist."
768
949
  exit 1
769
950
  end
770
951
 
771
952
  puts "Creating chef-repo with pem files and knife.rb in the current directory"
772
- FileUtils.mkdir_p("./chef-repo/.chef")
953
+ FileUtils.mkdir_p(dot_chef_path)
773
954
 
774
- pem_files = Dir.glob("#{chef_server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/*.pem")
775
- if pem_files.empty?
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"
777
- else
778
- pem_files.delete_if { |pem_file| pem_file.end_with?("/pivotal.pem") } unless pivotal
779
- FileUtils.cp( pem_files, "./chef-repo/.chef" )
780
- end
781
-
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"
955
+ pem_files = Dir.glob("#{chef_server.container.config_item('lxc.rootfs')}#{chef_server_dot_chef_path}/*.pem")
956
+ pem_files.delete_if { |pem_file| pem_file.end_with?("/pivotal.pem") } unless pivotal
957
+ FileUtils.cp(pem_files, dot_chef_path) unless pem_files.empty?
785
958
 
786
959
  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`"
960
+ if File.exists?("#{dot_chef_path}/pivotal.rb") && ! force
961
+ puts "Skipping pivotal.rb because it already exists in `#{dot_chef_path}`"
789
962
  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)
796
- else
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"
798
- end
963
+ create_pivotal_knife_config(chef_server_fqdn, dot_chef_path)
799
964
  end
800
965
  end
801
966
 
802
967
  if File.exists?("./chef-repo/.chef/knife.rb") && ! force
803
- puts "Skipping knife.rb because it already exists in `./chef-repo/.chef`"
968
+ puts "Skipping knife.rb because it already exists in `#{dot_chef_path}`"
804
969
  else
805
- knife_rb_path = "#{chef_server.container.config_item('lxc.rootfs')}/root/chef-repo/.chef/knife.rb"
806
- if File.exists?(knife_rb_path)
807
- knife_rb = IO.read(knife_rb_path)
808
- knife_rb.sub!(/^chef_server_url .*/, "chef_server_url \"#{chef_server_url}\"")
809
- IO.write("./chef-repo/.chef/knife.rb", knife_rb)
810
- else
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"
812
- end
970
+ create_knife_config(chef_server_fqdn, dot_chef_path)
813
971
  end
814
972
  end
815
973
 
@@ -851,6 +1009,13 @@ oc_id['applications'] ||= {}
851
1009
  oc_id['applications']['supermarket'] = {
852
1010
  'redirect_uri' => 'https://#{@config['supermarket'][:fqdn]}/auth/chef_oauth2/callback'
853
1011
  }
1012
+ )
1013
+ end
1014
+ automate_server_name = @server_configs.select {|name, config| config[:server_type] == 'automate'}.keys.first
1015
+ if automate_server_name
1016
+ chef_server_config += %Q(
1017
+ data_collector['root_url'] = "https://#{automate_server_name}/data-collector/v0/"
1018
+ data_collector['token'] = "93a49a4f2482c64126f7b6015e6b0f30284287ee4054ff8807fb63d9cbd1c506"
854
1019
  )
855
1020
  end
856
1021
  return chef_server_config