bosh-gen 0.3.2 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog.md CHANGED
@@ -22,6 +22,14 @@ Fixed:
22
22
  * `job` - ctl file has TODO to remind about PID file
23
23
  * `job` - use the provided release path to detect jobs
24
24
 
25
+ ### v0.3.3
26
+
27
+ * `manifest` - introspect the release project for release + job information
28
+
29
+ ### v0.3.4
30
+
31
+ * `manifest` - Force us-east-1e to ensure all VMs and volumes are always in the same AZ
32
+
25
33
  ## v0.2
26
34
 
27
35
  Added:
data/lib/bosh/gen/cli.rb CHANGED
@@ -60,15 +60,15 @@ module Bosh
60
60
  Bosh::Gen::Generators::JobTemplateGenerator.start([job_name, file_path])
61
61
  end
62
62
 
63
- desc "manifest NAME PATH", "Creates a deployment manifest based on the release located at PATH"
63
+ desc "manifest NAME PATH UUID", "Creates a deployment manifest based on the release located at PATH"
64
64
  method_option :force, :type => :boolean, :desc => "Force override existing target manifest file"
65
65
  method_option :addresses, :aliases => ['-a'], :type => :array, :desc => "List of IP addresses available for jobs"
66
- def manifest(name, release_path)
66
+ def manifest(name, release_path, uuid)
67
67
  release_path = File.expand_path(release_path)
68
68
  ip_addresses = options["addresses"] || []
69
69
  flags = { :force => options["force"] || false }
70
70
  require 'bosh/gen/generators/deployment_manifest_generator'
71
- Bosh::Gen::Generators::DeploymentManifestGenerator.start([name, release_path, ip_addresses, flags])
71
+ Bosh::Gen::Generators::DeploymentManifestGenerator.start([name, release_path, uuid, ip_addresses, flags])
72
72
  end
73
73
 
74
74
  no_tasks do
@@ -8,6 +8,7 @@ module Bosh::Gen
8
8
 
9
9
  argument :name
10
10
  argument :release_path
11
+ argument :director_uuid
11
12
  argument :ip_addresses
12
13
  argument :flags, :type => :hash
13
14
 
@@ -24,17 +25,17 @@ module Bosh::Gen
24
25
 
25
26
  # Create a deployment manifest (initially for AWS only)
26
27
  def create_deployment_manifest
27
- cloud_properties = { "instance_type" => "m1.small" }
28
- manifest = Bosh::Gen::Models::DeploymentManifest.new(name, "DIRECTOR_UUID", cloud_properties)
28
+ cloud_properties = { "instance_type" => "m1.small", "availability_zone" => "us-east-1e" }
29
+ manifest = Bosh::Gen::Models::DeploymentManifest.new(name, director_uuid, release_properties, cloud_properties)
29
30
  manifest.jobs = job_manifests(ip_addresses)
30
31
  create_file manifest_file_name, manifest.to_yaml, :force => flags[:force]
31
32
  end
32
33
 
33
34
  private
34
- def jobs_dir(path = "")
35
- File.join(release_path, "jobs", path)
35
+ def release_detector
36
+ @release_detector ||= Bosh::Gen::Models::ReleaseDetection.new(release_path)
36
37
  end
37
-
38
+
38
39
  # Whether +name+ contains .yml suffix or nor, returns a .yml filename for manifest to be generated
39
40
  def manifest_file_name
40
41
  basename = name.gsub(/\.yml/, '') + ".yml"
@@ -50,11 +51,15 @@ module Bosh::Gen
50
51
  jobs
51
52
  end
52
53
 
53
- # Return list of job names in this release based on the contents of jobs/* folder
54
+ # Return list of job names
54
55
  def detect_jobs
55
- Dir[File.join(release_path, "jobs/*")].map {|job_path| File.basename(job_path) }
56
+ release_detector.latest_dev_release_job_names
57
+ end
58
+
59
+ # The "release" aspect of the manifest, which has two keys: name, version
60
+ def release_properties
61
+ release_detector.latest_dev_release_properties
56
62
  end
57
-
58
63
  end
59
64
  end
60
65
  end
@@ -4,4 +4,5 @@ module Bosh
4
4
  end
5
5
  end
6
6
  end
7
- require "bosh/gen/models/deployment_manifest"
7
+ require "bosh/gen/models/deployment_manifest"
8
+ require "bosh/gen/models/release_detection"
@@ -4,7 +4,7 @@ module Bosh::Gen::Models
4
4
  class DeploymentManifest
5
5
  attr_reader :manifest
6
6
 
7
- def initialize(name, director_uuid, cloud_properties)
7
+ def initialize(name, director_uuid, release_properties, cloud_properties)
8
8
  @manifest = {}
