cloudformation-ruby-dsl 0.4.0
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/.gitignore +29 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +201 -0
- data/README.md +68 -0
- data/Rakefile +1 -0
- data/bin/cfntemplate-to-ruby +327 -0
- data/cloudformation-ruby-dsl.gemspec +36 -0
- data/examples/cloudformation-ruby-script.rb +195 -0
- data/examples/maps/json_map.json +9 -0
- data/examples/maps/more_maps/map1.json +8 -0
- data/examples/maps/more_maps/map2.json +8 -0
- data/examples/maps/more_maps/map3.json +8 -0
- data/examples/maps/ruby_map.rb +5 -0
- data/examples/maps/text_table.txt +5 -0
- data/examples/maps/yaml_map.yaml +5 -0
- data/examples/userdata.sh +2 -0
- data/initial_contributions.md +3 -0
- data/lib/cloudformation-ruby-dsl.rb +2 -0
- data/lib/cloudformation-ruby-dsl/cfntemplate.rb +406 -0
- data/lib/cloudformation-ruby-dsl/spotprice.rb +50 -0
- data/lib/cloudformation-ruby-dsl/table.rb +93 -0
- data/lib/cloudformation-ruby-dsl/version.rb +21 -0
- metadata +100 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
# Copyright 2013-2014 Bazaarvoice, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
# This list of prices was sourced from the on-demand prices current as of 12/3/2012.
|
16
|
+
# We expect the actual price we pay per instance to be roughly 1/10 the prices below.
|
17
|
+
SPOT_PRICES_BY_INSTANCE_TYPE = {
|
18
|
+
"m1.small" => 0.065,
|
19
|
+
"m1.medium" => 0.130,
|
20
|
+
"m1.large" => 0.260,
|
21
|
+
"m1.xlarge" => 0.520,
|
22
|
+
"m3.xlarge" => 0.580,
|
23
|
+
"m3.2xlarge" => 1.160,
|
24
|
+
"t1.micro" => 0.020,
|
25
|
+
"m2.xlarge" => 0.450,
|
26
|
+
"m2.2xlarge" => 0.900,
|
27
|
+
"m2.4xlarge" => 1.800,
|
28
|
+
"c1.medium" => 0.165,
|
29
|
+
"c1.xlarge" => 0.660,
|
30
|
+
"cc1.4xlarge" => 1.300,
|
31
|
+
"cc2.8xlarge" => 2.400,
|
32
|
+
"cg1.4xlarge" => 2.100,
|
33
|
+
"hi1.4xlarge" => 3.100,
|
34
|
+
"hs1.8xlarge" => 4.600,
|
35
|
+
"cr1.8xlarge" => 4.000,
|
36
|
+
}
|
37
|
+
|
38
|
+
def spot_price(spot_price_string, instance_type)
|
39
|
+
case spot_price_string
|
40
|
+
when 'false', '' then no_value()
|
41
|
+
when 'true' then spot_price_for_instance_type(instance_type)
|
42
|
+
else spot_price_string
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def spot_price_for_instance_type(instance_type)
|
47
|
+
# Add 10% to ensure that we have a small buffer against current spot prices increasing
|
48
|
+
# to the on-demand prices, which theoretically could happen often.
|
49
|
+
SPOT_PRICES_BY_INSTANCE_TYPE[instance_type] * 1.10
|
50
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# Copyright 2013-2014 Bazaarvoice, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'detabulator'
|
16
|
+
|
17
|
+
class Table
|
18
|
+
def self.load(filename)
|
19
|
+
self.new File.read filename
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(table_as_text)
|
23
|
+
raw_header, *raw_data = Detabulator.new.detabulate table_as_text
|
24
|
+
header = raw_header.map(&:to_sym)
|
25
|
+
@records = raw_data.map { |row| Hash[header.zip(row)] }
|
26
|
+
end
|
27
|
+
|
28
|
+
# Selects all rows in the table which match the name/value pairs of the predicate object and returns
|
29
|
+
# the single distinct value from those rows for the specified key.
|
30
|
+
def get(key, predicate)
|
31
|
+
distinct_values(filter(predicate), key, false)
|
32
|
+
end
|
33
|
+
|
34
|
+
# Selects all rows in the table which match the name/value pairs of the predicate object and returns
|
35
|
+
# all distinct values from those rows for the specified key.
|
36
|
+
def get_list(key, predicate)
|
37
|
+
distinct_values(filter(predicate), key, true)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Selects all rows in the table which match the name/value pairs of the predicate object and returns a
|
41
|
+
# set of nested maps, where the key for the map at level n is the key at index n in the specified keys,
|
42
|
+
# except for the last key in the specified keys which is used to determine the value of the leaf-level map.
|
43
|
+
# In the simple case where keys is a list of 2 elements, this returns a map from key[0] to key[1].
|
44
|
+
def get_map(predicate, *keys)
|
45
|
+
build_nested_map(filter(predicate), keys, false)
|
46
|
+
end
|
47
|
+
|
48
|
+
# Selects all rows in the table which match the name/value pairs of the predicate object and returns a
|
49
|
+
# set of nested maps, where the key for the map at level n is the key at index n in the specified keys,
|
50
|
+
# except for the last key in the specified keys which is used to determine the list of values in the
|
51
|
+
# leaf-level map. In the simple case where keys is a list of 2 elements, this returns a map from key[0]
|
52
|
+
# to a list of values for key[1].
|
53
|
+
def get_multimap(predicate, *keys)
|
54
|
+
build_nested_map(filter(predicate), keys, true)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
# Return the subset of records that match the predicate for all keys in the predicate.
|
60
|
+
def filter(predicate)
|
61
|
+
@records.select { |record| predicate.all? { |key, value| record[key] == value } }
|
62
|
+
end
|
63
|
+
|
64
|
+
def build_nested_map(records, path, multi)
|
65
|
+
key, *rest = path
|
66
|
+
if rest.empty?
|
67
|
+
# Build the leaf level of the data structure
|
68
|
+
distinct_values(records, key, multi)
|
69
|
+
else
|
70
|
+
# Return a hash keyed by the distinct values of the first key and values are the result of a
|
71
|
+
# recursive invocation of arrange() with the rest of the keys
|
72
|
+
result = {}
|
73
|
+
records.group_by do |record|
|
74
|
+
record[key]
|
75
|
+
end.map do |value, group|
|
76
|
+
result[value] = build_nested_map(group, rest, multi)
|
77
|
+
end
|
78
|
+
result
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def distinct_values(records, key, multi)
|
83
|
+
values = records.map { |record| record[key] }.uniq
|
84
|
+
if multi
|
85
|
+
# In a multimap the leaf level is a list of string values
|
86
|
+
values
|
87
|
+
else
|
88
|
+
# In a non-multimap the leaf level is a single string value
|
89
|
+
raise "Multiple distinct values for the same key '#{key}': #{records.inspect}" if values.length > 1
|
90
|
+
values[0]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright 2013-2014 Bazaarvoice, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Cfn
|
16
|
+
module Ruby
|
17
|
+
module Dsl
|
18
|
+
VERSION = "0.4.0"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cloudformation-ruby-dsl
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Shawn Smith
|
9
|
+
- Dave Barcelo
|
10
|
+
- Morgan Fletcher
|
11
|
+
- Csongor Gyuricza
|
12
|
+
- Igor Polishchuk
|
13
|
+
- Nathaniel Eliot
|
14
|
+
- Jona Fenocchi
|
15
|
+
- Tony Cui
|
16
|
+
autorequire:
|
17
|
+
bindir: bin
|
18
|
+
cert_chain: []
|
19
|
+
date: 2014-04-21 00:00:00.000000000 Z
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: detabulator
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ! '>='
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '0'
|
29
|
+
type: :runtime
|
30
|
+
prerelease: false
|
31
|
+
version_requirements: !ruby/object:Gem::Requirement
|
32
|
+
none: false
|
33
|
+
requirements:
|
34
|
+
- - ! '>='
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '0'
|
37
|
+
description: Ruby DSL library that provides a wrapper around the cfn-cmd.
|
38
|
+
email:
|
39
|
+
- Shawn.Smith@bazaarvoice.com
|
40
|
+
- Dave.Barcelo@bazaarvoice.com
|
41
|
+
- Morgan.Fletcher@bazaarvoice.com
|
42
|
+
- Csongor.Gyuricza@bazaarvoice.com
|
43
|
+
- Igor.Polishchuk@bazaarvoice.com
|
44
|
+
- Nathaniel.Eliot@bazaarvoice.com
|
45
|
+
- Jona.Fenocchi@bazaarvoice.com
|
46
|
+
- Tony.Cui@bazaarvoice.com
|
47
|
+
executables:
|
48
|
+
- cfntemplate-to-ruby
|
49
|
+
extensions: []
|
50
|
+
extra_rdoc_files: []
|
51
|
+
files:
|
52
|
+
- .gitignore
|
53
|
+
- Gemfile
|
54
|
+
- LICENSE.txt
|
55
|
+
- README.md
|
56
|
+
- Rakefile
|
57
|
+
- bin/cfntemplate-to-ruby
|
58
|
+
- cloudformation-ruby-dsl.gemspec
|
59
|
+
- examples/cloudformation-ruby-script.rb
|
60
|
+
- examples/maps/json_map.json
|
61
|
+
- examples/maps/more_maps/map1.json
|
62
|
+
- examples/maps/more_maps/map2.json
|
63
|
+
- examples/maps/more_maps/map3.json
|
64
|
+
- examples/maps/ruby_map.rb
|
65
|
+
- examples/maps/text_table.txt
|
66
|
+
- examples/maps/yaml_map.yaml
|
67
|
+
- examples/userdata.sh
|
68
|
+
- initial_contributions.md
|
69
|
+
- lib/cloudformation-ruby-dsl.rb
|
70
|
+
- lib/cloudformation-ruby-dsl/cfntemplate.rb
|
71
|
+
- lib/cloudformation-ruby-dsl/spotprice.rb
|
72
|
+
- lib/cloudformation-ruby-dsl/table.rb
|
73
|
+
- lib/cloudformation-ruby-dsl/version.rb
|
74
|
+
homepage: http://github.com/bazaarvoice/cloudformation-ruby-dsl
|
75
|
+
licenses: []
|
76
|
+
post_install_message:
|
77
|
+
rdoc_options: []
|
78
|
+
require_paths:
|
79
|
+
- lib
|
80
|
+
- bin
|
81
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ! '>='
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 1.8.23
|
96
|
+
signing_key:
|
97
|
+
specification_version: 3
|
98
|
+
summary: Ruby DSL library that provides a wrapper around the cfn-cmd. Written by
|
99
|
+
[Bazaarvoice](http://www.bazaarvoice.com).
|
100
|
+
test_files: []
|