bosh_cli_plugin_micro 1.2089.0 → 1.2121.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,10 +5,11 @@ require 'bosh/deployer/ssh_server'
5
5
  module Bosh::Deployer
6
6
  class InstanceManager
7
7
  class Openstack
8
- def initialize(instance_manager, logger)
8
+ def initialize(instance_manager, config, logger)
9
9
  @instance_manager = instance_manager
10
10
  @logger = logger
11
- properties = Config.cloud_options['properties']
11
+ @config = config
12
+ properties = config.cloud_options['properties']
12
13
 
13
14
  @registry = Registry.new(
14
15
  properties['registry']['endpoint'],
@@ -24,7 +25,7 @@ module Bosh::Deployer
24
25
  end
25
26
 
26
27
  def remote_tunnel
27
- @remote_tunnel.create(instance_manager.bosh_ip, registry.port)
28
+ @remote_tunnel.create(instance_manager.client_services_ip, registry.port)
28
29
  end
29
30
 
30
31
  def disk_model
@@ -35,11 +36,11 @@ module Bosh::Deployer
35
36
  properties = spec.properties
36
37
 
37
38
  properties['openstack'] =
38
- Config.spec_properties['openstack'] ||
39
- Config.cloud_options['properties']['openstack'].dup
39
+ config.spec_properties['openstack'] ||
40
+ config.cloud_options['properties']['openstack'].dup
40
41
 
41
- properties['openstack']['registry'] = Config.cloud_options['properties']['registry']
42
- properties['openstack']['stemcell'] = Config.cloud_options['properties']['stemcell']
42
+ properties['openstack']['registry'] = config.cloud_options['properties']['registry']
43
+ properties['openstack']['stemcell'] = config.cloud_options['properties']['stemcell']
43
44
 
44
45
  spec.delete('networks')
45
46
  end
@@ -57,24 +58,18 @@ module Bosh::Deployer
57
58
  instance_manager.save_state
58
59
  end
59
60
 
60
- def discover_bosh_ip
61
- if instance_manager.state.vm_cid
62
- floating_ip = instance_manager.cloud.openstack.servers.
63
- get(instance_manager.state.vm_cid).floating_ip_address
64
- ip = floating_ip || service_ip
65
-
66
- if ip != instance_manager.bosh_ip
67
- instance_manager.bosh_ip = ip
68
- logger.info("discovered bosh ip=#{instance_manager.bosh_ip}")
69
- end
70
- end
61
+ def client_services_ip
62
+ logger.info('discovering client services ip')
63
+ discover_client_services_ip
64
+ end
71
65
 
72
- instance_manager.bosh_ip
66
+ def agent_services_ip
67
+ logger.info('discovering agent services ip')
68
+ discover_agent_services_ip
73
69
  end
74
70
 
75
- def service_ip
76
- instance_manager.cloud.openstack.servers.
77
- get(instance_manager.state.vm_cid).private_ip_address
71
+ def internal_services_ip
72
+ config.internal_services_ip
78
73
  end
79
74
 
80
75
  # @return [Integer] size in MiB
@@ -88,13 +83,13 @@ module Bosh::Deployer
88
83
  # is a risk of conversion errors which lead to an unnecessary
89
84
  # disk migration, so we need to do a double conversion
90
85
  # here to avoid that
91
- requested = (Config.resources['persistent_disk'] / 1024.0).ceil * 1024
86
+ requested = (config.resources['persistent_disk'] / 1024.0).ceil * 1024
92
87
  requested != disk_size(instance_manager.state.disk_cid)
93
88
  end
94
89
 
95
90
  private
96
91
 
97
- attr_reader :registry, :instance_manager, :logger
92
+ attr_reader :registry, :instance_manager, :logger, :config
98
93
 
99
94
  def ssh_properties(properties)
100
95
  ssh_user = properties['openstack']['ssh_user']
@@ -103,6 +98,7 @@ module Bosh::Deployer
103
98
 
104
99
  key = properties['openstack']['private_key']
105
100
  err 'Missing properties.openstack.private_key' unless key
101
+
106
102
  ssh_key = File.expand_path(key)
107
103
  unless File.exists?(ssh_key)
108
104
  err "properties.openstack.private_key '#{key}' does not exist"
@@ -110,6 +106,36 @@ module Bosh::Deployer
110
106
 
111
107
  [ssh_key, ssh_port, ssh_user, ssh_wait]
112
108
  end
109
+
110
+ def discover_client_services_ip
111
+ if instance_manager.state.vm_cid
112
+ server = instance_manager.cloud.openstack.servers.get(instance_manager.state.vm_cid)
113
+
114
+ ip = server.floating_ip_address || server.private_ip_address
115
+
116
+ logger.info("discovered bosh ip=#{ip}")
117
+ ip
118
+ else
119
+ default_ip = config.client_services_ip
120
+ logger.info("ip address not discovered - using default of #{default_ip}")
121
+ default_ip
122
+ end
123
+ end
124
+
125
+ def discover_agent_services_ip
126
+ if instance_manager.state.vm_cid
127
+ server = instance_manager.cloud.openstack.servers.get(instance_manager.state.vm_cid)
128
+
129
+ ip = server.private_ip_address
130
+
131
+ logger.info("discovered bosh ip=#{ip}")
132
+ ip
133
+ else
134
+ default_ip = config.agent_services_ip
135
+ logger.info("ip address not discovered - using default of #{default_ip}")
136
+ default_ip
137
+ end
138
+ end
113
139
  end
114
140
  end
115
141
  end
@@ -1,10 +1,13 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
1
+ require 'forwardable'
2
2
 
3
3
  module Bosh::Deployer
4
4
  class InstanceManager
5
5
  class Vcloud
6
- def initialize(instance_manager, logger)
6
+ extend Forwardable
7
+
8
+ def initialize(instance_manager, config, logger)
7
9
  @instance_manager = instance_manager
10
+ @config = config
8
11
  @logger = logger
9
12
  end
10
13
 
@@ -21,8 +24,8 @@ module Bosh::Deployer
21
24
  properties = spec.properties
22
25
 
23
26
  properties['vcd'] =
24
- Config.spec_properties['vcd'] ||
25
- Config.cloud_options['properties']['vcds'].first.dup
27
+ config.spec_properties['vcd'] ||
28
+ config.cloud_options['properties']['vcds'].first.dup
26
29
 
27
30
  properties['vcd']['address'] ||= properties['vcd']['url']
28
31
  end
@@ -39,13 +42,12 @@ module Bosh::Deployer
39
42
  def stop
40
43
  end
41
44
 
42
- def discover_bosh_ip
43
- instance_manager.bosh_ip
44
- end
45
-
46
- def service_ip
47
- instance_manager.bosh_ip
48
- end
45
+ def_delegators(
46
+ :config,
47
+ :internal_services_ip,
48
+ :agent_services_ip,
49
+ :client_services_ip,
50
+ )
49
51
 
50
52
  # @return [Integer] size in MiB
51
53
  def disk_size(cid)
@@ -53,12 +55,12 @@ module Bosh::Deployer
53
55
  end
54
56
 
55
57
  def persistent_disk_changed?
56
- Config.resources['persistent_disk'] != disk_size(instance_manager.state.disk_cid)
58
+ config.resources['persistent_disk'] != disk_size(instance_manager.state.disk_cid)
57
59
  end
58
60
 
59
61
  private
60
62
 
61
- attr_reader :instance_manager, :logger
63
+ attr_reader :instance_manager, :logger, :config
62
64
 
63
65
  FakeRegistry = Struct.new(:port)
64
66
  def registry
@@ -1,10 +1,13 @@
1
- # Copyright (c) 2009-2012 VMware, Inc.
1
+ require 'forwardable'
2
2
 
3
3
  module Bosh::Deployer
4
4
  class InstanceManager
5
5
  class Vsphere
6
- def initialize(instance_manager, logger)
6
+ extend Forwardable
7
+
8
+ def initialize(instance_manager, config, logger)
7
9
  @instance_manager = instance_manager
10
+ @config = config
8
11
  @logger = logger
9
12
  end
10
13
 
@@ -23,8 +26,8 @@ module Bosh::Deployer
23
26
  properties = spec.properties
24
27
 
25
28
  properties['vcenter'] =
26
- Config.spec_properties['vcenter'] ||
27
- Config.cloud_options['properties']['vcenters'].first.dup
29
+ config.spec_properties['vcenter'] ||
30
+ config.cloud_options['properties']['vcenters'].first.dup
28
31
 
29
32
  properties['vcenter']['address'] ||= properties['vcenter']['host']
30
33
  end
@@ -41,13 +44,12 @@ module Bosh::Deployer
41
44
  def stop
42
45
  end
43
46
 
44
- def discover_bosh_ip
45
- instance_manager.bosh_ip
46
- end
47
-
48
- def service_ip
49
- instance_manager.bosh_ip
50
- end
47
+ def_delegators(
48
+ :config,
49
+ :internal_services_ip,
50
+ :agent_services_ip,
51
+ :client_services_ip,
52
+ )
51
53
 
52
54
  # @return [Integer] size in MiB
53
55
  def disk_size(cid)
@@ -55,12 +57,12 @@ module Bosh::Deployer
55
57
  end
56
58
 
57
59
  def persistent_disk_changed?
58
- Config.resources['persistent_disk'] != disk_size(instance_manager.state.disk_cid)
60
+ config.resources['persistent_disk'] != disk_size(instance_manager.state.disk_cid)
59
61
  end
60
62
 
61
63
  private
62
64
 
63
- attr_reader :instance_manager, :logger
65
+ attr_reader :instance_manager, :logger, :config
64
66
 
65
67
  FakeRegistry = Struct.new(:port)
66
68
  def registry
@@ -40,24 +40,23 @@ module Bosh::Deployer
40
40
  config_sha1 = Bosh::Deployer::HashFingerprinter.new.sha1(config)
41
41
  ui_messager = Bosh::Deployer::UiMessager.for_deployer
42
42
 
43
- new(config, config_sha1, ui_messager, plugin_name)
43
+ new(Config.configure(config), config_sha1, ui_messager, plugin_name)
44
44
  end
45
45
 
46
46
  def initialize(config, config_sha1, ui_messager, plugin_name)
47
- Config.configure(config)
48
- @config = Config
47
+ @config = config
49
48
 
50
49
  plugin_class = InstanceManager.const_get(plugin_name.capitalize)
51
- @infrastructure = plugin_class.new(self, logger)
50
+ @infrastructure = plugin_class.new(self, config, logger)
52
51
 
53
- @deployments_state = DeploymentsState.load_from_dir(config['dir'], logger)
54
- load_state(config['name'])
52
+ @deployments_state = DeploymentsState.load_from_dir(config.base_dir, logger)
53
+ deployments_state.load_deployment(config.name, infrastructure)
55
54
 
56
- Config.uuid = state.uuid
55
+ config.uuid = state.uuid
57
56
 
58
57
  @config_sha1 = config_sha1
59
58
  @ui_messager = ui_messager
60
- @renderer = LoggerRenderer.new
59
+ @renderer = LoggerRenderer.new(logger)
61
60
  end
62
61
 
63
62
  def_delegators(
@@ -70,19 +69,16 @@ module Bosh::Deployer
70
69
  def_delegators(
71
70
  :@config,
72
71
  :cloud,
73
- :agent,
74
72
  :logger,
75
- :bosh_ip,
76
- :bosh_ip=,
77
73
  )
78
74
 
79
- def check_dependencies
80
- infrastructure.check_dependencies
81
- end
82
-
83
- def discover_bosh_ip
84
- infrastructure.discover_bosh_ip
85
- end
75
+ def_delegators(
76
+ :infrastructure,
77
+ :check_dependencies,
78
+ :agent_services_ip,
79
+ :client_services_ip,
80
+ :internal_services_ip,
81
+ )
86
82
 
87
83
  def step(task)
88
84
  renderer.update(:started, task)
@@ -126,7 +122,6 @@ module Bosh::Deployer
126
122
  step "Creating VM from #{state.stemcell_cid}" do
127
123
  state.vm_cid = create_vm(state.stemcell_cid)
128
124
  update_vm_metadata(state.vm_cid, { 'Name' => state.name })
129
- infrastructure.discover_bosh_ip
130
125
  end
131
126
  save_state
132
127
 
@@ -144,7 +139,7 @@ module Bosh::Deployer
144
139
 
145
140
  unless @apply_spec
146
141
  step 'Fetching apply spec' do
147
- @apply_spec = Specification.new(agent.release_apply_spec)
142
+ @apply_spec = Specification.new(agent.release_apply_spec, config)
148
143
  end
149
144
  end
150
145
 
@@ -220,13 +215,13 @@ module Bosh::Deployer
220
215
  run_command("tar -zxf #{stemcell_tgz} -C #{stemcell}")
221
216
  end
222
217
 
223
- @apply_spec = Specification.load_from_stemcell(stemcell)
218
+ @apply_spec = Specification.load_from_stemcell(stemcell, config)
224
219
 
225
220
  # load properties from stemcell manifest
226
221
  properties = load_stemcell_manifest(stemcell)
227
222
 
228
223
  # override with values from the deployment manifest
229
- override = Config.cloud_options['properties']['stemcell']
224
+ override = config.cloud_options['properties']['stemcell']
230
225
  properties['cloud_properties'].merge!(override) if override
231
226
 
232
227
  step 'Uploading stemcell' do
@@ -242,9 +237,9 @@ module Bosh::Deployer
242
237
  # rubocop:enable MethodLength
243
238
 
244
239
  def create_vm(stemcell_cid)
245
- resources = Config.resources['cloud_properties']
246
- networks = Config.networks
247
- env = Config.env
240
+ resources = config.resources['cloud_properties']
241
+ networks = config.networks
242
+ env = config.env
248
243
  cloud.create_vm(state.uuid, stemcell_cid, resources, networks, nil, env)
249
244
  end
250
245
 
@@ -283,7 +278,7 @@ module Bosh::Deployer
283
278
 
284
279
  def create_disk
285
280
  step 'Create disk' do
286
- size = Config.resources['persistent_disk']
281
+ size = config.resources['persistent_disk']
287
282
  state.disk_cid = cloud.create_disk(size, state.vm_cid)
288
283
  save_state
289
284
  end
@@ -353,7 +348,7 @@ module Bosh::Deployer
353
348
  create_disk
354
349
  attach_disk(state.disk_cid, true)
355
350
  elsif infrastructure.persistent_disk_changed?
356
- size = Config.resources['persistent_disk']
351
+ size = config.resources['persistent_disk']
357
352
 
358
353
  # save a reference to the old disk
359
354
  old_disk_cid = state.disk_cid
@@ -383,11 +378,12 @@ module Bosh::Deployer
383
378
  step 'Applying micro BOSH spec' do
384
379
  # first update spec with infrastructure specific stuff
385
380
  infrastructure.update_spec(spec)
381
+
386
382
  # then update spec with generic changes
387
- spec = spec.update(bosh_ip, infrastructure.service_ip)
383
+ spec = spec.update(agent_services_ip, internal_services_ip)
388
384
 
389
- microbosh_job_instance = MicroboshJobInstance.new(bosh_ip, Config.agent_url, logger)
390
- spec = microbosh_job_instance.render_templates(spec)
385
+ microbosh_instance = MicroboshJobInstance.new(client_services_ip, config.agent_url, logger)
386
+ spec = microbosh_instance.render_templates(spec)
391
387
 
392
388
  agent.run_task(:apply, spec)
393
389
  end
@@ -399,8 +395,22 @@ module Bosh::Deployer
399
395
  deployments_state.save(infrastructure)
400
396
  end
401
397
 
398
+ def agent
399
+ uri = URI.parse(config.agent_url)
400
+ user, password = uri.userinfo.split(':', 2)
401
+ uri.userinfo = nil
402
+ uri.host = client_services_ip
403
+ Bosh::Agent::HTTPClient.new(uri.to_s, {
404
+ 'user' => user,
405
+ 'password' => password,
406
+ 'reply_to' => config.uuid,
407
+ })
408
+ end
409
+
402
410
  private
403
411
 
412
+ attr_reader :config
413
+
404
414
  def agent_stop
405
415
  step 'Stopping agent services' do
406
416
  begin
@@ -431,7 +441,7 @@ module Bosh::Deployer
431
441
  end
432
442
 
433
443
  def agent_port
434
- URI.parse(Config.cloud_options['properties']['agent']['mbus']).port
444
+ URI.parse(config.cloud_options['properties']['agent']['mbus']).port
435
445
  end
436
446
 
437
447
  def wait_until_agent_ready
@@ -441,7 +451,7 @@ module Bosh::Deployer
441
451
 
442
452
  def wait_until_director_ready
443
453
  port = @apply_spec.director_port
444
- url = "https://#{bosh_ip}:#{port}/info"
454
+ url = "https://#{client_services_ip}:#{port}/info"
445
455
 
446
456
  wait_until_ready('director', 1, 600) do
447
457
 
@@ -499,11 +509,6 @@ module Bosh::Deployer
499
509
  Psych.load_file(file)
500
510
  end
501
511
 
502
- def load_state(name)
503
- deployments_state.load_deployment(name, infrastructure)
504
- infrastructure.discover_bosh_ip
505
- end
506
-
507
512
  def run_command(command)
508
513
  output, status = Open3.capture2e(command)
509
514
  if status.exitstatus != 0
@@ -2,7 +2,8 @@ module Bosh::Deployer
2
2
  class LoggerRenderer
3
3
  attr_accessor :stage, :total, :index
4
4
 
5
- def initialize
5
+ def initialize(logger)
6
+ @logger = logger
6
7
  enter_stage('Deployer', 0)
7
8
  end
8
9
 
@@ -13,8 +14,12 @@ module Bosh::Deployer
13
14
  end
14
15
 
15
16
  def update(state, task)
16
- Config.logger.info("#{@stage} - #{state} #{task}")
17
+ logger.info("#{@stage} - #{state} #{task}")
17
18
  @index += 1 if state == :finished
18
19
  end
20
+
21
+ private
22
+
23
+ attr_reader :logger
19
24
  end
20
25
  end
@@ -6,13 +6,13 @@ require 'blobstore_client'
6
6
  module Bosh::Deployer
7
7
  class MicroboshJobInstance
8
8
 
9
- def initialize(bosh_ip, mbus, logger)
9
+ def initialize(blobstore_ip, mbus, logger)
10
10
  @logger = logger
11
11
 
12
12
  uri = URI.parse(mbus)
13
13
  user, password = uri.userinfo.split(':', 2)
14
14
  uri.userinfo = ''
15
- uri.host = bosh_ip
15
+ uri.host = blobstore_ip
16
16
  uri.path = '/blobs'
17
17
  @blobstore_options = {
18
18
  'endpoint' => uri.to_s,
@@ -1,4 +1,7 @@
1
1
  module Bosh::Deployer::Models
2
- class Instance < Sequel.Model(Bosh::Deployer::Config.db[:instances])
2
+ def self.define_instance_from_table(table)
3
+ return if const_defined?(:Instance)
4
+ klass = Class.new(Sequel.Model(table))
5
+ const_set(:Instance, klass)
3
6
  end
4
7
  end
@@ -1,8 +1,8 @@
1
1
  module Bosh::Deployer
2
2
  class Specification
3
- def self.load_from_stemcell(dir)
3
+ def self.load_from_stemcell(dir, config)
4
4
  spec = load_apply_spec(dir)
5
- Specification.new(spec)
5
+ Specification.new(spec, config)
6
6
  end
7
7
 
8
8
  def self.load_apply_spec(dir)
@@ -15,46 +15,35 @@ module Bosh::Deployer
15
15
  attr_accessor :spec
16
16
  attr_accessor :properties
17
17
 
18
- def initialize(spec)
18
+ def initialize(spec, config)
19
+ @config = config
19
20
  @spec = spec
20
21
  @properties = @spec['properties']
21
22
  end
22
23
 
23
24
  # Update the spec with the IP of the micro bosh instance.
24
- # @param [String] bosh_ip IP address of the micro bosh VM
25
- # @param [String] service_ip private IP of the micro bosh VM on AWS/OS,
26
- # or the same as the bosh_ip if vSphere/vCloud
27
- def update(bosh_ip, service_ip)
25
+ # @param [String] agent_services_ip IP address of the micro bosh VM
26
+ # @param [String] internal_services_ip private IP of the micro bosh VM
27
+ def update(agent_services_ip, internal_services_ip)
28
28
  # set the director name to what is specified in the micro_bosh.yml
29
- if Config.name
29
+ if config.name
30
30
  @properties['director'] = {} unless @properties['director']
31
- @properties['director']['name'] = Config.name
31
+ @properties['director']['name'] = config.name
32
32
  end
33
33
 
34
- # on AWS blobstore and nats need to use an elastic IP (if available),
35
- # as when the micro bosh instance is re-created during a deployment,
36
- # it might get a new private IP
37
34
  %w{blobstore nats}.each do |service|
38
- update_agent_service_address(service, bosh_ip)
35
+ update_agent_service_address(service, agent_services_ip)
39
36
  end
40
37
 
41
- services = %w{director redis blobstore nats registry dns}
42
- services.each do |service|
43
- update_service_address(service, service_ip)
38
+ %w{registry dns}.each do |service|
39
+ update_service_address(service, agent_services_ip)
44
40
  end
45
41
 
46
- # health monitor does not listen to any ports, so there is no
47
- # need to update the service address, but we still want to
48
- # be able to override values in the apply_spec
49
- override_property(@properties, 'hm', Config.spec_properties['hm'])
50
- override_property(@properties, 'director', Config.spec_properties['director'])
51
- set_property(@properties, 'ntp', Config.spec_properties['ntp'])
42
+ %w{director redis blobstore nats}.each do |service|
43
+ update_service_address(service, internal_services_ip)
44
+ end
52
45
 
53
- set_property(
54
- @properties,
55
- 'compiled_package_cache',
56
- Config.spec_properties['compiled_package_cache'],
57
- )
46
+ update_properties
58
47
 
59
48
  @spec
60
49
  end
@@ -71,20 +60,37 @@ module Bosh::Deployer
71
60
 
72
61
  private
73
62
 
63
+ attr_reader :config
64
+
65
+ # health monitor does not listen to any ports, so there is no
66
+ # need to update the service address, but we still want to
67
+ # be able to override values in the apply_spec
68
+ def update_properties
69
+ override_property(@properties, 'hm', config.spec_properties['hm'])
70
+ override_property(@properties, 'director', config.spec_properties['director'])
71
+ set_property(@properties, 'ntp', config.spec_properties['ntp'])
72
+
73
+ set_property(
74
+ @properties,
75
+ 'compiled_package_cache',
76
+ config.spec_properties['compiled_package_cache'],
77
+ )
78
+ end
79
+
74
80
  # update the agent service section from the contents of the apply_spec
75
81
  def update_agent_service_address(service, address)
76
82
  agent = @properties['agent'] ||= {}
77
83
  svc = agent[service] ||= {}
78
84
  svc['address'] = address
79
85
 
80
- override_property(agent, service, Config.agent_properties[service])
86
+ override_property(agent, service, config.agent_properties[service])
81
87
  end
82
88
 
83
89
  def update_service_address(service, address)
84
90
  return unless @properties[service]
85
91
  @properties[service]['address'] = address
86
92
 
87
- override_property(@properties, service, Config.spec_properties[service])
93
+ override_property(@properties, service, config.spec_properties[service])
88
94
  end
89
95
 
90
96
  def set_property(properties, key, value)
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Deployer
3
- VERSION = '1.2089.0'
3
+ VERSION = '1.2121.0'
4
4
  end
5
5
  end