bosh_deployer 1.3.0 → 1.4.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.
- data/lib/bosh/cli/commands/micro.rb +10 -5
- data/lib/deployer.rb +1 -0
- data/lib/deployer/config.rb +7 -0
- data/lib/deployer/instance_manager.rb +16 -64
- data/lib/deployer/instance_manager/aws.rb +2 -4
- data/lib/deployer/instance_manager/openstack.rb +2 -4
- data/lib/deployer/instance_manager/vcloud.rb +2 -4
- data/lib/deployer/instance_manager/vsphere.rb +2 -4
- data/lib/deployer/specification.rb +103 -0
- data/lib/deployer/version.rb +1 -1
- metadata +24 -18
@@ -9,6 +9,7 @@ module Bosh::Cli::Command
|
|
9
9
|
|
10
10
|
MICRO_DIRECTOR_PORT = 25555
|
11
11
|
DEFAULT_CONFIG_PATH = File.expand_path("~/.bosh_deployer_config")
|
12
|
+
MICRO_BOSH_YAML = "micro_bosh.yml"
|
12
13
|
|
13
14
|
def initialize(runner)
|
14
15
|
super(runner)
|
@@ -118,12 +119,12 @@ module Bosh::Cli::Command
|
|
118
119
|
end
|
119
120
|
end
|
120
121
|
|
122
|
+
deployer.check_dependencies
|
123
|
+
|
121
124
|
rel_path = deployment[/#{Regexp.escape File.join(work_dir, '')}(.*)/, 1]
|
122
125
|
|
123
126
|
desc = "`#{rel_path.green}' to `#{target_name.green}'"
|
124
127
|
|
125
|
-
deployer.check_dependencies
|
126
|
-
|
127
128
|
if update
|
128
129
|
unless deployer.exists?
|
129
130
|
err "No existing instance to update"
|
@@ -139,7 +140,7 @@ module Bosh::Cli::Command
|
|
139
140
|
|
140
141
|
# make sure the user knows a persistent disk is required
|
141
142
|
unless dig_hash(manifest, "resources", "persistent_disk")
|
142
|
-
quit("No persistent disk configured
|
143
|
+
quit("No persistent disk configured in #{MICRO_BOSH_YAML}".red)
|
143
144
|
end
|
144
145
|
|
145
146
|
confirmation = "Deploying new"
|
@@ -296,16 +297,20 @@ module Bosh::Cli::Command
|
|
296
297
|
|
297
298
|
def find_deployment(name)
|
298
299
|
check_if_deployments_dir
|
299
|
-
File.expand_path(File.join(work_dir, "#{name}",
|
300
|
+
File.expand_path(File.join(work_dir, "#{name}", MICRO_BOSH_YAML))
|
300
301
|
end
|
301
302
|
|
302
303
|
def deployment_name
|
303
304
|
File.basename(File.dirname(deployment))
|
304
305
|
end
|
305
306
|
|
307
|
+
# set new target and clear out cached values
|
308
|
+
# does not persist the new values (set_current() does this)
|
306
309
|
def set_target(ip)
|
307
310
|
config.target = "http://#{ip}:#{MICRO_DIRECTOR_PORT}"
|
308
|
-
config.
|
311
|
+
config.target_name = nil
|
312
|
+
config.target_version = nil
|
313
|
+
config.target_uuid = nil
|
309
314
|
end
|
310
315
|
|
311
316
|
def update_target
|
data/lib/deployer.rb
CHANGED
data/lib/deployer/config.rb
CHANGED
@@ -106,6 +106,13 @@ module Bosh::Deployer
|
|
106
106
|
@networks
|
107
107
|
end
|
108
108
|
|
109
|
+
def task_checkpoint
|
110
|
+
# Bosh::Clouds::Config (bosh_cli >= 0.5.1) delegates task_checkpoint
|
111
|
+
# method to periodically check if director task is cancelled,
|
112
|
+
# so we need to define a void method in Bosh::Deployer::Config to avoid
|
113
|
+
# NoMethodError exceptions.
|
114
|
+
end
|
115
|
+
|
109
116
|
private
|
110
117
|
|
111
118
|
def migrate_cpi
|
@@ -151,11 +151,11 @@ module Bosh::Deployer
|
|
151
151
|
|
152
152
|
unless @apply_spec
|
153
153
|
step "Fetching apply spec" do
|
154
|
-
@apply_spec = agent.release_apply_spec
|
154
|
+
@apply_spec = Specification.new(agent.release_apply_spec)
|
155
155
|
end
|
156
156
|
end
|
157
157
|
|
158
|
-
apply
|
158
|
+
apply
|
159
159
|
|
160
160
|
step "Waiting for the director" do
|
161
161
|
wait_until_director_ready
|
@@ -163,12 +163,14 @@ module Bosh::Deployer
|
|
163
163
|
end
|
164
164
|
|
165
165
|
def destroy
|
166
|
-
renderer.enter_stage("Delete micro BOSH",
|
166
|
+
renderer.enter_stage("Delete micro BOSH", 7)
|
167
167
|
agent_stop
|
168
168
|
if state.disk_cid
|
169
|
-
|
170
|
-
|
171
|
-
|
169
|
+
step "Deleting persistent disk `#{state.disk_cid}'" do
|
170
|
+
delete_disk(state.disk_cid, state.vm_cid)
|
171
|
+
state.disk_cid = nil
|
172
|
+
save_state
|
173
|
+
end
|
172
174
|
end
|
173
175
|
delete_vm
|
174
176
|
delete_stemcell
|
@@ -200,14 +202,14 @@ module Bosh::Deployer
|
|
200
202
|
run_command("tar -zxf #{stemcell_tgz} -C #{stemcell}")
|
201
203
|
end
|
202
204
|
|
203
|
-
@apply_spec =
|
205
|
+
@apply_spec = Specification.load_from_stemcell(stemcell)
|
204
206
|
|
205
207
|
# load properties from stemcell manifest
|
206
208
|
properties = load_stemcell_manifest(stemcell)
|
207
209
|
|
208
210
|
# override with values from the deployment manifest
|
209
211
|
override = Config.cloud_options["properties"]["stemcell"]
|
210
|
-
|
212
|
+
properties["cloud_properties"].merge!(override) if override
|
211
213
|
|
212
214
|
step "Uploading stemcell" do
|
213
215
|
cloud.create_stemcell("#{stemcell}/image", properties["cloud_properties"])
|
@@ -287,7 +289,7 @@ module Bosh::Deployer
|
|
287
289
|
|
288
290
|
def detach_disk(disk_cid)
|
289
291
|
unless disk_cid
|
290
|
-
err "Error
|
292
|
+
err "Error: nil value given for persistent disk id"
|
291
293
|
end
|
292
294
|
|
293
295
|
unmount_disk(disk_cid)
|
@@ -342,41 +344,12 @@ module Bosh::Deployer
|
|
342
344
|
save_state
|
343
345
|
end
|
344
346
|
|
345
|
-
def
|
346
|
-
properties = spec["properties"]
|
347
|
-
|
348
|
-
# set the director name to what is specified in the micro_bosh.yml
|
349
|
-
if Config.name
|
350
|
-
properties["director"] = {} unless properties["director"]
|
351
|
-
properties["director"]["name"] = Config.name
|
352
|
-
end
|
353
|
-
|
354
|
-
# blobstore and nats need to use an elastic IP (if available),
|
355
|
-
# as when the micro bosh instance is re-created during a
|
356
|
-
# deployment, it might get a new private IP
|
357
|
-
%w{blobstore nats}.each do |service|
|
358
|
-
update_agent_service_address(properties, service, bosh_ip)
|
359
|
-
end
|
360
|
-
|
361
|
-
services = %w{postgres director redis blobstore nats aws_registry
|
362
|
-
openstack_registry powerdns}
|
363
|
-
services.each do |service|
|
364
|
-
update_service_address(properties, service, service_ip)
|
365
|
-
end
|
366
|
-
|
367
|
-
# health monitor does not listen to any ports, so there is no
|
368
|
-
# need to update the service address, but we still want to
|
369
|
-
# be able to override values in the apply_spec
|
370
|
-
override_property(properties, "hm", Config.spec_properties["hm"])
|
371
|
-
|
372
|
-
spec
|
373
|
-
end
|
374
|
-
|
375
|
-
def apply(spec)
|
347
|
+
def apply
|
376
348
|
agent_stop
|
377
349
|
|
378
350
|
step "Applying micro BOSH spec" do
|
379
|
-
|
351
|
+
update_spec(@apply_spec)
|
352
|
+
agent.run_task(:apply, @apply_spec.update(bosh_ip, service_ip))
|
380
353
|
end
|
381
354
|
|
382
355
|
agent_start
|
@@ -396,28 +369,6 @@ module Bosh::Deployer
|
|
396
369
|
|
397
370
|
private
|
398
371
|
|
399
|
-
# update the agent service section from the contents of the apply_spec
|
400
|
-
def update_agent_service_address(properties, service, address)
|
401
|
-
if Config.agent_properties
|
402
|
-
agent = properties["agent"] ||= {}
|
403
|
-
svc = agent[service] ||= {}
|
404
|
-
svc["address"] = address
|
405
|
-
|
406
|
-
override_property(agent, service, Config.agent_properties[service])
|
407
|
-
end
|
408
|
-
end
|
409
|
-
|
410
|
-
def update_service_address(properties, service, address)
|
411
|
-
return unless properties[service]
|
412
|
-
properties[service]["address"] = address
|
413
|
-
|
414
|
-
override_property(properties, service, Config.spec_properties[service])
|
415
|
-
end
|
416
|
-
|
417
|
-
def override_property(properties, service, override)
|
418
|
-
properties[service].merge!(override) if override
|
419
|
-
end
|
420
|
-
|
421
372
|
def bosh_ip
|
422
373
|
Config.bosh_ip
|
423
374
|
end
|
@@ -456,7 +407,7 @@ module Bosh::Deployer
|
|
456
407
|
end
|
457
408
|
|
458
409
|
def wait_until_director_ready
|
459
|
-
port = @apply_spec
|
410
|
+
port = @apply_spec.director_port
|
460
411
|
url = "http://#{bosh_ip}:#{port}/info"
|
461
412
|
wait_until_ready do
|
462
413
|
info = Yajl::Parser.parse(HTTPClient.new.get(url).body)
|
@@ -501,6 +452,7 @@ module Bosh::Deployer
|
|
501
452
|
end
|
502
453
|
end
|
503
454
|
|
455
|
+
# TODO remove
|
504
456
|
def load_apply_spec(dir)
|
505
457
|
load_spec("#{dir}/apply_spec.yml") do
|
506
458
|
err "this isn't a micro bosh stemcell - apply_spec.yml missing"
|
@@ -7,9 +7,9 @@ module Bosh::Deployer
|
|
7
7
|
|
8
8
|
include InstanceManagerHelpers
|
9
9
|
|
10
|
+
# TODO extract
|
10
11
|
def update_spec(spec)
|
11
|
-
|
12
|
-
properties = spec["properties"]
|
12
|
+
properties = spec.properties
|
13
13
|
|
14
14
|
properties["aws"] =
|
15
15
|
Config.spec_properties["aws"] ||
|
@@ -19,8 +19,6 @@ module Bosh::Deployer
|
|
19
19
|
properties["aws"]["stemcell"] = Config.cloud_options["properties"]["stemcell"]
|
20
20
|
|
21
21
|
spec.delete("networks")
|
22
|
-
|
23
|
-
spec
|
24
22
|
end
|
25
23
|
|
26
24
|
def configure
|
@@ -7,9 +7,9 @@ module Bosh::Deployer
|
|
7
7
|
|
8
8
|
include InstanceManagerHelpers
|
9
9
|
|
10
|
+
# TODO extract
|
10
11
|
def update_spec(spec)
|
11
|
-
|
12
|
-
properties = spec["properties"]
|
12
|
+
properties = spec.properties
|
13
13
|
|
14
14
|
properties["openstack"] =
|
15
15
|
Config.spec_properties["openstack"] ||
|
@@ -19,8 +19,6 @@ module Bosh::Deployer
|
|
19
19
|
properties["openstack"]["stemcell"] = Config.cloud_options["properties"]["stemcell"]
|
20
20
|
|
21
21
|
spec.delete("networks")
|
22
|
-
|
23
|
-
spec
|
24
22
|
end
|
25
23
|
|
26
24
|
def configure
|
@@ -5,17 +5,15 @@ module Bosh::Deployer
|
|
5
5
|
|
6
6
|
class Vcloud < InstanceManager
|
7
7
|
|
8
|
+
# TODO extract
|
8
9
|
def update_spec(spec)
|
9
|
-
|
10
|
-
properties = spec["properties"]
|
10
|
+
properties = spec.properties
|
11
11
|
|
12
12
|
properties["vcd"] =
|
13
13
|
Config.spec_properties["vcd"] ||
|
14
14
|
Config.cloud_options["properties"]["vcds"].first.dup
|
15
15
|
|
16
16
|
properties["vcd"]["address"] ||= properties["vcd"]["url"]
|
17
|
-
|
18
|
-
spec
|
19
17
|
end
|
20
18
|
|
21
19
|
# @return [Integer] size in MiB
|
@@ -13,17 +13,15 @@ module Bosh::Deployer
|
|
13
13
|
@disk_model
|
14
14
|
end
|
15
15
|
|
16
|
+
# TODO extract
|
16
17
|
def update_spec(spec)
|
17
|
-
|
18
|
-
properties = spec["properties"]
|
18
|
+
properties = spec.properties
|
19
19
|
|
20
20
|
properties["vcenter"] =
|
21
21
|
Config.spec_properties["vcenter"] ||
|
22
22
|
Config.cloud_options["properties"]["vcenters"].first.dup
|
23
23
|
|
24
24
|
properties["vcenter"]["address"] ||= properties["vcenter"]["host"]
|
25
|
-
|
26
|
-
spec
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module Bosh::Deployer
|
2
|
+
class Specification
|
3
|
+
|
4
|
+
def self.load_from_stemcell(dir)
|
5
|
+
spec = load_apply_spec(dir)
|
6
|
+
Specification.new(spec)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.load_apply_spec(dir)
|
10
|
+
file = "apply_spec.yml"
|
11
|
+
apply_spec = File.join(dir, file)
|
12
|
+
unless File.exist?(apply_spec)
|
13
|
+
err "this isn't a micro bosh stemcell - #{file} missing"
|
14
|
+
end
|
15
|
+
YAML.load_file(apply_spec)
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_accessor :spec
|
19
|
+
attr_accessor :properties
|
20
|
+
|
21
|
+
def initialize(spec)
|
22
|
+
@spec = spec
|
23
|
+
@properties = @spec["properties"]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Update the spec with the IP of the micro bosh instance.
|
27
|
+
# @param [String] bosh_ip IP address of the micro bosh VM
|
28
|
+
# @param [String] service_ip private IP of the micro bosh VM on AWS/OS,
|
29
|
+
# or the same as the bosh_ip if vSphere/vCloud
|
30
|
+
def update(bosh_ip, service_ip)
|
31
|
+
# set the director name to what is specified in the micro_bosh.yml
|
32
|
+
if Config.name
|
33
|
+
@properties["director"] = {} unless @properties["director"]
|
34
|
+
@properties["director"]["name"] = Config.name
|
35
|
+
end
|
36
|
+
|
37
|
+
# on AWS blobstore and nats need to use an elastic IP (if available),
|
38
|
+
# as when the micro bosh instance is re-created during a deployment,
|
39
|
+
# it might get a new private IP
|
40
|
+
%w{blobstore nats}.each do |service|
|
41
|
+
update_agent_service_address(service, bosh_ip)
|
42
|
+
end
|
43
|
+
|
44
|
+
services = %w{postgres director redis blobstore nats aws_registry
|
45
|
+
openstack_registry powerdns}
|
46
|
+
services.each do |service|
|
47
|
+
update_service_address(service, service_ip)
|
48
|
+
end
|
49
|
+
|
50
|
+
# health monitor does not listen to any ports, so there is no
|
51
|
+
# need to update the service address, but we still want to
|
52
|
+
# be able to override values in the apply_spec
|
53
|
+
override_property(@properties, "hm", Config.spec_properties["hm"])
|
54
|
+
|
55
|
+
# TODO this override should be made more generic
|
56
|
+
if Config.spec_properties.has_key?("ntp")
|
57
|
+
@properties["agent"] ||= {}
|
58
|
+
@properties["agent"]["ntp"] = Config.spec_properties["ntp"]
|
59
|
+
end
|
60
|
+
|
61
|
+
# TODO: this override is ugly (aws-specific) but needed for aws_registry
|
62
|
+
if Config.spec_properties["aws"] ||
|
63
|
+
Config.cloud_options["properties"]["aws"]
|
64
|
+
@properties["aws"] = Config.spec_properties["aws"] ||
|
65
|
+
Config.cloud_options["properties"]["aws"]
|
66
|
+
end
|
67
|
+
|
68
|
+
@spec
|
69
|
+
end
|
70
|
+
|
71
|
+
# @param [String] name property name to delete from the spec
|
72
|
+
def delete(name)
|
73
|
+
@spec.delete(name)
|
74
|
+
end
|
75
|
+
|
76
|
+
# @return [String] the port the director runs on
|
77
|
+
def director_port
|
78
|
+
@properties["director"]["port"]
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
# update the agent service section from the contents of the apply_spec
|
84
|
+
def update_agent_service_address(service, address)
|
85
|
+
agent = @properties["agent"] ||= {}
|
86
|
+
svc = agent[service] ||= {}
|
87
|
+
svc["address"] = address
|
88
|
+
|
89
|
+
override_property(agent, service, Config.agent_properties[service])
|
90
|
+
end
|
91
|
+
|
92
|
+
def update_service_address(service, address)
|
93
|
+
return unless @properties[service]
|
94
|
+
@properties[service]["address"] = address
|
95
|
+
|
96
|
+
override_property(@properties, service, Config.spec_properties[service])
|
97
|
+
end
|
98
|
+
|
99
|
+
def override_property(properties, service, override)
|
100
|
+
properties[service].merge!(override) if override
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
data/lib/deployer/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh_deployer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bosh_cli
|
@@ -32,17 +32,17 @@ dependencies:
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - ! '>='
|
36
36
|
- !ruby/object:Gem::Version
|
37
|
-
version: 0.5.
|
37
|
+
version: 0.5.1
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 0.5.
|
45
|
+
version: 0.5.1
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
47
|
name: bosh_vcloud_cpi
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,7 +50,7 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - ~>
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0.4.
|
53
|
+
version: 0.4.9
|
54
54
|
type: :runtime
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -58,7 +58,7 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.4.
|
61
|
+
version: 0.4.9
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: bosh_vsphere_cpi
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,17 +80,17 @@ dependencies:
|
|
80
80
|
requirement: !ruby/object:Gem::Requirement
|
81
81
|
none: false
|
82
82
|
requirements:
|
83
|
-
- -
|
83
|
+
- - ! '>='
|
84
84
|
- !ruby/object:Gem::Version
|
85
|
-
version: 0.
|
85
|
+
version: 0.7.0
|
86
86
|
type: :runtime
|
87
87
|
prerelease: false
|
88
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
89
|
none: false
|
90
90
|
requirements:
|
91
|
-
- -
|
91
|
+
- - ! '>='
|
92
92
|
- !ruby/object:Gem::Version
|
93
|
-
version: 0.
|
93
|
+
version: 0.7.0
|
94
94
|
- !ruby/object:Gem::Dependency
|
95
95
|
name: bosh_aws_registry
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,7 +114,7 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - ~>
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.0.
|
117
|
+
version: 0.0.6
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -122,7 +122,7 @@ dependencies:
|
|
122
122
|
requirements:
|
123
123
|
- - ~>
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version: 0.0.
|
125
|
+
version: 0.0.6
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: bosh_openstack_registry
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -130,7 +130,7 @@ dependencies:
|
|
130
130
|
requirements:
|
131
131
|
- - ~>
|
132
132
|
- !ruby/object:Gem::Version
|
133
|
-
version: 0.0.
|
133
|
+
version: 0.0.5
|
134
134
|
type: :runtime
|
135
135
|
prerelease: false
|
136
136
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -138,7 +138,7 @@ dependencies:
|
|
138
138
|
requirements:
|
139
139
|
- - ~>
|
140
140
|
- !ruby/object:Gem::Version
|
141
|
-
version: 0.0.
|
141
|
+
version: 0.0.5
|
142
142
|
- !ruby/object:Gem::Dependency
|
143
143
|
name: agent_client
|
144
144
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,6 +192,7 @@ files:
|
|
192
192
|
- lib/deployer/instance_manager/vsphere.rb
|
193
193
|
- lib/deployer/instance_manager_helpers.rb
|
194
194
|
- lib/deployer/models/instance.rb
|
195
|
+
- lib/deployer/specification.rb
|
195
196
|
- lib/deployer/version.rb
|
196
197
|
- README.rdoc
|
197
198
|
- Rakefile
|
@@ -208,17 +209,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
208
209
|
- - ! '>='
|
209
210
|
- !ruby/object:Gem::Version
|
210
211
|
version: '0'
|
212
|
+
segments:
|
213
|
+
- 0
|
214
|
+
hash: -132721875164071695
|
211
215
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
212
216
|
none: false
|
213
217
|
requirements:
|
214
218
|
- - ! '>='
|
215
219
|
- !ruby/object:Gem::Version
|
216
220
|
version: '0'
|
221
|
+
segments:
|
222
|
+
- 0
|
223
|
+
hash: -132721875164071695
|
217
224
|
requirements: []
|
218
225
|
rubyforge_project:
|
219
|
-
rubygems_version: 1.8.
|
226
|
+
rubygems_version: 1.8.24
|
220
227
|
signing_key:
|
221
228
|
specification_version: 3
|
222
229
|
summary: Micro BOSH Deployer
|
223
230
|
test_files: []
|
224
|
-
has_rdoc:
|