bosh-gen 0.3.0 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.md +15 -0
- data/Guardfile +9 -0
- data/Rakefile +1 -0
- data/bosh-gen.gemspec +3 -0
- data/lib/bosh/gen/cli.rb +13 -1
- data/lib/bosh/gen/generators/deployment_manifest_generator.rb +60 -0
- data/lib/bosh/gen/generators/job_generator.rb +13 -8
- data/lib/bosh/gen/generators/job_generator/templates/jobs/%job_name%/TODO.md.tt +4 -0
- data/lib/bosh/gen/generators/job_generator/templates/jobs/%job_name%/monit.tt +5 -0
- data/lib/bosh/gen/generators/job_generator/templates/jobs/%job_name%/templates/%job_name%_ctl.tt +35 -0
- data/lib/bosh/gen/models.rb +7 -0
- data/lib/bosh/gen/models/deployment_manifest.rb +84 -0
- data/lib/bosh/gen/version.rb +1 -1
- data/spec/fixtures/deployment_manifests/defaults.yml +60 -0
- data/spec/models/deployment_manifest_spec.rb +18 -0
- metadata +64 -5
data/ChangeLog.md
CHANGED
@@ -7,6 +7,21 @@ Added:
|
|
7
7
|
* `template` - add a template/file to a job
|
8
8
|
* `source` - download and add a source file/tarball to a package
|
9
9
|
|
10
|
+
### v0.3.1 (never released)
|
11
|
+
|
12
|
+
Added:
|
13
|
+
|
14
|
+
* `manifest` - generate a deployment manifest for a release
|
15
|
+
|
16
|
+
Fixed:
|
17
|
+
|
18
|
+
* `job` - creates a monit script and a stub control script
|
19
|
+
|
20
|
+
### v0.3.2
|
21
|
+
|
22
|
+
* `job` - ctl file has TODO to remind about PID file
|
23
|
+
* `job` - use the provided release path to detect jobs
|
24
|
+
|
10
25
|
## v0.2
|
11
26
|
|
12
27
|
Added:
|
data/Guardfile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard 'minitest' do
|
5
|
+
# with Minitest::Spec
|
6
|
+
watch(%r|^spec/(.*)_spec\.rb|)
|
7
|
+
watch(%r|^lib/bosh/gen/(.*)([^/]+)\.rb|) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
8
|
+
watch(%r|^spec/spec_helper\.rb|) { "spec" }
|
9
|
+
end
|
data/Rakefile
CHANGED
data/bosh-gen.gemspec
CHANGED
@@ -19,4 +19,7 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.add_dependency "bosh_cli"
|
20
20
|
|
21
21
|
gem.add_development_dependency "rake"
|
22
|
+
gem.add_development_dependency "minitest", "~> 2.12"
|
23
|
+
gem.add_development_dependency "minitest-colorize"
|
24
|
+
gem.add_development_dependency "guard-minitest"
|
22
25
|
end
|
data/lib/bosh/gen/cli.rb
CHANGED
@@ -5,6 +5,7 @@ module Bosh; end
|
|
5
5
|
require "cli/config"
|
6
6
|
require "cli/core_ext"
|
7
7
|
|
8
|
+
require 'bosh/gen/models'
|
8
9
|
|
9
10
|
module Bosh
|
10
11
|
module Gen
|
@@ -58,7 +59,18 @@ module Bosh
|
|
58
59
|
require 'bosh/gen/generators/job_template_generator'
|
59
60
|
Bosh::Gen::Generators::JobTemplateGenerator.start([job_name, file_path])
|
60
61
|
end
|
61
|
-
|
62
|
+
|
63
|
+
desc "manifest NAME PATH", "Creates a deployment manifest based on the release located at PATH"
|
64
|
+
method_option :force, :type => :boolean, :desc => "Force override existing target manifest file"
|
65
|
+
method_option :addresses, :aliases => ['-a'], :type => :array, :desc => "List of IP addresses available for jobs"
|
66
|
+
def manifest(name, release_path)
|
67
|
+
release_path = File.expand_path(release_path)
|
68
|
+
ip_addresses = options["addresses"] || []
|
69
|
+
flags = { :force => options["force"] || false }
|
70
|
+
require 'bosh/gen/generators/deployment_manifest_generator'
|
71
|
+
Bosh::Gen::Generators::DeploymentManifestGenerator.start([name, release_path, ip_addresses, flags])
|
72
|
+
end
|
73
|
+
|
62
74
|
no_tasks do
|
63
75
|
def cyan; "\033[36m" end
|
64
76
|
def clear; "\033[0m" end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'thor/group'
|
3
|
+
|
4
|
+
module Bosh::Gen
|
5
|
+
module Generators
|
6
|
+
class DeploymentManifestGenerator < Thor::Group
|
7
|
+
include Thor::Actions
|
8
|
+
|
9
|
+
argument :name
|
10
|
+
argument :release_path
|
11
|
+
argument :ip_addresses
|
12
|
+
argument :flags, :type => :hash
|
13
|
+
|
14
|
+
def check_release_path_is_release
|
15
|
+
unless File.exist?(release_path)
|
16
|
+
raise Thor::Error.new("target path '#{release_path}' doesn't exist")
|
17
|
+
end
|
18
|
+
FileUtils.chdir(release_path) do
|
19
|
+
unless File.exist?("jobs") && File.exist?("packages")
|
20
|
+
raise Thor::Error.new("target path '#{release_path}' is not a BOSH release project")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Create a deployment manifest (initially for AWS only)
|
26
|
+
def create_deployment_manifest
|
27
|
+
cloud_properties = { "instance_type" => "m1.small" }
|
28
|
+
manifest = Bosh::Gen::Models::DeploymentManifest.new(name, "DIRECTOR_UUID", cloud_properties)
|
29
|
+
manifest.jobs = job_manifests(ip_addresses)
|
30
|
+
create_file manifest_file_name, manifest.to_yaml, :force => flags[:force]
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
def jobs_dir(path = "")
|
35
|
+
File.join(release_path, "jobs", path)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Whether +name+ contains .yml suffix or nor, returns a .yml filename for manifest to be generated
|
39
|
+
def manifest_file_name
|
40
|
+
basename = name.gsub(/\.yml/, '') + ".yml"
|
41
|
+
end
|
42
|
+
|
43
|
+
def job_manifests(ip_addresses)
|
44
|
+
jobs = detect_jobs.map do |job_name|
|
45
|
+
{
|
46
|
+
"name" => job_name
|
47
|
+
}
|
48
|
+
end
|
49
|
+
jobs.first["static_ips"] = ip_addresses if ip_addresses && ip_addresses.size > 0
|
50
|
+
jobs
|
51
|
+
end
|
52
|
+
|
53
|
+
# Return list of job names in this release based on the contents of jobs/* folder
|
54
|
+
def detect_jobs
|
55
|
+
Dir[File.join(release_path, "jobs/*")].map {|job_path| File.basename(job_path) }
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -6,7 +6,7 @@ module Bosh::Gen
|
|
6
6
|
class JobGenerator < Thor::Group
|
7
7
|
include Thor::Actions
|
8
8
|
|
9
|
-
argument :
|
9
|
+
argument :job_name
|
10
10
|
argument :dependencies, :type => :array
|
11
11
|
|
12
12
|
def self.source_root
|
@@ -20,7 +20,7 @@ module Bosh::Gen
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def check_name
|
23
|
-
raise Thor::Error.new("'#{
|
23
|
+
raise Thor::Error.new("'#{job_name}' is not a vaild BOSH id") unless job_name.bosh_valid_id?
|
24
24
|
end
|
25
25
|
|
26
26
|
def warn_missing_dependencies
|
@@ -32,26 +32,31 @@ module Bosh::Gen
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
36
|
-
|
35
|
+
def template_files
|
36
|
+
directory "jobs/%job_name%"
|
37
|
+
@template_files = { "#{job_name}_ctl" => "bin/#{job_name}_ctl" }
|
37
38
|
end
|
38
39
|
|
39
|
-
def
|
40
|
-
|
40
|
+
def ctl_executable
|
41
|
+
chmod "jobs/#{job_name}/templates/#{job_name}_ctl", 0755
|
41
42
|
end
|
42
43
|
|
43
44
|
def job_specification
|
44
|
-
config = { "name" =>
|
45
|
+
config = { "name" => job_name, "packages" => dependencies, "templates" => @template_files }
|
45
46
|
create_file job_dir("spec"), YAML.dump(config)
|
46
47
|
end
|
47
48
|
|
49
|
+
def show_todo
|
50
|
+
puts File.read(File.join(destination_root, "jobs", job_name, "TODO.md"))
|
51
|
+
end
|
52
|
+
|
48
53
|
private
|
49
54
|
def filenames
|
50
55
|
files.map {|f| File.basename(f) }
|
51
56
|
end
|
52
57
|
|
53
58
|
def job_dir(path)
|
54
|
-
File.join("jobs",
|
59
|
+
File.join("jobs", job_name, path)
|
55
60
|
end
|
56
61
|
|
57
62
|
# Run a command in git.
|
data/lib/bosh/gen/generators/job_generator/templates/jobs/%job_name%/templates/%job_name%_ctl.tt
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# Control script to start/stop <%= job_name %> job on a BOSH controlled VM
|
4
|
+
#
|
5
|
+
# TODO - change "EXECUTABLE_SERVER" to the command to run
|
6
|
+
# TODO - ensure executable stores PID in $PIDFILE
|
7
|
+
|
8
|
+
RUN_DIR=/var/vcap/sys/run/<%= job_name %>
|
9
|
+
LOG_DIR=/var/vcap/sys/log/<%= job_name %>
|
10
|
+
STORE=/var/vcap/store/<%= job_name %>
|
11
|
+
PIDFILE=$RUN_DIR/<%= job_name %>.pid
|
12
|
+
|
13
|
+
case $1 in
|
14
|
+
|
15
|
+
start)
|
16
|
+
mkdir -p $RUN_DIR
|
17
|
+
mkdir -p $LOG_DIR
|
18
|
+
mkdir -p $STORE
|
19
|
+
|
20
|
+
echo $$ > $PIDFILE
|
21
|
+
|
22
|
+
exec /var/vcap/packages/<%= job_name %>/bin/EXECUTABLE_SERVER >>$LOG_DIR/<%= job_name %>.stdout.log 2>>$LOG_DIR/<%= job_name %>.stderr.log
|
23
|
+
;;
|
24
|
+
|
25
|
+
stop)
|
26
|
+
PID=$(head -1 $PIDFILE)
|
27
|
+
kill $PID
|
28
|
+
while [ -e /proc/$PID ]; do sleep 0.1; done
|
29
|
+
rm -f $PIDFILE
|
30
|
+
;;
|
31
|
+
|
32
|
+
*)
|
33
|
+
echo "Usage: <%= job_name %>_ctl {start|stop}" ;;
|
34
|
+
esac
|
35
|
+
exit 0
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require "yaml"
|
2
|
+
|
3
|
+
module Bosh::Gen::Models
|
4
|
+
class DeploymentManifest
|
5
|
+
attr_reader :manifest
|
6
|
+
|
7
|
+
def initialize(name, director_uuid, cloud_properties)
|
8
|
+
@manifest = {}
|
9
|
+
@cloud_properties = cloud_properties
|
10
|
+
@security_groups = ["default"]
|
11
|
+
@stemcell_version = "0.5.1"
|
12
|
+
@stemcell = { "name" => "bosh-stemcell", "version" => @stemcell_version }
|
13
|
+
manifest["name"] = name
|
14
|
+
manifest["director_uuid"] = director_uuid
|
15
|
+
manifest["release"] = { "name" => name, "version" => 1}
|
16
|
+
manifest["compilation"] = {
|
17
|
+
"workers" => 10,
|
18
|
+
"network" => "default",
|
19
|
+
"cloud_properties" => cloud_properties.dup
|
20
|
+
}
|
21
|
+
manifest["update"] = {
|
22
|
+
"canaries" => 1,
|
23
|
+
"canary_watch_time" => 30000,
|
24
|
+
"update_watch_time" => 30000,
|
25
|
+
"max_in_flight" => 4,
|
26
|
+
"max_errors" => 1
|
27
|
+
}
|
28
|
+
manifest["networks"] = [
|
29
|
+
{
|
30
|
+
"name" => "default",
|
31
|
+
"type" => "dynamic",
|
32
|
+
"cloud_properties" => { "security_groups" => @security_groups.dup }
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"name" => "vip_network",
|
36
|
+
"type" => "vip",
|
37
|
+
"cloud_properties" => { "security_groups" => @security_groups.dup }
|
38
|
+
}
|
39
|
+
]
|
40
|
+
manifest["resource_pools"] = [
|
41
|
+
{
|
42
|
+
"name" => "common",
|
43
|
+
"network" => "default",
|
44
|
+
"size" => 0,
|
45
|
+
"stemcell" => @stemcell,
|
46
|
+
"cloud_properties" => cloud_properties.dup
|
47
|
+
}
|
48
|
+
]
|
49
|
+
manifest["jobs"] = []
|
50
|
+
manifest["properties"] = {}
|
51
|
+
end
|
52
|
+
|
53
|
+
def jobs=(jobs)
|
54
|
+
total_instances = 0
|
55
|
+
manifest["jobs"] = []
|
56
|
+
jobs.each do |job|
|
57
|
+
manifest_job = {
|
58
|
+
"name" => job["name"],
|
59
|
+
"template" => job["template"] || job["name"],
|
60
|
+
"instances" => job["instances"] || 1,
|
61
|
+
"resource_pool" => "common",
|
62
|
+
"networks" => [
|
63
|
+
{
|
64
|
+
"name" => "default",
|
65
|
+
"default" => %w[dns gateway]
|
66
|
+
}
|
67
|
+
]
|
68
|
+
}
|
69
|
+
if job["static_ips"]
|
70
|
+
manifest_job["networks"] << {
|
71
|
+
"name" => "vip_network",
|
72
|
+
"static_ips" => job["static_ips"]
|
73
|
+
}
|
74
|
+
end
|
75
|
+
manifest["jobs"] << manifest_job
|
76
|
+
end
|
77
|
+
manifest["resource_pools"].first["size"] = manifest["jobs"].inject(0) {|total, job| total + job["instances"]}
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_yaml
|
81
|
+
manifest.to_yaml
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
data/lib/bosh/gen/version.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
---
|
2
|
+
name: myproj
|
3
|
+
director_uuid: UUID
|
4
|
+
release:
|
5
|
+
name: myproj
|
6
|
+
version: 1
|
7
|
+
compilation:
|
8
|
+
workers: 10
|
9
|
+
network: default
|
10
|
+
cloud_properties:
|
11
|
+
instance_type: m1.small
|
12
|
+
update:
|
13
|
+
canaries: 1
|
14
|
+
canary_watch_time: 30000
|
15
|
+
update_watch_time: 30000
|
16
|
+
max_in_flight: 4
|
17
|
+
max_errors: 1
|
18
|
+
networks:
|
19
|
+
- name: default
|
20
|
+
type: dynamic
|
21
|
+
cloud_properties:
|
22
|
+
security_groups:
|
23
|
+
- default
|
24
|
+
- name: vip_network
|
25
|
+
type: vip
|
26
|
+
cloud_properties:
|
27
|
+
security_groups:
|
28
|
+
- default
|
29
|
+
resource_pools:
|
30
|
+
- name: common
|
31
|
+
network: default
|
32
|
+
size: 2
|
33
|
+
stemcell:
|
34
|
+
name: bosh-stemcell
|
35
|
+
version: 0.5.1
|
36
|
+
cloud_properties:
|
37
|
+
instance_type: m1.small
|
38
|
+
jobs:
|
39
|
+
- name: job-with-ips
|
40
|
+
template: job-with-ips
|
41
|
+
instances: 1
|
42
|
+
resource_pool: common
|
43
|
+
networks:
|
44
|
+
- name: default
|
45
|
+
default:
|
46
|
+
- dns
|
47
|
+
- gateway
|
48
|
+
- name: vip_network
|
49
|
+
static_ips:
|
50
|
+
- 1.2.3.4
|
51
|
+
- name: misc
|
52
|
+
template: misc
|
53
|
+
instances: 1
|
54
|
+
resource_pool: common
|
55
|
+
networks:
|
56
|
+
- name: default
|
57
|
+
default:
|
58
|
+
- dns
|
59
|
+
- gateway
|
60
|
+
properties: {}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "minitest/spec"
|
2
|
+
require "minitest-colorize"
|
3
|
+
require "bosh/gen/models"
|
4
|
+
|
5
|
+
class DeploymentManifestSpec < MiniTest::Spec
|
6
|
+
it "creates 'defaults' manifest document with 2 jobs" do
|
7
|
+
manifest = Bosh::Gen::Models::DeploymentManifest.new("myproj", "UUID", {"instance_type" => "m1.small"})
|
8
|
+
manifest.jobs = [
|
9
|
+
{ "name" => "job-with-ips", "static_ips" => ['1.2.3.4']},
|
10
|
+
{ "name" => "misc"}
|
11
|
+
]
|
12
|
+
manifest.to_yaml.must_equal fixture_manifest("defaults")
|
13
|
+
end
|
14
|
+
|
15
|
+
def fixture_manifest(name)
|
16
|
+
File.read(File.expand_path("../../fixtures/deployment_manifests/#{name}.yml", __FILE__))
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh-gen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
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: 2012-05-
|
12
|
+
date: 2012-05-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -59,6 +59,54 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: minitest
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '2.12'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '2.12'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: minitest-colorize
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: guard-minitest
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
62
110
|
description: Generators for creating BOSH releases
|
63
111
|
email:
|
64
112
|
- drnicwilliams@gmail.com
|
@@ -70,6 +118,7 @@ files:
|
|
70
118
|
- .gitignore
|
71
119
|
- ChangeLog.md
|
72
120
|
- Gemfile
|
121
|
+
- Guardfile
|
73
122
|
- LICENSE
|
74
123
|
- README.md
|
75
124
|
- Rakefile
|
@@ -77,8 +126,12 @@ files:
|
|
77
126
|
- bosh-gen.gemspec
|
78
127
|
- lib/bosh/gen.rb
|
79
128
|
- lib/bosh/gen/cli.rb
|
129
|
+
- lib/bosh/gen/generators/deployment_manifest_generator.rb
|
80
130
|
- lib/bosh/gen/generators/job_generator.rb
|
81
131
|
- lib/bosh/gen/generators/job_generator/templates/.gitkeep
|
132
|
+
- lib/bosh/gen/generators/job_generator/templates/jobs/%job_name%/TODO.md.tt
|
133
|
+
- lib/bosh/gen/generators/job_generator/templates/jobs/%job_name%/monit.tt
|
134
|
+
- lib/bosh/gen/generators/job_generator/templates/jobs/%job_name%/templates/%job_name%_ctl.tt
|
82
135
|
- lib/bosh/gen/generators/job_template_generator.rb
|
83
136
|
- lib/bosh/gen/generators/new_release_generator.rb
|
84
137
|
- lib/bosh/gen/generators/new_release_generator/templates/README.md.tt
|
@@ -89,7 +142,11 @@ files:
|
|
89
142
|
- lib/bosh/gen/generators/package_generator.rb
|
90
143
|
- lib/bosh/gen/generators/package_generator/templates/.gitkeep
|
91
144
|
- lib/bosh/gen/generators/package_source_generator.rb
|
145
|
+
- lib/bosh/gen/models.rb
|
146
|
+
- lib/bosh/gen/models/deployment_manifest.rb
|
92
147
|
- lib/bosh/gen/version.rb
|
148
|
+
- spec/fixtures/deployment_manifests/defaults.yml
|
149
|
+
- spec/models/deployment_manifest_spec.rb
|
93
150
|
homepage: https://github.com/drnic/bosh-gen
|
94
151
|
licenses: []
|
95
152
|
post_install_message:
|
@@ -104,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
104
161
|
version: '0'
|
105
162
|
segments:
|
106
163
|
- 0
|
107
|
-
hash: -
|
164
|
+
hash: -1671350536901681396
|
108
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
166
|
none: false
|
110
167
|
requirements:
|
@@ -113,11 +170,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
113
170
|
version: '0'
|
114
171
|
segments:
|
115
172
|
- 0
|
116
|
-
hash: -
|
173
|
+
hash: -1671350536901681396
|
117
174
|
requirements: []
|
118
175
|
rubyforge_project:
|
119
176
|
rubygems_version: 1.8.23
|
120
177
|
signing_key:
|
121
178
|
specification_version: 3
|
122
179
|
summary: ''
|
123
|
-
test_files:
|
180
|
+
test_files:
|
181
|
+
- spec/fixtures/deployment_manifests/defaults.yml
|
182
|
+
- spec/models/deployment_manifest_spec.rb
|