vagrant-compose 0.2.2 → 0.2.3
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/CHANGELOG.md +9 -1
- data/README.md +3 -3
- data/lib/vagrant/compose/config.rb +16 -4
- data/lib/vagrant/compose/errors.rb +3 -0
- data/lib/vagrant/compose/plugin.rb +2 -1
- data/lib/vagrant/compose/util/cluster.rb +27 -7
- data/lib/vagrant/compose/util/node.rb +27 -1
- data/lib/vagrant/compose/util/node_group.rb +46 -9
- data/lib/vagrant/compose/version.rb +2 -2
- data/lib/vagrant/compose.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 829887cd4923b701ab113a461eee004c59f5e53a
|
4
|
+
data.tar.gz: 150222776421af2f4acc3ca9b5177f9cf327e4fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f30bf0ae52906e0d09a5cf2bf68a5a9a067c68614a7857fe4562ee805962242ba46dabc7bf96b7540529507e27e751007333fb70e3c79a2294cc479f010e14a
|
7
|
+
data.tar.gz: b868272274ee606bf70138cc7b94d6e66d6278846ef3ad2abe8def377875896a0d8fcb1d19d6147701d878113ce74aa6a526622734ab4284788784d3e747fb4d
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
* Initial release.
|
4
4
|
|
5
|
-
# 0.2.
|
5
|
+
# 0.2.2 (December 31, 2015)
|
6
6
|
|
7
7
|
breaking changes!
|
8
8
|
* nodes instances number defined into node method (instances attributes removed)
|
@@ -12,3 +12,11 @@ other changes:
|
|
12
12
|
* Improved documentation.
|
13
13
|
* cluster domain now is optional
|
14
14
|
* nodes code block now is optional
|
15
|
+
|
16
|
+
# 0.2.3 (April 2, 2016)
|
17
|
+
|
18
|
+
* Now custer name can be omitted (thanks to jaydoane)
|
19
|
+
|
20
|
+
other changes:
|
21
|
+
* Documented cluster.debug feature
|
22
|
+
* Improved code inline documentation
|
data/README.md
CHANGED
@@ -391,7 +391,7 @@ For instance, when building a [Consul](https://consul.io/) cluster, all the `con
|
|
391
391
|
``` ruby
|
392
392
|
config.cluster.compose('test') do |c|
|
393
393
|
...
|
394
|
-
c.
|
394
|
+
c.ansible_context_vars['consul-server'] = lambda { |context, nodes|
|
395
395
|
return { 'consul-serverIPs' => nodes.map { |n| n.ip }.to_a }
|
396
396
|
}
|
397
397
|
...
|
@@ -403,10 +403,10 @@ Then, you can use the above context var when generating group_vars for nodes in
|
|
403
403
|
``` ruby
|
404
404
|
config.cluster.compose('test') do |c|
|
405
405
|
...
|
406
|
-
c.
|
406
|
+
c.ansible_context_vars['consul-server'] = lambda { |context, nodes|
|
407
407
|
return { 'serverIPs' => nodes.map { |n| n.ip }.to_a }
|
408
408
|
}
|
409
|
-
c.
|
409
|
+
c.ansible_group_vars['consul-agent'] = lambda { |context, nodes|
|
410
410
|
return { 'consul_joins' => context['consul-serverIPs'] }
|
411
411
|
}
|
412
412
|
...
|
@@ -4,27 +4,39 @@ require_relative "util/cluster"
|
|
4
4
|
|
5
5
|
module VagrantPlugins
|
6
6
|
module Compose
|
7
|
+
|
8
|
+
# Vagrant compose plugin definition class.
|
9
|
+
# This plugins allows easy configuration of a data structure that can be used as a recipe
|
10
|
+
# for setting up and provisioning a vagrant cluster composed by several machines with different
|
11
|
+
# roles.
|
7
12
|
class Config < Vagrant.plugin("2", :config)
|
8
13
|
|
9
|
-
|
14
|
+
# After executing compose, it returns the list of nodes in the cluster.
|
15
|
+
attr_reader :nodes
|
16
|
+
|
17
|
+
# After executing compose, it returns the ansible_groups configuration for provisioning nodes in the cluster.
|
18
|
+
attr_reader :ansible_groups
|
10
19
|
|
11
20
|
def initialize
|
12
21
|
@nodes = {}
|
13
22
|
@ansible_groups = {}
|
14
23
|
end
|
15
|
-
|
24
|
+
|
25
|
+
# Implements cluster creation, through the execution of the give code.
|
16
26
|
def compose (name, &block)
|
17
|
-
#
|
18
|
-
# per la configurazione del cluster stesso, e l'esecuzione della sequenza di compose.
|
27
|
+
# create the cluster (the data structure representing the cluster)
|
19
28
|
@cluster = Cluster.new(name)
|
20
29
|
begin
|
30
|
+
# executes the cluster configuration code
|
21
31
|
block.call(@cluster)
|
22
32
|
rescue Exception => e
|
23
33
|
raise VagrantPlugins::Compose::Errors::ClusterInitializeError, :message => e.message, :cluster_name => name
|
24
34
|
end
|
35
|
+
# tranform cluster configuration into a list of nodes/ansible groups to be used for
|
25
36
|
@nodes, @ansible_groups = @cluster.compose
|
26
37
|
end
|
27
38
|
|
39
|
+
# Implements a utility method that allows to check the list of nodes generated by compose.
|
28
40
|
def debug
|
29
41
|
puts "==> cluster #{@cluster.name} with #{nodes.size} nodes"
|
30
42
|
@nodes.each do |node|
|
@@ -2,7 +2,10 @@ require "vagrant"
|
|
2
2
|
|
3
3
|
module VagrantPlugins
|
4
4
|
module Compose
|
5
|
+
|
6
|
+
#Plugin custom error classes, handling localization of error messages
|
5
7
|
module Errors
|
8
|
+
#Base class for vagrant compose custom errors
|
6
9
|
class VagrantComposeError < Vagrant::Errors::VagrantError
|
7
10
|
error_namespace("vagrant_compose.errors")
|
8
11
|
end
|
@@ -15,7 +15,8 @@ module VagrantPlugins
|
|
15
15
|
class Plugin < Vagrant.plugin("2")
|
16
16
|
name "Compose"
|
17
17
|
description <<-DESC
|
18
|
-
|
18
|
+
A Vagrant plugin that helps building complex multi-machine scenarios.
|
19
|
+
see https://github.com/fabriziopandini/vagrant-compose for documentation.
|
19
20
|
DESC
|
20
21
|
|
21
22
|
config "cluster" do
|
@@ -4,18 +4,40 @@ require_relative "node_group"
|
|
4
4
|
module VagrantPlugins
|
5
5
|
module Compose
|
6
6
|
|
7
|
-
#
|
7
|
+
# This class defines a cluster, thas is a set of group of nodes, where nodes in each group has similar characteristics.
|
8
|
+
# Basically, a cluster is a data structure that can be used as a recipe for setting up and provisioning a
|
9
|
+
# vagrant cluster composed by several machines with different roles.
|
8
10
|
class Cluster
|
9
11
|
|
12
|
+
# The name of the cluster
|
10
13
|
attr_reader :name
|
11
|
-
|
14
|
+
|
15
|
+
# The default vagrant base box to be used for creating vagrant machines in this cluster.
|
16
|
+
# This setting can be changed at group/node level
|
12
17
|
attr_accessor :box
|
18
|
+
|
19
|
+
# The network domain to wich the cluster belongs (used for computing nodes fqdn)
|
13
20
|
attr_accessor :domain
|
21
|
+
|
22
|
+
|
23
|
+
# The root path for ansible playbook; it is used as a base path for computing ansible_group_vars and ansible_host_vars
|
24
|
+
# It defaults to current directory/provisioning
|
14
25
|
attr_accessor :ansible_playbook_path
|
15
|
-
|
26
|
+
|
27
|
+
# The path where ansible group vars files are stores.
|
28
|
+
# It default to ansible_playbook_path/group_vars
|
16
29
|
attr_accessor :ansible_group_vars
|
30
|
+
|
31
|
+
# The path where ansible group vars files are stores.
|
32
|
+
# It default to ansible_playbook_path/host_vars
|
17
33
|
attr_accessor :ansible_host_vars
|
18
34
|
|
35
|
+
# A dictionary, allowing to setup context vars to be uses is value_generators when composing nodes
|
36
|
+
attr_accessor :ansible_context_vars
|
37
|
+
|
38
|
+
# A variable that reflects if vagrant is tageting a single machine, like f.i. when executing vagrant up machine-name
|
39
|
+
attr_reader :multimachine_filter
|
40
|
+
|
19
41
|
# Costruttore di una istanza di cluster.
|
20
42
|
def initialize(name)
|
21
43
|
@group_index = 0
|
@@ -25,6 +47,8 @@ module VagrantPlugins
|
|
25
47
|
@ansible_host_vars = {}
|
26
48
|
@multimachine_filter = ""
|
27
49
|
@ansible_playbook_path = File.join(Dir.pwd, 'provisioning')
|
50
|
+
@ansible_group_vars_path = File.join(@ansible_playbook_path, 'group_vars')
|
51
|
+
@ansible_host_vars_path = File.join(@ansible_playbook_path, 'host_vars')
|
28
52
|
|
29
53
|
@name = name
|
30
54
|
@box = 'ubuntu/trusty64'
|
@@ -129,8 +153,6 @@ module VagrantPlugins
|
|
129
153
|
end
|
130
154
|
|
131
155
|
# cleanup ansible_group_vars files
|
132
|
-
# TODO: make variable public
|
133
|
-
@ansible_group_vars_path = File.join(@ansible_playbook_path, 'group_vars')
|
134
156
|
# TODO: make safe
|
135
157
|
FileUtils.mkdir_p(@ansible_group_vars_path) unless File.exists?(@ansible_group_vars_path)
|
136
158
|
Dir.foreach(@ansible_group_vars_path) {|f| fn = File.join(@ansible_group_vars_path, f); File.delete(fn) if f.end_with?(".yml")}
|
@@ -166,8 +188,6 @@ module VagrantPlugins
|
|
166
188
|
end
|
167
189
|
|
168
190
|
# cleanup ansible_host_vars files (NB. 1 nodo = 1 host)
|
169
|
-
# TODO: make variable public
|
170
|
-
@ansible_host_vars_path = File.join(@ansible_playbook_path, 'host_vars')
|
171
191
|
# TODO: make safe
|
172
192
|
FileUtils.mkdir_p(@ansible_host_vars_path) unless File.exists?(@ansible_host_vars_path)
|
173
193
|
Dir.foreach(@ansible_host_vars_path) {|f| fn = File.join(@ansible_host_vars_path, f); File.delete(fn) if f.end_with?(".yml")}
|
@@ -1,19 +1,45 @@
|
|
1
1
|
module VagrantPlugins
|
2
2
|
module Compose
|
3
3
|
|
4
|
-
#
|
4
|
+
# This class define a node throught a set of setting to be used when creating vagrant machines in the cluster.
|
5
|
+
# Settings will be assigned value by cluster.compose method, according with the connfiguration
|
6
|
+
# of the group of nodes to which the node belongs.
|
5
7
|
class Node
|
8
|
+
|
9
|
+
# The vagrant base box to be used for creating the vagrant machine that implements the node.
|
6
10
|
attr_reader :box
|
11
|
+
|
12
|
+
# The box name for this node a.k.a. the name for the machine in VirtualBox/VMware console.
|
7
13
|
attr_reader :boxname
|
14
|
+
|
15
|
+
# The hostname for the node.
|
8
16
|
attr_reader :hostname
|
17
|
+
|
18
|
+
# The fully qualified name for the node.
|
9
19
|
attr_reader :fqdn
|
20
|
+
|
21
|
+
# The list of aliases a.k.a. alternative host names for the node.
|
10
22
|
attr_reader :aliases
|
23
|
+
|
24
|
+
# The ip for the node.
|
11
25
|
attr_reader :ip
|
26
|
+
|
27
|
+
# The cpu for the node.
|
12
28
|
attr_reader :cpus
|
29
|
+
|
30
|
+
# The memory for the node.
|
13
31
|
attr_reader :memory
|
32
|
+
|
33
|
+
# The list of ansible_groups for the node.
|
14
34
|
attr_reader :ansible_groups
|
35
|
+
|
36
|
+
# A set of custom attributes for the node.
|
15
37
|
attr_reader :attributes
|
38
|
+
|
39
|
+
# A number identifying the node within the group of nodes to which the node belongs.
|
16
40
|
attr_reader :index
|
41
|
+
|
42
|
+
# A number identifying the group of nodes to which the node belongs.
|
17
43
|
attr_reader :group_index
|
18
44
|
|
19
45
|
def initialize(box, boxname, hostname, fqdn, aliases, ip, cpus, memory, ansible_groups, attributes, index, group_index)
|
@@ -3,21 +3,45 @@ require_relative "node"
|
|
3
3
|
module VagrantPlugins
|
4
4
|
module Compose
|
5
5
|
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
6
|
+
# This class defines a group of nodes, representig a set of vagrant machines with similar characteristics.
|
7
|
+
# Nodes will be composed by NodeGroup.compose method, according with the configuration of values/value_generator
|
8
|
+
# of the group of node itself.
|
9
9
|
class NodeGroup
|
10
|
-
|
10
|
+
|
11
|
+
# A number identifying the group of nodes withing the cluster.
|
12
|
+
attr_reader :index
|
13
|
+
|
14
|
+
# The name of the group of nodes
|
11
15
|
attr_reader :name
|
16
|
+
|
17
|
+
# The number of nodes/instances to be created in the group of nodes.
|
12
18
|
attr_reader :instances
|
19
|
+
|
20
|
+
# The vagrant base box to be used for creating vagrant machines implementing nodes in this group.
|
13
21
|
attr_accessor :box
|
22
|
+
|
23
|
+
# The value geneator to be used for assigning to each node in this group a box name a.k.a. the name for the machine in VirtualBox/VMware console.
|
14
24
|
attr_accessor :boxname
|
25
|
+
|
26
|
+
# The value geneator to be used for assigning to each node in this group a unique hostname
|
15
27
|
attr_accessor :hostname
|
28
|
+
|
29
|
+
# The value geneator to be used for assigning to each node in this group a unique list of aliases a.k.a. alternative host names
|
16
30
|
attr_accessor :aliases
|
31
|
+
|
32
|
+
# The value geneator to be used for assigning to each node in this groupa unique ip
|
17
33
|
attr_accessor :ip
|
34
|
+
|
35
|
+
# The value/value geneator to be used for assigning to each node in this group cpus
|
18
36
|
attr_accessor :cpus
|
37
|
+
|
38
|
+
# The value/value geneator to be used for assigning to each node in this group memory
|
19
39
|
attr_accessor :memory
|
40
|
+
|
41
|
+
# The value/value geneator to be used for assigning each node in this group to a list of ansible groups
|
20
42
|
attr_accessor :ansible_groups
|
43
|
+
|
44
|
+
# The value/value geneator to be used for assigning a dictionary with custom attributes - Hash(String, obj) - to each node in this group.
|
21
45
|
attr_accessor :attributes
|
22
46
|
|
23
47
|
def initialize(index, instances, name)
|
@@ -26,13 +50,18 @@ module VagrantPlugins
|
|
26
50
|
@instances = instances
|
27
51
|
end
|
28
52
|
|
29
|
-
#
|
53
|
+
# Composes the group of nodes, by creating the requiring number of nodes
|
54
|
+
# in accrodance with values/value_generators.
|
55
|
+
# Additionally, some "embedded" trasformation will be applied to attributes (boxname, hostname) and
|
56
|
+
# some "autogenerated" node properties will be computed (fqdn).
|
30
57
|
def compose(cluster_name, cluster_domain, cluster_offset)
|
31
58
|
node_index = 0
|
32
59
|
while node_index < @instances
|
33
60
|
box = generate(:box, @box, node_index)
|
34
|
-
boxname =
|
35
|
-
|
61
|
+
boxname = maybe_prefix(cluster_name,
|
62
|
+
"#{generate(:boxname, @boxname, node_index)}")
|
63
|
+
hostname = maybe_prefix(cluster_name,
|
64
|
+
"#{generate(:hostname, @hostname, node_index)}")
|
36
65
|
aliases = generate(:aliases, @aliases, node_index).join(',')
|
37
66
|
fqdn = cluster_domain.empty? ? "#{hostname}" : "#{hostname}.#{cluster_domain}"
|
38
67
|
ip = generate(:ip, @ip, node_index)
|
@@ -46,8 +75,16 @@ module VagrantPlugins
|
|
46
75
|
end
|
47
76
|
end
|
48
77
|
|
49
|
-
#
|
50
|
-
|
78
|
+
# utility function for concatenating cluster name (if present) to boxname/hostname
|
79
|
+
def maybe_prefix(cluster_name, name)
|
80
|
+
if cluster_name && cluster_name.length > 0
|
81
|
+
"#{cluster_name}-" + name
|
82
|
+
else
|
83
|
+
name
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# utility function for resolving value/value generators
|
51
88
|
def generate(var, generator, node_index)
|
52
89
|
unless generator.respond_to? :call
|
53
90
|
return generator
|
data/lib/vagrant/compose.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-compose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fabrizio Pandini
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|