9
9
  @cloud_properties = cloud_properties
10
10
  @security_groups = ["default"]
@@ -12,7 +12,7 @@ module Bosh::Gen::Models
12
12
  @stemcell = { "name" => "bosh-stemcell", "version" => @stemcell_version }
13
13
  manifest["name"] = name
14
14
  manifest["director_uuid"] = director_uuid
15
- manifest["release"] = { "name" => name, "version" => 1}
15
+ manifest["release"] = release_properties.dup
16
16
  manifest["compilation"] = {
17
17
  "workers" => 10,
18
18
  "network" => "default",
@@ -50,6 +50,14 @@ module Bosh::Gen::Models
50
50
  manifest["properties"] = {}
51
51
  end
52
52
 
53
+ # Each item of +jobs+ is a hash.
54
+ # The minimum hash is:
55
+ # { "name" => "jobname" }
56
+ # This is the equivalent to:
57
+ # { "name" => "jobname", "template" => "jobname", "instances" => 1}
58
+ #
59
+ # A +jobs+ item can also include a +"static_ips" item, which is an array of strings:
60
+ # { "name" => "jobname", "static_ips" => ['1.2.3.4', '9.8.7.6']}
53
61
  def jobs=(jobs)
54
62
  total_instances = 0
55
63
  manifest["jobs"] = []
@@ -0,0 +1,35 @@
1
+ require "yaml"
2
+
3
+ module Bosh::Gen::Models
4
+ class ReleaseDetection
5
+ attr_reader :release_path
6
+ attr_reader :latest_dev_release
7
+
8
+ def initialize(release_path)
9
+ @release_path = release_path
10
+
11
+ @dev_config = YAML.load_file(File.join(release_path, "config", "dev.yml"))
12
+ @latest_dev_release_filename = File.expand_path(@dev_config["latest_release_filename"], release_path) # absolute or relative
13
+ @latest_dev_release = YAML.load_file(@latest_dev_release_filename)
14
+ end
15
+
16
+ def latest_dev_release_name
17
+ @latest_dev_release["name"]
18
+ end
19
+
20
+ def latest_dev_release_version
21
+ @latest_dev_release["version"].to_i
22
+ end
23
+
24
+ def latest_dev_release_job_names
25
+ @latest_dev_release["jobs"].map {|job| job["name"]}
26
+ end
27
+
28
+ def latest_dev_release_properties
29
+ {
30
+ "name" => latest_dev_release_name,
31
+ "version" => latest_dev_release_version
32
+ }
33
+ end
34
+ end
35
+ end
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Gen
3
- VERSION = "0.3.2"
3
+ VERSION = "0.3.4"
4
4
  end
5
5
  end
@@ -2,8 +2,8 @@
2
2
  name: myproj
3
3
  director_uuid: UUID
4
4
  release:
5
- name: myproj
6
- version: 1
5
+ name: myrelease
6
+ version: 2
7
7
  compilation:
8
8
  workers: 10
9
9
  network: default
@@ -0,0 +1,3 @@
1
+ ---
2
+ dev_name: myrelease
3
+ latest_release_filename: dev_releases/myrelease-10.yml
@@ -0,0 +1,6 @@
1
+ ---
2
+ builds:
3
+ 5c4ded1540f4cc047244f3a5a2e11a99220a2a53:
4
+ version: 1
5
+ d4e368b6c1734ac34555a349ca567aa226cc1a6e:
6
+ version: 2
@@ -0,0 +1,11 @@
1
+ ---
2
+ packages:
3
+ - name: redis
4
+ version: 0.1-dev
5
+ sha1: 3e4d5b321ae69bee3cc0753d1a91606612d710a4
6
+ dependencies: []
7
+
8
+ jobs: []
9
+
10
+ name: myrelease
11
+ version: 1
@@ -0,0 +1,13 @@
1
+ ---
2
+ packages:
3
+ - name: redis
4
+ version: 0.2-dev
5
+ sha1: 90a1131ebec948be6e4d2d2f25be7fa83b76ea79
6
+ dependencies: []
7
+
8
+ jobs:
9
+ - name: redis
10
+ version: 0.1-dev
11
+ sha1: f9b23d1e4585357dc47636d75a63283f629bb1ee
12
+ name: myrelease
13
+ version: 10
@@ -0,0 +1,13 @@
1
+ ---
2
+ packages:
3
+ - name: redis
4
+ version: 0.2-dev
5
+ sha1: 90a1131ebec948be6e4d2d2f25be7fa83b76ea79
6
+ dependencies: []
7
+
8
+ jobs:
9
+ - name: redis
10
+ version: 0.1-dev
11
+ sha1: f9b23d1e4585357dc47636d75a63283f629bb1ee
12
+ name: myrelease
13
+ version: 2
@@ -4,7 +4,9 @@ require "bosh/gen/models"
4
4
 
5
5
  class DeploymentManifestSpec < MiniTest::Spec
6
6
  it "creates 'defaults' manifest document with 2 jobs" do
7
- manifest = Bosh::Gen::Models::DeploymentManifest.new("myproj", "UUID", {"instance_type" => "m1.small"})
7
+ manifest = Bosh::Gen::Models::DeploymentManifest.new("myproj", "UUID",
8
+ {"name" => "myrelease", "version" => 2},
9
+ {"instance_type" => "m1.small"})
8
10
  manifest.jobs = [
9
11
  { "name" => "job-with-ips", "static_ips" => ['1.2.3.4']},
10
12
  { "name" => "misc"}
@@ -0,0 +1,28 @@
1
+ require "minitest/spec"
2
+ require "minitest-colorize"
3
+ require "bosh/gen/models"
4
+
5
+ class ReleaseDetectionSpec < MiniTest::Spec
6
+ it "detects latest dev release version" do
7
+ detector = Bosh::Gen::Models::ReleaseDetection.new(fixture_release_path('some_dev_releases'))
8
+ latest_dev_release_version = detector.latest_dev_release_version
9
+ latest_dev_release_version.must_equal 10
10
+ end
11
+
12
+ it "creates release properties for deployment manifest" do
13
+ detector = Bosh::Gen::Models::ReleaseDetection.new(fixture_release_path('some_dev_releases'))
14
+ detector.latest_dev_release_properties.must_equal({
15
+ "name" => "myrelease",
16
+ "version" => 10
17
+ })
18
+ end
19
+
20
+ it "returns list of jobs" do
21
+ detector = Bosh::Gen::Models::ReleaseDetection.new(fixture_release_path('some_dev_releases'))
22
+ detector.latest_dev_release_job_names.must_equal %w[redis]
23
+ end
24
+
25
+ def fixture_release_path(name)
26
+ File.expand_path("../../fixtures/releases/#{name}/", __FILE__)
27
+ end
28
+ 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.2
4
+ version: 0.3.4
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-07 00:00:00.000000000 Z
12
+ date: 2012-05-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
@@ -144,9 +144,16 @@ files:
144
144
  - lib/bosh/gen/generators/package_source_generator.rb
145
145
  - lib/bosh/gen/models.rb
146
146
  - lib/bosh/gen/models/deployment_manifest.rb
147
+ - lib/bosh/gen/models/release_detection.rb
147
148
  - lib/bosh/gen/version.rb
148
149
  - spec/fixtures/deployment_manifests/defaults.yml
150
+ - spec/fixtures/releases/some_dev_releases/config/dev.yml
151
+ - spec/fixtures/releases/some_dev_releases/dev_releases/index.yml
152
+ - spec/fixtures/releases/some_dev_releases/dev_releases/myrelease-1.yml
153
+ - spec/fixtures/releases/some_dev_releases/dev_releases/myrelease-10.yml
154
+ - spec/fixtures/releases/some_dev_releases/dev_releases/myrelease-2.yml
149
155
  - spec/models/deployment_manifest_spec.rb
156
+ - spec/models/release_detection_spec.rb
150
157
  homepage: https://github.com/drnic/bosh-gen
151
158
  licenses: []
152
159
  post_install_message:
@@ -161,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
168
  version: '0'
162
169
  segments:
163
170
  - 0
164
- hash: -1671350536901681396
171
+ hash: 983046583635840744
165
172
  required_rubygems_version: !ruby/object:Gem::Requirement
166
173
  none: false
167
174
  requirements:
@@ -170,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
177
  version: '0'
171
178
  segments:
172
179
  - 0
173
- hash: -1671350536901681396
180
+ hash: 983046583635840744
174
181
  requirements: []
175
182
  rubyforge_project:
176
183
  rubygems_version: 1.8.23
@@ -179,4 +186,10 @@ specification_version: 3
179
186
  summary: ''
180
187
  test_files:
181
188
  - spec/fixtures/deployment_manifests/defaults.yml
189
+ - spec/fixtures/releases/some_dev_releases/config/dev.yml
190
+ - spec/fixtures/releases/some_dev_releases/dev_releases/index.yml
191
+ - spec/fixtures/releases/some_dev_releases/dev_releases/myrelease-1.yml
192
+ - spec/fixtures/releases/some_dev_releases/dev_releases/myrelease-10.yml
193
+ - spec/fixtures/releases/some_dev_releases/dev_releases/myrelease-2.yml
182
194
  - spec/models/deployment_manifest_spec.rb
195
+ - spec/models/release_detection_spec.rb