bbc-cosmos-tools 0.3.1 → 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.
- checksums.yaml +4 -4
- data/README.md +14 -1
- data/bin/bbc-cosmos-tools +1 -1
- data/lib/bbc/cosmos/tools/cloudformation/generator.rb +2 -4
- data/lib/bbc/cosmos/tools/commands/base.rb +1 -1
- data/lib/bbc/cosmos/tools/commands/stack.rb +29 -18
- data/lib/bbc/cosmos/tools/types/base_type.rb +47 -0
- data/lib/bbc/cosmos/tools/types/cfndsl.rb +32 -0
- data/lib/bbc/cosmos/tools/types/factory.rb +17 -0
- data/lib/bbc/cosmos/tools/types/json.rb +18 -0
- data/lib/bbc/cosmos/tools/types/yaml.rb +17 -0
- data/lib/bbc/cosmos/tools/version.rb +1 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d312899466e33b1d4a65a7335be17846bd070f73
|
4
|
+
data.tar.gz: f83b250a15485d6d15ae407c4f3e2d11c89d484e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: abe8c0da8cdf40c91c63df435b7e858bb304830f73a7ceac96b335b15cdb704328462a959fc35b5c7c55af53465381446211daa91be15cb27575b0fc2631ba9a
|
7
|
+
data.tar.gz: d1b54bb031dc796f72a6692c491da4a3906a0b926e278f335ff3a2aefeb8714771decd417645f9b627f4f3b6cc8ca6ca2e388c356cd010e1c36dffdef993e27b
|
data/README.md
CHANGED
@@ -159,7 +159,20 @@ bbc-cosmos-tools cf create
|
|
159
159
|
bbc-cosmos-tools cf update
|
160
160
|
```
|
161
161
|
|
162
|
-
|
162
|
+
### Help?
|
163
|
+
|
164
|
+
You can use the built-in `help` command to see a list of parameters and options that need to be passed into the command you wish to execute. For example, if we were unsure of the options for the `stack` command then we would execute `bbc-cosmos-tools help stack` and this would display the following output:
|
165
|
+
|
166
|
+
```sh
|
167
|
+
Commands:
|
168
|
+
bbc-cosmos-tools stack help [COMMAND] # Describe subcommands or one specific subco...
|
169
|
+
bbc-cosmos-tools stack create [COMPONENT, MAIN_STACK = false] # Generates and create the cloudformation te...
|
170
|
+
bbc-cosmos-tools stack delete [COMPONENT] # Deletes a stack
|
171
|
+
bbc-cosmos-tools stack events [COMPONENT = nil] # Shows the stack events for a component
|
172
|
+
bbc-cosmos-tools stack generate [COMPONENT] # Generates a cloudformation template based ...
|
173
|
+
bbc-cosmos-tools stack list [COMPONENT = nil] # Lists stacks for a component
|
174
|
+
bbc-cosmos-tools stack update [COMPONENT = nil] # Generates and updates the cloudformation t...
|
175
|
+
```
|
163
176
|
|
164
177
|
## Contributing
|
165
178
|
|
data/bin/bbc-cosmos-tools
CHANGED
@@ -4,11 +4,11 @@ require 'pathname'
|
|
4
4
|
|
5
5
|
root = Pathname.new(__FILE__).dirname.parent
|
6
6
|
lib_path = (root + 'lib').realdirpath
|
7
|
-
config_path = root + 'configs'
|
8
7
|
|
9
8
|
$LOAD_PATH.unshift(lib_path)
|
10
9
|
|
11
10
|
require 'bbc/cosmos/tools/app'
|
11
|
+
|
12
12
|
include BBC::Cosmos::Tools
|
13
13
|
|
14
14
|
App.start
|
@@ -16,11 +16,10 @@ module BBC
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.create(component, config, options, to_json = false, &block)
|
19
|
-
|
20
19
|
template = CfnDsl::CloudFormationTemplate.new
|
21
20
|
template.declare(&block)
|
22
21
|
|
23
|
-
if template.checkRefs
|
22
|
+
if template.checkRefs || CfnDsl::Errors.errors?
|
24
23
|
self.raise_error template
|
25
24
|
else
|
26
25
|
hash = JSON.parse(template.to_json)
|
@@ -33,12 +32,11 @@ module BBC
|
|
33
32
|
|
34
33
|
to_json ? JSON.pretty_generate(hash) : hash
|
35
34
|
end
|
36
|
-
|
37
35
|
end
|
38
36
|
|
39
37
|
def self.parameters(data)
|
40
38
|
if data['Parameters']
|
41
|
-
|
39
|
+
data['Parameters'].reduce({}) do |object, (key, value)|
|
42
40
|
object.tap { |o| o[key] = value['Default'] }
|
43
41
|
end
|
44
42
|
else
|
@@ -14,7 +14,7 @@ module BBC
|
|
14
14
|
|
15
15
|
package_name "BBC Cosmos config tool"
|
16
16
|
|
17
|
-
class_option :key_path, :type => :string, :default => ENV['
|
17
|
+
class_option :key_path, :type => :string, :default => ENV['BBC_COSMOS_TOOLS_CERT'], :desc => "The path to your dev cert, by default the value of the env variable $BBC_COSMOS_TOOLS_CERT is used"
|
18
18
|
class_option :env, :type => :string, :default => 'int', :desc => "The environment to target"
|
19
19
|
class_option :base, :type => :string, :desc => "The base path for the configs repo"
|
20
20
|
class_option :project, :type => :string, :default => ENV['BBC_COSMOS_TOOLS_PROJECT'], :desc => "The name of the project, by default the value of the env variable $BBC_COSMOS_TOOLS_PROJECT is used"
|
@@ -1,6 +1,8 @@
|
|
1
|
+
require "json"
|
1
2
|
require "bbc/cosmos/tools/config"
|
2
3
|
require 'bbc/cosmos/tools/commands/base'
|
3
4
|
require 'bbc/cosmos/tools/cloudformation/generator'
|
5
|
+
require "bbc/cosmos/tools/types/factory"
|
4
6
|
|
5
7
|
module BBC
|
6
8
|
module Cosmos
|
@@ -10,9 +12,17 @@ module BBC
|
|
10
12
|
attr_accessor :api
|
11
13
|
|
12
14
|
class_option :stack, :type => :string, :default => 'main', :desc => "The name of the stack to use"
|
15
|
+
class_option :type, :type => :string, :default => 'cfndsl', :desc => "The format of your your CloudFormation (default is cfndsl, but can also be json or yaml)", :enum => ["cfndsl", "json", "yaml"]
|
13
16
|
|
14
17
|
def initialize(args = [], local_options = {}, thor_config = {})
|
15
18
|
super(args, local_options, thor_config)
|
19
|
+
|
20
|
+
@l = -> data, component, environment do
|
21
|
+
if data['Parameters'] && data['Parameters']['ImageId']
|
22
|
+
data['Parameters']['ImageId']['Default'] = latest_ami_for(component, environment)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
16
26
|
@api = BBC::Cosmos::Tools::API.new(config.app['api'], options[:key_path])
|
17
27
|
end
|
18
28
|
|
@@ -57,7 +67,13 @@ module BBC
|
|
57
67
|
def generate(component)
|
58
68
|
|
59
69
|
say "#{banner(component)}\n"
|
60
|
-
|
70
|
+
|
71
|
+
type = Tools::Types::Factory.create(component, options, config)
|
72
|
+
data = type.generate_data.tap do |d|
|
73
|
+
@l.(d, component, options[:env])
|
74
|
+
end
|
75
|
+
|
76
|
+
say data, :white
|
61
77
|
|
62
78
|
end
|
63
79
|
|
@@ -72,7 +88,10 @@ module BBC
|
|
72
88
|
components(options, component).each do |id|
|
73
89
|
say get_key_value("\nComponent", id)
|
74
90
|
|
75
|
-
|
91
|
+
type = Tools::Types::Factory.create(id, options, config)
|
92
|
+
data = type.generate_data.tap do |d|
|
93
|
+
@l.(d, id, options[:env])
|
94
|
+
end
|
76
95
|
|
77
96
|
post_data = {
|
78
97
|
'name_suffix' => options[:stack],
|
@@ -106,11 +125,17 @@ module BBC
|
|
106
125
|
say get_key_value("\nComponent", id)
|
107
126
|
|
108
127
|
stack_name = "#{options[:env]}-#{id}-#{options[:stack]}"
|
109
|
-
|
128
|
+
|
129
|
+
type = Tools::Types::Factory.create(id, options, config)
|
130
|
+
data = type.generate_data.tap do |d|
|
131
|
+
@l.(d, id, options[:env])
|
132
|
+
end
|
133
|
+
|
134
|
+
params = Tools::Cloudformation::Generator.parameters(data)
|
110
135
|
|
111
136
|
post_data = {
|
112
137
|
'template' => data,
|
113
|
-
'parameters' =>
|
138
|
+
'parameters' => params
|
114
139
|
}
|
115
140
|
|
116
141
|
response = api.post sprintf(config.app['stack_update_endpoint'], options[:env], id, stack_name), JSON.pretty_generate(post_data)
|
@@ -187,20 +212,6 @@ module BBC
|
|
187
212
|
api_error response unless response.success?
|
188
213
|
JSON.parse(response.body).first['image']['ami_id']
|
189
214
|
end
|
190
|
-
|
191
|
-
def cloudformation(component, options, to_json = true)
|
192
|
-
config_data = config
|
193
|
-
|
194
|
-
Tools::Cloudformation::Generator.create(component, config, options, to_json) do
|
195
|
-
component_identifier = options[:group].nil? ? component : options[:group]
|
196
|
-
instance_eval config_data.cf_templates(component_identifier, options[:stack])
|
197
|
-
end.tap do |data|
|
198
|
-
if data['Parameters'] && data['Parameters']['ImageId']
|
199
|
-
data['Parameters']['ImageId']['Default'] = latest_ami_for(component, options[:env])
|
200
|
-
end
|
201
|
-
|
202
|
-
end
|
203
|
-
end
|
204
215
|
end
|
205
216
|
end
|
206
217
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "bbc/cosmos/tools/cloudformation/generator"
|
2
|
+
|
3
|
+
module BBC
|
4
|
+
module Cosmos
|
5
|
+
module Tools
|
6
|
+
module Types
|
7
|
+
class BaseType
|
8
|
+
def initialize(id, options, config)
|
9
|
+
@id = id
|
10
|
+
@options = options
|
11
|
+
@config = config
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_data
|
15
|
+
if valid_component_and_stack
|
16
|
+
get_parameters.each do |key, value|
|
17
|
+
data['Parameters'][key]['Default'] = value if data['Parameters'][key]
|
18
|
+
end
|
19
|
+
data
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
|
25
|
+
def data
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
def construct_file_path type
|
30
|
+
File.join(@config.base_path, 'stacks', @id, "#{@options[:stack]}.#{type}")
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def valid_component_and_stack
|
36
|
+
Tools::Cloudformation::Generator.component_exists?(@id, @config) &&
|
37
|
+
Tools::Cloudformation::Generator.stack_exists?(@id, @config, @options[:stack])
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_parameters
|
41
|
+
@config.resources['cloudformation']['components'][@id][@options[:stack]]['variants'][@options[:variant]]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "bbc/cosmos/tools/cloudformation/generator"
|
2
|
+
|
3
|
+
module BBC
|
4
|
+
module Cosmos
|
5
|
+
module Tools
|
6
|
+
module Types
|
7
|
+
class Cfndsl
|
8
|
+
def initialize(id, options, config)
|
9
|
+
@id = id
|
10
|
+
@options = options
|
11
|
+
@config = config
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_data
|
15
|
+
to_json = false
|
16
|
+
|
17
|
+
# Because the block is evaluated in the context of another class
|
18
|
+
# i.e. instance_eval &block
|
19
|
+
# we need to store off the values first and *then* reference them inside the block
|
20
|
+
component_identifier = @options[:group].nil? ? @id : @options[:group]
|
21
|
+
config = @config
|
22
|
+
stack = @options[:stack]
|
23
|
+
|
24
|
+
Tools::Cloudformation::Generator.create(@id, @config, @options, to_json) {
|
25
|
+
instance_eval config.cf_templates(component_identifier, stack)
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "bbc/cosmos/tools/types/yaml"
|
2
|
+
require "bbc/cosmos/tools/types/json"
|
3
|
+
require "bbc/cosmos/tools/types/cfndsl"
|
4
|
+
|
5
|
+
module BBC
|
6
|
+
module Cosmos
|
7
|
+
module Tools
|
8
|
+
module Types
|
9
|
+
class Factory
|
10
|
+
def self.create(id, options, config)
|
11
|
+
BBC::Cosmos::Tools::Types.const_get(options[:type].capitalize).new(id, options, config)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "json"
|
2
|
+
require "bbc/cosmos/tools/types/base_type"
|
3
|
+
|
4
|
+
module BBC
|
5
|
+
module Cosmos
|
6
|
+
module Tools
|
7
|
+
module Types
|
8
|
+
class Json < BaseType
|
9
|
+
protected
|
10
|
+
|
11
|
+
def data
|
12
|
+
JSON.parse(IO.read(construct_file_path "json"))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bbc-cosmos-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Jack
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -120,6 +120,11 @@ files:
|
|
120
120
|
- lib/bbc/cosmos/tools/commands/stack.rb
|
121
121
|
- lib/bbc/cosmos/tools/config.rb
|
122
122
|
- lib/bbc/cosmos/tools/cosmos_configuration.rb
|
123
|
+
- lib/bbc/cosmos/tools/types/base_type.rb
|
124
|
+
- lib/bbc/cosmos/tools/types/cfndsl.rb
|
125
|
+
- lib/bbc/cosmos/tools/types/factory.rb
|
126
|
+
- lib/bbc/cosmos/tools/types/json.rb
|
127
|
+
- lib/bbc/cosmos/tools/types/yaml.rb
|
123
128
|
- lib/bbc/cosmos/tools/version.rb
|
124
129
|
homepage: ''
|
125
130
|
licenses:
|