topo-provision 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +201 -0
- data/README.md +100 -0
- data/bin/topo-provision +23 -0
- data/lib/topo/converter.rb +80 -0
- data/lib/topo/converter/cloudformation/converter.rb +219 -0
- data/lib/topo/exporter.rb +15 -0
- data/lib/topo/loader.rb +31 -0
- data/lib/topo/provision.rb +3 -0
- data/lib/topo/provision/aws/generator.rb +55 -0
- data/lib/topo/provision/aws/generators/aws_auto_scaling_group.rb +61 -0
- data/lib/topo/provision/aws/generators/aws_launch_configuration.rb +65 -0
- data/lib/topo/provision/aws/generators/context.rb +33 -0
- data/lib/topo/provision/aws/generators/load_balancer.rb +47 -0
- data/lib/topo/provision/aws/generators/machine.rb +36 -0
- data/lib/topo/provision/aws/generators/machine_image.rb +38 -0
- data/lib/topo/provision/aws/generators/node_group.rb +64 -0
- data/lib/topo/provision/cli.rb +95 -0
- data/lib/topo/provision/generator.rb +185 -0
- data/lib/topo/provision/generators/chef_node.rb +35 -0
- data/lib/topo/provision/generators/context.rb +70 -0
- data/lib/topo/provision/generators/load_balancer.rb +40 -0
- data/lib/topo/provision/generators/machine.rb +50 -0
- data/lib/topo/provision/generators/machine_image.rb +43 -0
- data/lib/topo/provision/generators/node_group.rb +74 -0
- data/lib/topo/provision/generators/resource.rb +91 -0
- data/lib/topo/provision/generators/templates/context.erb +8 -0
- data/lib/topo/provision/generators/templates/machine_deploy.erb +11 -0
- data/lib/topo/provision/generators/templates/machine_stop.erb +5 -0
- data/lib/topo/provision/generators/templates/node_group_action.erb +6 -0
- data/lib/topo/provision/generators/templates/node_group_deploy.erb +5 -0
- data/lib/topo/provision/generators/templates/resource_deploy.erb +5 -0
- data/lib/topo/provision/generators/templates/resource_undeploy.erb +5 -0
- data/lib/topo/provision/topology_generator.rb +84 -0
- data/lib/topo/provision/vagrant/generator.rb +33 -0
- data/lib/topo/provision/version.rb +5 -0
- data/lib/topo/topology.rb +61 -0
- data/lib/topo/utils/output.rb +31 -0
- data/lib/topo/utils/parsegen.rb +101 -0
- metadata +126 -0
data/lib/topo/loader.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "topo/converter"
|
2
|
+
require "topo/topology"
|
3
|
+
|
4
|
+
module Topo
|
5
|
+
class Loader
|
6
|
+
|
7
|
+
|
8
|
+
def self.from_file(file, format='default')
|
9
|
+
|
10
|
+
unless File.file?(file)
|
11
|
+
STDERR.puts "ERROR: #{file} is not the name of a valid file."
|
12
|
+
exit(-1)
|
13
|
+
end
|
14
|
+
|
15
|
+
begin
|
16
|
+
data = JSON.parse(File.read(file))
|
17
|
+
filename = File.basename(file)
|
18
|
+
index = filename.rindex('.') || -1
|
19
|
+
index -= 1 unless index == -1
|
20
|
+
data['name'] = filename[0..index] unless data['name']
|
21
|
+
rescue JSON::ParserError => e
|
22
|
+
STDERR.puts e.message
|
23
|
+
STDERR.puts "ERROR: Parsing error in #{file}."
|
24
|
+
exit(-1)
|
25
|
+
end
|
26
|
+
|
27
|
+
Topo::Topology.new(Topo::Converter.convert(data, format))
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Christine Draper (<christine_draper@thirdwaveinsights.com>)
|
3
|
+
# Copyright:: Copyright (c) 2015 ThirdWave Insights LLC
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'topo/provision/generator'
|
20
|
+
|
21
|
+
# load the resource generators
|
22
|
+
%w[aws_auto_scaling_group aws_launch_configuration load_balancer machine machine_image context node_group].each do |gen|
|
23
|
+
require_relative 'generators/' + gen
|
24
|
+
end
|
25
|
+
|
26
|
+
module Topo
|
27
|
+
module Provision
|
28
|
+
class AwsGenerator < Topo::Provision::Generator
|
29
|
+
|
30
|
+
self.register_generator("aws", self.name)
|
31
|
+
|
32
|
+
def context()
|
33
|
+
@context ||= Topo::Provision::AwsContextGenerator.new(@topology.provisioning, @topology.driver)
|
34
|
+
end
|
35
|
+
|
36
|
+
def node(data)
|
37
|
+
if (data['provisioning'])
|
38
|
+
if(data['provisioning']['node_group'])
|
39
|
+
node = Topo::Provision::AwsNodeGroupGenerator.new(data)
|
40
|
+
else
|
41
|
+
node = Topo::Provision::AwsMachineGenerator.new(data)
|
42
|
+
end
|
43
|
+
else
|
44
|
+
node = Topo::Provision::ChefNodeGenerator.new(data)
|
45
|
+
end
|
46
|
+
node
|
47
|
+
end
|
48
|
+
|
49
|
+
def load_balancer(data)
|
50
|
+
Topo::Provision::AwsLoadBalancerGenerator.new(data)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Christine Draper (<christine_draper@thirdwaveinsights.com>)
|
3
|
+
# Copyright:: Copyright (c) 2015 ThirdWave Insights LLC
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'topo/provision/generators/resource'
|
20
|
+
|
21
|
+
module Topo
|
22
|
+
module Provision
|
23
|
+
class AwsAutoScalingGroupGenerator < Topo::Provision::ResourceGenerator
|
24
|
+
extend Topo::ParseGen
|
25
|
+
|
26
|
+
def initialize(data)
|
27
|
+
@resource_type ||= "aws_auto_scaling_group"
|
28
|
+
super
|
29
|
+
%w[launch_configuration max_size min_size desired_capacity availability_zones load_balancers options].each do |key|
|
30
|
+
@resource_attributes[key] = data[key] if data.key? key
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.from_node(node)
|
35
|
+
auto_scaling = value_from_path(node, %w[provisioning node_group auto_scaling]) || {}
|
36
|
+
|
37
|
+
group_data = {
|
38
|
+
"name" => auto_scaling['group_name'] || node['name'] + "_group",
|
39
|
+
"launch_configuration" => auto_scaling['launch_configuration'] || node['name'] + "_config"
|
40
|
+
}
|
41
|
+
|
42
|
+
%w[max_size min_size desired_capacity availability_zones load_balancers].each do |key|
|
43
|
+
group_data[key] = auto_scaling[key] if auto_scaling.key? key
|
44
|
+
end
|
45
|
+
|
46
|
+
options = auto_scaling['group_options']
|
47
|
+
if options
|
48
|
+
# we also need to convert some of the field values in options, and then all of the keys
|
49
|
+
%w[health_check_type].each do |key|
|
50
|
+
options[key] = options[key].to_sym if options.key? key
|
51
|
+
end
|
52
|
+
group_data['options'] = convert_keys_to_sym_deep(options)
|
53
|
+
end
|
54
|
+
|
55
|
+
self.new(group_data)
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Christine Draper (<christine_draper@thirdwaveinsights.com>)
|
3
|
+
# Copyright:: Copyright (c) 2015 ThirdWave Insights LLC
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'topo/provision/generators/resource'
|
20
|
+
|
21
|
+
module Topo
|
22
|
+
module Provision
|
23
|
+
class AwsLaunchConfigurationGenerator < Topo::Provision::ResourceGenerator
|
24
|
+
extend Topo::ParseGen
|
25
|
+
|
26
|
+
def initialize(data, image_id=nil)
|
27
|
+
@resource_type ||= "aws_launch_configuration"
|
28
|
+
super(data)
|
29
|
+
@image_id = image_id || value_from_path(data, %w[options image_id])
|
30
|
+
|
31
|
+
%w[image instance_type options].each do |key|
|
32
|
+
@resource_attributes[key] = data[key] if data.key? key
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def needs_image?
|
37
|
+
@image_id.nil?
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.from_node(node)
|
41
|
+
auto_scaling = value_from_path(node, %w[provisioning node_group auto_scaling]) || {}
|
42
|
+
options = auto_scaling['launch_configuration_options']
|
43
|
+
bootstrap_options = value_from_path(node, %w[provisioning machine_options bootstrap_options])
|
44
|
+
options ||= bootstrap_options
|
45
|
+
image_id = options['image_id']
|
46
|
+
options.delete('image_id')
|
47
|
+
|
48
|
+
lc_data = {
|
49
|
+
"name" => auto_scaling['launch_configuration_name'] || node['name'] + "_config",
|
50
|
+
"image" => image_id || auto_scaling['image'] || node['name'] + "_image"
|
51
|
+
}
|
52
|
+
|
53
|
+
%w[instance_type].each do |key|
|
54
|
+
lc_data[key] = auto_scaling[key] if auto_scaling.key? key
|
55
|
+
end
|
56
|
+
|
57
|
+
if options
|
58
|
+
lc_data['options'] = convert_keys_to_sym_deep(options)
|
59
|
+
end
|
60
|
+
|
61
|
+
self.new(lc_data, image_id)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Christine Draper (<christine_draper@thirdwaveinsights.com>)
|
3
|
+
# Copyright:: Copyright (c) 2015 ThirdWave Insights LLC
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'topo/provision/generators/context'
|
20
|
+
|
21
|
+
|
22
|
+
module Topo
|
23
|
+
module Provision
|
24
|
+
|
25
|
+
class AwsContextGenerator < Topo::Provision::ContextGenerator
|
26
|
+
def initialize(data, default_driver)
|
27
|
+
super
|
28
|
+
@machine_options = convert_keys_to_sym_deep(@machine_options) if @machine_options
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Christine Draper (<christine_draper@thirdwaveinsights.com>)
|
3
|
+
# Copyright:: Copyright (c) 2015 ThirdWave Insights LLC
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'topo/provision/generators/resource'
|
20
|
+
|
21
|
+
module Topo
|
22
|
+
module Provision
|
23
|
+
|
24
|
+
class AwsLoadBalancerGenerator < Topo::Provision::LoadBalancerGenerator
|
25
|
+
|
26
|
+
def initialize(data)
|
27
|
+
super
|
28
|
+
@undeploy_action = "destroy"
|
29
|
+
%w[machines].each do |key|
|
30
|
+
@resource_attributes[key] = data['provisioning'][key] if data['provisioning'].key? key
|
31
|
+
end
|
32
|
+
|
33
|
+
lbopts = (data['provisioning']|| {})['load_balancer_options']
|
34
|
+
if(lbopts)
|
35
|
+
lbopts = convert_keys_to_sym_deep(lbopts)
|
36
|
+
if (lbopts[:listeners])
|
37
|
+
lbopts[:listeners].each_with_index do |listener, index|
|
38
|
+
lbopts[:listeners][index] = convert_keys_to_sym(listener)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
@resource_attributes['load_balancer_options'] = lbopts
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Christine Draper (<christine_draper@thirdwaveinsights.com>)
|
3
|
+
# Copyright:: Copyright (c) 2015 ThirdWave Insights LLC
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'topo/provision/generators/resource'
|
20
|
+
|
21
|
+
#
|
22
|
+
# The ResourceGenerator class generates the recipe resources
|
23
|
+
#
|
24
|
+
|
25
|
+
module Topo
|
26
|
+
module Provision
|
27
|
+
class AwsMachineGenerator < Topo::Provision::MachineGenerator
|
28
|
+
|
29
|
+
def initialize(data)
|
30
|
+
super
|
31
|
+
@machine_options = convert_keys_to_sym_deep(@machine_options) if @machine_options
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Christine Draper (<christine_draper@thirdwaveinsights.com>)
|
3
|
+
# Copyright:: Copyright (c) 2015 ThirdWave Insights LLC
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'topo/provision/generators/resource'
|
20
|
+
|
21
|
+
#
|
22
|
+
# The ResourceGenerator class generates the recipe resources
|
23
|
+
#
|
24
|
+
|
25
|
+
module Topo
|
26
|
+
module Provision
|
27
|
+
class AwsMachineImageGenerator < Topo::Provision::MachineImageGenerator
|
28
|
+
|
29
|
+
def initialize(data)
|
30
|
+
super
|
31
|
+
opts = @resource_attributes['image_options']
|
32
|
+
@resource_attributes['image_options'] = convert_keys_to_sym_deep(opts) if opts
|
33
|
+
@machine_options = convert_keys_to_sym_deep(@machine_options) if @machine_options
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#
|
2
|
+
# Author:: Christine Draper (<christine_draper@thirdwaveinsights.com>)
|
3
|
+
# Copyright:: Copyright (c) 2015 ThirdWave Insights LLC
|
4
|
+
# License:: Apache License, Version 2.0
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'topo/provision/generators/resource'
|
20
|
+
|
21
|
+
#
|
22
|
+
# The NodeGroupGenerator class generates multiple resources depending on the node data
|
23
|
+
#
|
24
|
+
|
25
|
+
module Topo
|
26
|
+
module Provision
|
27
|
+
class AwsNodeGroupGenerator < Topo::Provision::ResourceGenerator
|
28
|
+
|
29
|
+
def initialize(data)
|
30
|
+
super
|
31
|
+
@resources=[]
|
32
|
+
launch_config = Topo::Provision::AwsLaunchConfigurationGenerator.from_node(data)
|
33
|
+
@resources << Topo::Provision::AwsMachineImageGenerator.new(data) if launch_config.needs_image?
|
34
|
+
@resources << launch_config
|
35
|
+
@resources << Topo::Provision::AwsAutoScalingGroupGenerator.from_node(data)
|
36
|
+
end
|
37
|
+
|
38
|
+
def deploy()
|
39
|
+
@resources.each do |resource|
|
40
|
+
resource.do_action("deploy")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def undeploy()
|
45
|
+
@resources.reverse.each do |resource|
|
46
|
+
resource.do_action("undeploy")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def stop()
|
51
|
+
@resources.reverse.each do |resource|
|
52
|
+
resource.do_action("stop")
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def default_action(action)
|
57
|
+
@resources.each do |resource|
|
58
|
+
resource.do_action(action)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|