bosh-compose 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/bin/bosh-compose +17 -0
  3. data/lib/bosh-compose.rb +79 -0
  4. metadata +88 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 24f4a2fbdce8c69f7c2a4b19643bf37832fa4a1c
4
+ data.tar.gz: 5e307978f0b2ac8a08184d544c165712ef2ae0d1
5
+ SHA512:
6
+ metadata.gz: 611fe4257fcd477c3531b070a6850665a18c93a57490ff8fe88e5f16bd73d5466cbd658aa3044a3ad1e6e31a0c3d4d7e325dd857ea43857077f45424ad281b20
7
+ data.tar.gz: 1193894b081c753621c77928f73a2fb6236416b30a8ecffbfbade89229bc30bddf7900ad64a45c103139eec07256e38148b6dcd22c061bd8993cd066f907e122
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # Add lib to load path
3
+ $:.unshift File.expand_path("../lib", File.dirname(__FILE__))
4
+
5
+ require 'bosh-compose'
6
+ require 'thor'
7
+
8
+ class Cli < Thor
9
+ desc "render <template_path> <deployment_manifest_path>",
10
+ "renders a BOSH erb job template using provided manifest"
11
+ def render(template, manifest)
12
+ puts Bosh::Compose::Renderer.new().render(template, manifest)
13
+ end
14
+ end
15
+
16
+ Cli.start(ARGV)
17
+
@@ -0,0 +1,79 @@
1
+ require 'yaml'
2
+ require 'json'
3
+ require 'bosh/template/renderer'
4
+
5
+ module Bosh
6
+ module Compose
7
+ class Renderer
8
+ def render(template_file, deployment_manifest_file)
9
+ spec = look_for_spec_relative_to(template_file)
10
+
11
+ manifest_yaml = File.read(deployment_manifest_file)
12
+ manifest = YAML.load(manifest_yaml)
13
+ manifest = set_defaults_from_spec(manifest, spec) if spec != nil
14
+
15
+ context = {
16
+ "index": 0,
17
+ "job": {
18
+ "name": "some-job-name"
19
+ },
20
+ "properties": manifest["properties"]
21
+ }
22
+ context_json = JSON.generate(context)
23
+
24
+ renderer = Bosh::Template::Renderer.new(context: context_json)
25
+ renderer.render(template_file)
26
+ end
27
+
28
+ # Attempts to find a relevant spec file based on template file location
29
+ def look_for_spec_relative_to(template_file)
30
+ job_root = File.expand_path('..', File.dirname(template_file))
31
+ spec_path = File.join(job_root, 'spec')
32
+ if !File.exists? spec_path
33
+ STDERR.puts "no spec file found relative to template file"
34
+ return
35
+ end
36
+
37
+ STDERR.puts "found spec file at #{spec_path}, importing."
38
+ spec = File.read(spec_path)
39
+ return YAML.load(spec)
40
+ end
41
+
42
+ def set_defaults_from_spec(manifest, spec)
43
+ spec["properties"].map do |key, value|
44
+ if !manifest["properties"].key? key
45
+ add_nested_property(manifest["properties"], key, value["default"])
46
+ end
47
+ end
48
+ return manifest
49
+ end
50
+
51
+ # car.make
52
+ # set_value("car.make")
53
+ # map[car] = [make]
54
+ #
55
+ # set_value("car.model")
56
+ # map[car] = [make, model]
57
+ #
58
+ # set_value("car.features.power_windows")
59
+ # map[car] = set_value("features.power_windows")
60
+ # map[car] = map[features] = [power_windows]
61
+ def add_nested_property(map, key, value)
62
+ if !key.include? '.'
63
+ if map[key].nil?
64
+ map[key] = value
65
+ end
66
+
67
+ return
68
+ end
69
+
70
+ keys = key.split '.'
71
+ if map[keys.first].nil?
72
+ map[keys.first] = {}
73
+ end
74
+
75
+ add_nested_property map[keys.first], keys.drop(1).join('.'), value
76
+ end
77
+ end
78
+ end
79
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bosh-compose
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Christian Ang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-09-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bosh-template
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3262'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3262'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.19.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.19.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ description: A cli for BOSH job template rendering.
56
+ email: christian.ang@outlook.com
57
+ executables:
58
+ - bosh-compose
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - bin/bosh-compose
63
+ - lib/bosh-compose.rb
64
+ homepage: https://github.com/christianang/bosh-compose
65
+ licenses:
66
+ - MIT
67
+ metadata: {}
68
+ post_install_message:
69
+ rdoc_options: []
70
+ require_paths:
71
+ - lib
72
+ required_ruby_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 2.5.1
85
+ signing_key:
86
+ specification_version: 4
87
+ summary: A cli for BOSH job template rendering.
88
+ test_files: []