bosh_cli_plugin_micro 1.2089.0 → 1.2121.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.
@@ -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