bosh-template 1.3262.24.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +28 -0
- data/lib/bosh/template.rb +1 -0
- data/lib/bosh/template/evaluation_context.rb +29 -12
- data/lib/bosh/template/evaluation_link.rb +22 -2
- data/lib/bosh/template/manual_link_dns_encoder.rb +13 -0
- data/lib/bosh/template/property_helper.rb +40 -0
- data/lib/bosh/template/renderer.rb +1 -1
- data/lib/bosh/template/test.rb +14 -0
- data/lib/bosh/template/test/instance_spec.rb +40 -0
- data/lib/bosh/template/test/job.rb +20 -0
- data/lib/bosh/template/test/link.rb +19 -0
- data/lib/bosh/template/test/link_instance.rb +31 -0
- data/lib/bosh/template/test/release_dir.rb +11 -0
- data/lib/bosh/template/test/template.rb +77 -0
- data/lib/bosh/template/version.rb +1 -1
- metadata +12 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2378abe7a780eedfde0662cecff0c3431262493b
|
4
|
+
data.tar.gz: 0d007a700bb85ba2bef9a076e63ae45a29dd447b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f96497f3c1d86cd259ef7fb1d1b70f02c5196553660d39c95be450c431e7eebbe076fc246ef409fd5bd056d1611203f07bbef7284625279848334c593abb689d
|
7
|
+
data.tar.gz: e3b70178abec3413f4dbd0008d8883534860a05f88011b0201ac20cbe996428219e4d9648c309c89b21e3097a22e8caa92c60771b9369eb5ef37f03f1cc8f508
|
data/README.md
CHANGED
@@ -9,3 +9,31 @@ gem install bosh-template
|
|
9
9
|
|
10
10
|
bosh-template <template.erb> --context '{ "...": ... }'
|
11
11
|
```
|
12
|
+
|
13
|
+
## Unit-testing your release ERB templates
|
14
|
+
|
15
|
+
The `Bosh::Template::Test` package provides classes to unit-test your templates. These classes can be used to mock out different combinations of links, instances, etc., without the need to script a `create-release` and `deploy` against a running director.
|
16
|
+
|
17
|
+
Examples of usage are provided in `src/spec/config.erb_spec.rb` in `template-test-release`.
|
18
|
+
|
19
|
+
When you create your own release, you can likewise create a tests folder in your release and use these classes. A release author can create a test and call the template rendering like such:
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
let(:job) {release.job('JOB-NAME')} # e.g. 'web-server;
|
23
|
+
let(:template) {job.template('PATH-TO-TEMPLATE')} # e.g. 'config/config-with-nested'
|
24
|
+
let(:manifest) {
|
25
|
+
'cert' => '----- BEGIN ... -----',
|
26
|
+
'port' => 42,
|
27
|
+
}
|
28
|
+
let(:instance) { InstanceSpec.new(name:'instance-name', az: 'az1', bootstrap: true) }
|
29
|
+
let(:link_instance) { InstanceSpec.new(name:'link-instance-name', az: 'az2') }
|
30
|
+
let(:link_properties){
|
31
|
+
'link-key' => 'link-value',
|
32
|
+
}
|
33
|
+
let(:link) { Link.new(name:'link-name', instances:[link_instance], properties: link_properties)}
|
34
|
+
|
35
|
+
|
36
|
+
rendered_template = JSON.parse(template.render(manifest, spec: instance, consumes: [link]))
|
37
|
+
```
|
38
|
+
|
39
|
+
And then check that their template rendered as they expected.
|
data/lib/bosh/template.rb
CHANGED
@@ -5,6 +5,7 @@ require 'bosh/template/unknown_link'
|
|
5
5
|
require 'bosh/template/property_helper'
|
6
6
|
require 'bosh/template/evaluation_link_instance'
|
7
7
|
require 'bosh/template/evaluation_link'
|
8
|
+
require 'bosh/template/manual_link_dns_encoder'
|
8
9
|
|
9
10
|
module Bosh
|
10
11
|
module Template
|
@@ -28,7 +29,7 @@ module Bosh
|
|
28
29
|
attr_reader :spec
|
29
30
|
|
30
31
|
# @param [Hash] spec Template spec
|
31
|
-
def initialize(spec)
|
32
|
+
def initialize(spec, dns_encoder)
|
32
33
|
unless spec.is_a?(Hash)
|
33
34
|
raise EvaluationFailed,
|
34
35
|
'Invalid spec provided for template evaluation context, ' +
|
@@ -45,6 +46,7 @@ module Bosh
|
|
45
46
|
@spec = openstruct(spec, BackCompatOpenStruct)
|
46
47
|
@raw_properties = spec['properties'] || {}
|
47
48
|
@properties = openstruct(@raw_properties)
|
49
|
+
@dns_encoder = dns_encoder
|
48
50
|
|
49
51
|
@links = spec['links'] || {}
|
50
52
|
end
|
@@ -94,14 +96,29 @@ module Bosh
|
|
94
96
|
end
|
95
97
|
|
96
98
|
def link(name)
|
97
|
-
|
98
|
-
raise UnknownLink.new(name) if
|
99
|
+
link_spec = lookup_property(@links, name)
|
100
|
+
raise UnknownLink.new(name) if link_spec.nil?
|
99
101
|
|
100
|
-
if
|
101
|
-
|
102
|
-
EvaluationLinkInstance.new(
|
102
|
+
if link_spec.has_key?('instances')
|
103
|
+
link_instances = link_spec['instances'].map do |instance_link_spec|
|
104
|
+
EvaluationLinkInstance.new(instance_link_spec['name'], instance_link_spec['index'], instance_link_spec['id'], instance_link_spec['az'], instance_link_spec['address'], instance_link_spec['properties'], instance_link_spec['bootstrap'])
|
103
105
|
end
|
104
|
-
|
106
|
+
|
107
|
+
if link_spec.has_key?('address')
|
108
|
+
encoder_to_inject = ManualLinkDnsEncoder.new(link_spec['address'])
|
109
|
+
else
|
110
|
+
encoder_to_inject = @dns_encoder
|
111
|
+
end
|
112
|
+
|
113
|
+
return EvaluationLink.new(
|
114
|
+
link_instances,
|
115
|
+
link_spec['properties'],
|
116
|
+
link_spec['instance_group'],
|
117
|
+
link_spec['default_network'],
|
118
|
+
link_spec['deployment_name'],
|
119
|
+
link_spec['domain'],
|
120
|
+
encoder_to_inject,
|
121
|
+
)
|
105
122
|
end
|
106
123
|
raise UnknownLink.new(name)
|
107
124
|
end
|
@@ -124,15 +141,15 @@ module Bosh
|
|
124
141
|
# @param [String] name of the link
|
125
142
|
# @yield [Object] link, which is an array of instances
|
126
143
|
def if_link(name)
|
127
|
-
|
128
|
-
if
|
144
|
+
link_spec = lookup_property(@links, name)
|
145
|
+
if link_spec.nil? || !link_spec.has_key?('instances')
|
129
146
|
return ActiveElseBlock.new(self)
|
130
147
|
else
|
131
|
-
|
132
|
-
EvaluationLinkInstance.new(
|
148
|
+
link_instances = link_spec['instances'].map do |instance_link_spec|
|
149
|
+
EvaluationLinkInstance.new(instance_link_spec['name'], instance_link_spec['index'], instance_link_spec['id'], instance_link_spec['az'], instance_link_spec['address'], instance_link_spec['properties'], instance_link_spec['bootstrap'])
|
133
150
|
end
|
134
151
|
|
135
|
-
yield EvaluationLink.new(
|
152
|
+
yield EvaluationLink.new(link_instances, link_spec['properties'], link_spec['instance_group'], link_spec['default_network'], link_spec['deployment_name'], link_spec['root_domain'], @dns_encoder)
|
136
153
|
InactiveElseBlock.new
|
137
154
|
end
|
138
155
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'bosh/template/property_helper'
|
2
|
+
|
1
3
|
module Bosh
|
2
4
|
module Template
|
3
5
|
class EvaluationLink
|
@@ -6,9 +8,14 @@ module Bosh
|
|
6
8
|
attr_reader :instances
|
7
9
|
attr_reader :properties
|
8
10
|
|
9
|
-
def initialize(instances, properties)
|
11
|
+
def initialize(instances, properties, instance_group, default_network, deployment_name, root_domain, dns_encoder)
|
10
12
|
@instances = instances
|
11
13
|
@properties = properties
|
14
|
+
@instance_group = instance_group
|
15
|
+
@default_network = default_network
|
16
|
+
@deployment_name = deployment_name
|
17
|
+
@root_domain = root_domain
|
18
|
+
@dns_encoder = dns_encoder
|
12
19
|
end
|
13
20
|
|
14
21
|
def p(*args)
|
@@ -33,6 +40,19 @@ module Bosh
|
|
33
40
|
yield *values
|
34
41
|
Bosh::Template::EvaluationContext::InactiveElseBlock.new
|
35
42
|
end
|
43
|
+
|
44
|
+
def address(criteria = {})
|
45
|
+
raise NotImplementedError.new('link.address requires bosh director') if @dns_encoder.nil?
|
46
|
+
|
47
|
+
full_criteria = criteria.merge(
|
48
|
+
instance_group: @instance_group,
|
49
|
+
default_network: @default_network,
|
50
|
+
deployment_name: @deployment_name,
|
51
|
+
root_domain: @root_domain,
|
52
|
+
)
|
53
|
+
|
54
|
+
@dns_encoder.encode_query(full_criteria)
|
55
|
+
end
|
36
56
|
end
|
37
57
|
end
|
38
|
-
end
|
58
|
+
end
|
@@ -45,6 +45,46 @@ module Bosh
|
|
45
45
|
|
46
46
|
ref
|
47
47
|
end
|
48
|
+
|
49
|
+
def sort_property(property)
|
50
|
+
if property.is_a?(Hash)
|
51
|
+
property.each do |k, v|
|
52
|
+
property[k] = sort_property(v)
|
53
|
+
end.sort.to_h
|
54
|
+
else
|
55
|
+
property
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Inject property with a given name and value to dst.
|
60
|
+
# @param [Hash] dst Property destination
|
61
|
+
# @param [String] name Property name (dot-separated)
|
62
|
+
# @param [Object] value Property value to be set
|
63
|
+
def set_property(dst, name, value)
|
64
|
+
keys = name.split('.')
|
65
|
+
dst_ref = dst
|
66
|
+
|
67
|
+
keys[0..-2].each do |key|
|
68
|
+
dst_ref[key] ||= {}
|
69
|
+
dst_ref = dst_ref[key]
|
70
|
+
end
|
71
|
+
|
72
|
+
dst_ref[keys[-1]] = value
|
73
|
+
end
|
74
|
+
|
75
|
+
def validate_properties_format(properties, name)
|
76
|
+
keys = name.split('.')
|
77
|
+
properties_ref = properties
|
78
|
+
|
79
|
+
keys.each do |key|
|
80
|
+
unless properties_ref.is_a?(Hash)
|
81
|
+
raise Bosh::Template::InvalidPropertyType,
|
82
|
+
"Property '#{name}' expects a hash, but received '#{properties_ref.class}'"
|
83
|
+
end
|
84
|
+
properties_ref = properties_ref[key]
|
85
|
+
break if properties_ref.nil? # no property with this name is src
|
86
|
+
end
|
87
|
+
end
|
48
88
|
end
|
49
89
|
end
|
50
90
|
end
|
@@ -11,7 +11,7 @@ module Bosh
|
|
11
11
|
|
12
12
|
def render(template_name)
|
13
13
|
spec = JSON.parse(@context)
|
14
|
-
evaluation_context = EvaluationContext.new(spec)
|
14
|
+
evaluation_context = EvaluationContext.new(spec, nil)
|
15
15
|
template = ERB.new(File.read(template_name), safe_level = nil, trim_mode = "-")
|
16
16
|
template.result(evaluation_context.get_binding)
|
17
17
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Bosh
|
2
|
+
module Template
|
3
|
+
module Test
|
4
|
+
|
5
|
+
end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'bosh/template/test/job'
|
10
|
+
require 'bosh/template/test/link'
|
11
|
+
require 'bosh/template/test/link_instance'
|
12
|
+
require 'bosh/template/test/release_dir'
|
13
|
+
require 'bosh/template/test/instance_spec'
|
14
|
+
require 'bosh/template/test/template'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Bosh::Template::Test
|
2
|
+
class InstanceSpec
|
3
|
+
def initialize(
|
4
|
+
address: 'my.bosh.com',
|
5
|
+
az: 'az1',
|
6
|
+
bootstrap: false,
|
7
|
+
deployment: 'my-deployment',
|
8
|
+
id: 'xxxxxx-xxxxxxxx-xxxxx',
|
9
|
+
index: 0,
|
10
|
+
ip: '192.168.0.0',
|
11
|
+
name: 'me',
|
12
|
+
networks: {'network1' => {'foo' => 'bar', 'ip' => '192.168.0.0'}}
|
13
|
+
)
|
14
|
+
@address = address
|
15
|
+
@az = az
|
16
|
+
@bootstrap = bootstrap
|
17
|
+
@deployment = deployment
|
18
|
+
@id = id
|
19
|
+
@index = index
|
20
|
+
@ip = ip
|
21
|
+
@name = name
|
22
|
+
@networks = networks
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_h
|
26
|
+
{
|
27
|
+
'address' => @address,
|
28
|
+
'az' => @az,
|
29
|
+
'bootstrap' => @bootstrap,
|
30
|
+
'deployment' => @deployment,
|
31
|
+
'id' => @id,
|
32
|
+
'index' => @index,
|
33
|
+
'ip' => @ip,
|
34
|
+
'name' => @name,
|
35
|
+
'networks' => @networks,
|
36
|
+
'job' => {'name' => @name}
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Bosh::Template::Test
|
2
|
+
class Job
|
3
|
+
def initialize(release_path, name)
|
4
|
+
@release_path = release_path
|
5
|
+
@name = name
|
6
|
+
@job_path = File.join(@release_path, 'jobs', @name)
|
7
|
+
# raise "No such job at path: #{@job_path}" if !File.exist?(@job_path)
|
8
|
+
spec_path = File.join(@job_path, 'spec')
|
9
|
+
@spec = YAML.load(File.read(spec_path))
|
10
|
+
@templates = @spec['templates']
|
11
|
+
end
|
12
|
+
|
13
|
+
def template(rendered_file_name)
|
14
|
+
@templates.each_pair do |k, v|
|
15
|
+
return Template.new(@spec, File.join(@job_path, 'templates', k)) if v == rendered_file_name
|
16
|
+
end
|
17
|
+
raise "Template for rendered path filename not found: #{rendered_file_name}. Possible values are: [#{@templates.values.join(', ')}]"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Bosh::Template::Test
|
2
|
+
class Link
|
3
|
+
attr_reader :instances, :name, :properties
|
4
|
+
|
5
|
+
def initialize(name:, instances: [], properties: {})
|
6
|
+
@instances = instances
|
7
|
+
@name = name
|
8
|
+
@properties = properties
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_h
|
12
|
+
{
|
13
|
+
'instances' => instances.map(&:to_h),
|
14
|
+
'name' => name,
|
15
|
+
'properties' => properties,
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Bosh::Template::Test
|
2
|
+
class LinkInstance
|
3
|
+
attr_reader :name, :id, :index, :az, :address, :bootstrap
|
4
|
+
|
5
|
+
def initialize(
|
6
|
+
name: 'i-name',
|
7
|
+
id: 'jkl8098',
|
8
|
+
index: 4,
|
9
|
+
az: 'az4',
|
10
|
+
address: 'link.instance.address.com',
|
11
|
+
bootstrap: false)
|
12
|
+
@bootstrap = bootstrap
|
13
|
+
@address = address
|
14
|
+
@az = az
|
15
|
+
@index = index
|
16
|
+
@id = id
|
17
|
+
@name = name
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_h
|
21
|
+
{
|
22
|
+
'name' => name,
|
23
|
+
'id' => id,
|
24
|
+
'index' => index,
|
25
|
+
'az' => az,
|
26
|
+
'address' => address,
|
27
|
+
'bootstrap' => bootstrap
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'bosh/template/evaluation_context'
|
2
|
+
require 'bosh/template/evaluation_context'
|
3
|
+
|
4
|
+
module Bosh::Template
|
5
|
+
module Test
|
6
|
+
class Template
|
7
|
+
include PropertyHelper
|
8
|
+
|
9
|
+
def initialize(job_spec_hash, template_path)
|
10
|
+
@job_spec_hash = job_spec_hash
|
11
|
+
@template_path = template_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def render(manifest_properties_hash, spec: InstanceSpec.new, consumes: [])
|
15
|
+
spec_hash = {}
|
16
|
+
spec_hash['properties'] = hash_with_defaults(manifest_properties_hash)
|
17
|
+
sanitized_hash_with_spec = spec_hash.merge(spec.to_h)
|
18
|
+
sanitized_hash_with_spec['links'] = links_hash(consumes)
|
19
|
+
|
20
|
+
binding = Bosh::Template::EvaluationContext.new(sanitized_hash_with_spec, nil).get_binding
|
21
|
+
raise "No such file at #{@template_path}" unless File.exist?(@template_path)
|
22
|
+
ERB.new(File.read(@template_path)).result(binding)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def hash_with_defaults(manifest_properties_hash)
|
28
|
+
hash_properties = {}
|
29
|
+
spec_properties = @job_spec_hash['properties']
|
30
|
+
|
31
|
+
spec_properties.each_pair do |dotted_spec_key, property_def|
|
32
|
+
property_val = lookup_property(manifest_properties_hash, dotted_spec_key)
|
33
|
+
if property_val.nil? && !property_def['default'].nil?
|
34
|
+
property_val = property_def['default']
|
35
|
+
end
|
36
|
+
insert_property(hash_properties, dotted_spec_key, property_val)
|
37
|
+
end
|
38
|
+
|
39
|
+
hash_properties
|
40
|
+
end
|
41
|
+
|
42
|
+
def links_hash(links)
|
43
|
+
links_hash = {}
|
44
|
+
known_links = []
|
45
|
+
|
46
|
+
consumes = @job_spec_hash.fetch('consumes', [])
|
47
|
+
consumes.each do |consume|
|
48
|
+
known_links << consume['name']
|
49
|
+
link = links.find {|l| l.name == consume['name']}
|
50
|
+
links_hash[link.name] = link.to_h unless link.nil?
|
51
|
+
end
|
52
|
+
|
53
|
+
links.each do |link|
|
54
|
+
unless known_links.include?(link.name)
|
55
|
+
raise "Link '#{link.name}' is not declared as a consumed link in this job."
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
links_hash
|
60
|
+
end
|
61
|
+
|
62
|
+
def insert_property(nested_hash, dotted_key, value)
|
63
|
+
property_segments = dotted_key.split('.')
|
64
|
+
current_level = nested_hash
|
65
|
+
|
66
|
+
property_segments.each_with_index do |property_segment, i|
|
67
|
+
if i == property_segments.count - 1
|
68
|
+
current_level[property_segment] = value
|
69
|
+
else
|
70
|
+
current_level[property_segment] ||= {}
|
71
|
+
current_level = current_level[property_segment]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bosh-template
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pivotal
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: semi_semantic
|
@@ -24,48 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.2.0
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rspec-its
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
27
|
description: Renders bosh templates
|
70
28
|
email: support@cloudfoundry.com
|
71
29
|
executables:
|
@@ -81,14 +39,22 @@ files:
|
|
81
39
|
- lib/bosh/template/evaluation_link.rb
|
82
40
|
- lib/bosh/template/evaluation_link_instance.rb
|
83
41
|
- lib/bosh/template/invalid_property_type.rb
|
42
|
+
- lib/bosh/template/manual_link_dns_encoder.rb
|
84
43
|
- lib/bosh/template/property_helper.rb
|
85
44
|
- lib/bosh/template/renderer.rb
|
45
|
+
- lib/bosh/template/test.rb
|
46
|
+
- lib/bosh/template/test/instance_spec.rb
|
47
|
+
- lib/bosh/template/test/job.rb
|
48
|
+
- lib/bosh/template/test/link.rb
|
49
|
+
- lib/bosh/template/test/link_instance.rb
|
50
|
+
- lib/bosh/template/test/release_dir.rb
|
51
|
+
- lib/bosh/template/test/template.rb
|
86
52
|
- lib/bosh/template/unknown_link.rb
|
87
53
|
- lib/bosh/template/unknown_property.rb
|
88
54
|
- lib/bosh/template/version.rb
|
89
55
|
homepage: https://github.com/cloudfoundry/bosh
|
90
56
|
licenses:
|
91
|
-
- Apache
|
57
|
+
- Apache-2.0
|
92
58
|
metadata: {}
|
93
59
|
post_install_message:
|
94
60
|
rdoc_options: []
|
@@ -106,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
72
|
version: '0'
|
107
73
|
requirements: []
|
108
74
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
75
|
+
rubygems_version: 2.5.1
|
110
76
|
signing_key:
|
111
77
|
specification_version: 4
|
112
78
|
summary: Renders bosh templates
|