bosh-gen 0.3.2 → 0.3.4

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/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