vagrant-g5k 0.0.16 → 0.0.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +30 -2
- data/Vagrantfile +49 -20
- data/lib/vagrant-g5k.rb +16 -0
- data/lib/vagrant-g5k/action.rb +52 -20
- data/lib/vagrant-g5k/action/connect_g5k.rb +3 -8
- data/lib/vagrant-g5k/action/create_local_working_dir.rb +1 -1
- data/lib/vagrant-g5k/action/get_state.rb +23 -0
- data/lib/vagrant-g5k/action/is_created.rb +6 -2
- data/lib/vagrant-g5k/action/{message_already_created.rb → message_already_running.rb} +1 -1
- data/lib/vagrant-g5k/action/message_not_running.rb +16 -0
- data/lib/vagrant-g5k/action/read_ssh_info.rb +16 -14
- data/lib/vagrant-g5k/action/read_state.rb +8 -0
- data/lib/vagrant-g5k/action/run_instance.rb +1 -0
- data/lib/vagrant-g5k/action/wait_instance.rb +18 -0
- data/lib/vagrant-g5k/config.rb +7 -3
- data/lib/vagrant-g5k/util/g5k_utils.rb +164 -37
- data/lib/vagrant-g5k/util/launch_vm_bridge.sh +58 -0
- data/lib/vagrant-g5k/version.rb +1 -1
- data/vagrant-g5k.gemspec +6 -6
- metadata +24 -70
- data/Vagrantfile.multisite +0 -37
- data/results/.gitignore +0 -2
- data/results/README.md +0 -43
- data/results/Vagrantfile +0 -126
- data/results/ansible.cfg +0 -2
- data/results/boilerplate.retry +0 -1
- data/results/boilerplate.yml +0 -248
- data/results/files/grafana/dashboard.json +0 -4572
- data/results/files/grafana/dedicated.json +0 -5486
- data/results/files/grafana/haproxy.json +0 -2632
- data/results/files/heka/config.json +0 -47
- data/results/files/heka/heka-globals.toml +0 -2
- data/results/files/heka/lua_decoders/haproxy_log.lua +0 -162
- data/results/files/heka/lua_decoders/os_keystone_apache_log.lua +0 -78
- data/results/files/heka/lua_decoders/os_mysql_log.lua +0 -56
- data/results/files/heka/lua_decoders/os_openstack_log.lua +0 -146
- data/results/files/heka/lua_decoders/os_rabbitmq_log.lua +0 -79
- data/results/files/kibana/all_objects.json +0 -81
- data/results/files/nginx.conf +0 -34
- data/results/templates/heka-elasticsearch.toml.j2 +0 -18
- data/results/templates/heka-haproxy.toml.j2 +0 -10
- data/results/templates/heka-keystone.toml.j2 +0 -14
- data/results/templates/heka-mariadb.toml.j2 +0 -14
- data/results/templates/heka-openstack.toml.j2 +0 -15
- data/results/templates/heka-rabbitmq.toml.j2 +0 -21
- data/results/test.rb +0 -32
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36a28bd1d6c3273013c988e54f99f247d6c23b32
|
4
|
+
data.tar.gz: 4aae9321d7dfdc633d32c15b0c247e4fedfb017b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2229d27387e2ac38faeb23f29f17d51144cc85aeef103376a4d12786a4e543426bd61f5d5daaddec5606ae07a4b7a94eafa1548abd095bd15ac787773fe4637
|
7
|
+
data.tar.gz: a4d7f6930d7aa1b881cf2576f91251a49b191b4d948bac37e797c6531baaa7a5915416b7cd4b58bf38763b91a88580a07bb2dbdf85ba4c63e20a119a5e6ec0d3
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
# 0.0.17
|
2
|
+
|
3
|
+
* Add bridged network support
|
4
|
+
* Add support for ssh run command (cli : vagrant ssh vm -c "...".)
|
5
|
+
* Add generic lockable function
|
6
|
+
* Add generic GetState Middleware (destroy can be called even if the VM is
|
7
|
+
terminated)
|
8
|
+
|
1
9
|
# 0.0.16
|
2
10
|
|
3
11
|
* Improve stdout (add information on physical node)
|
data/README.md
CHANGED
@@ -39,6 +39,36 @@ to back the disk image of the virtual machines :
|
|
39
39
|
* `direct`: will use the image directly (you'll need r/w access to the image)
|
40
40
|
* `snapshot`: will let `kvm` create an ephemeral copy on write image.
|
41
41
|
|
42
|
+
## Note on network configuration
|
43
|
+
|
44
|
+
Two networking modes are supported :
|
45
|
+
|
46
|
+
* NAT networking. VMs traffic is NATed to the outside world.
|
47
|
+
The outside world can access the VMs on dedicated ports that are mapped in the host of Grid'5000.
|
48
|
+
```
|
49
|
+
config.vm.provider "g5k" do |g5k|
|
50
|
+
[...]
|
51
|
+
g5k.net = {
|
52
|
+
"type": "nat",
|
53
|
+
"ports": ["2222-:22", "8080-":80]
|
54
|
+
}
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
e.g : Assuming `parapluie-1.rennes.grid5000.fr` hosts the VM. A SSH tunnel from your local machine to `parapluie-1.rennes.grid5000.fr:8080` will be forwarded to the port `80` of the VM.
|
59
|
+
|
60
|
+
* Bridge networking. VMs are given an IP from a Grid'5000 subnet. They can thus communicate with each others using their IPs.
|
61
|
+
|
62
|
+
```
|
63
|
+
config.vm.provider "g5k" do |g5k|
|
64
|
+
[...]
|
65
|
+
g5k.net = {
|
66
|
+
"type": "bridge"
|
67
|
+
}
|
68
|
+
end
|
69
|
+
```
|
70
|
+
|
71
|
+
|
42
72
|
## Supported operations
|
43
73
|
|
44
74
|
* `vagrant destroy`
|
@@ -64,5 +94,3 @@ You can read[1] for further information on how to configure ceph on grid'5000.
|
|
64
94
|
```
|
65
95
|
VAGRANT_LOG=debug VAGRANT_DEFAULT_PROVIDER=g5k bundle exec vagrant up
|
66
96
|
```
|
67
|
-
|
68
|
-
|
data/Vagrantfile
CHANGED
@@ -4,20 +4,19 @@
|
|
4
4
|
# Testing purpose only
|
5
5
|
#Vagrant.require_plugin "vagrant-g5k"
|
6
6
|
|
7
|
-
SITES=['rennes']
|
8
|
-
|
9
7
|
Vagrant.configure(2) do |config|
|
10
|
-
SITES.each do |site|
|
11
|
-
config.vm.define "vm-#{site}" do |my|
|
12
|
-
my.vm.box = "dummy"
|
13
8
|
|
14
|
-
|
15
|
-
|
9
|
+
config.vm.provider "g5k" do |g5k|
|
10
|
+
# project id must be unique accross all
|
11
|
+
# your projects using vagrant-g5k to avoid conflict
|
12
|
+
# on vm disks
|
13
|
+
g5k.project_id = "vagrant-g5k"
|
14
|
+
g5k.site = "rennes"
|
15
|
+
g5k.username = ENV["USER"]
|
16
|
+
g5k.gateway = "access.grid5000.fr"
|
17
|
+
g5k.walltime = "01:00:00"
|
16
18
|
|
17
|
-
|
18
|
-
g5k.project_id = "vagrant-g5k"
|
19
|
-
g5k.site = "#{site}"
|
20
|
-
g5k.gateway = "access.grid5000.fr"
|
19
|
+
# Image backed by the ceph cluster
|
21
20
|
# g5k.image = {
|
22
21
|
# "pool" => "msimonin_rbds",
|
23
22
|
# "rbd" => "bases/alpine_docker",
|
@@ -26,15 +25,45 @@ Vagrant.configure(2) do |config|
|
|
26
25
|
# "conf" => "$HOME/.ceph/config",
|
27
26
|
# "backing" => "snapshot"
|
28
27
|
# }
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
#
|
29
|
+
# Image backed on the frontend filesystem
|
30
|
+
g5k.image = {
|
31
|
+
"path" => "/grid5000/virt-images/alpine_docker.qcow2",
|
32
|
+
"backing" => "snapshot"
|
33
|
+
}
|
34
|
+
|
35
|
+
g5k.net = {
|
36
|
+
"type" => "bridge"
|
37
|
+
}
|
38
|
+
# g5k.net = {
|
39
|
+
# "type" => "nat",
|
40
|
+
# "ports" => ["2222-:22"]
|
41
|
+
# }
|
42
|
+
|
43
|
+
|
44
|
+
# oar selection of resource
|
45
|
+
g5k.oar = "virtual != 'none'"
|
46
|
+
end #g5k
|
47
|
+
|
48
|
+
config.vm.define "vm1" do |my|
|
49
|
+
my.vm.box = "dummy"
|
50
|
+
|
51
|
+
my.ssh.username = "root"
|
52
|
+
my.ssh.password = ""
|
53
|
+
|
54
|
+
end #vm
|
55
|
+
|
56
|
+
config.vm.define "vm2" do |my|
|
57
|
+
my.vm.box = "dummy"
|
58
|
+
|
59
|
+
my.ssh.username = "root"
|
60
|
+
my.ssh.password = ""
|
61
|
+
|
62
|
+
end #vm
|
63
|
+
# Repeat block to define another vm
|
64
|
+
# config.vm.define "vm2" do |my|
|
65
|
+
#
|
66
|
+
# end
|
38
67
|
|
39
68
|
end
|
40
69
|
|
data/lib/vagrant-g5k.rb
CHANGED
@@ -6,6 +6,15 @@ require 'thread'
|
|
6
6
|
module VagrantPlugins
|
7
7
|
module G5K
|
8
8
|
|
9
|
+
class << self
|
10
|
+
attr_accessor :g5k_lock
|
11
|
+
attr_accessor :subnet_lock
|
12
|
+
attr_accessor :pool
|
13
|
+
end
|
14
|
+
@g5k_lock = Mutex.new
|
15
|
+
@subnet_lock = Mutex.new
|
16
|
+
@pool = {}
|
17
|
+
|
9
18
|
lib_path = Pathname.new(File.expand_path("../vagrant-g5k", __FILE__))
|
10
19
|
autoload :Action, lib_path.join("action")
|
11
20
|
autoload :Errors, lib_path.join("errors")
|
@@ -17,5 +26,12 @@ module VagrantPlugins
|
|
17
26
|
@source_root ||= Pathname.new(File.expand_path("../../", __FILE__))
|
18
27
|
end
|
19
28
|
|
29
|
+
def lockable(opts)
|
30
|
+
opts[:lock].synchronize {
|
31
|
+
yield
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
|
20
36
|
end
|
21
37
|
end
|
data/lib/vagrant-g5k/action.rb
CHANGED
@@ -36,9 +36,11 @@ module VagrantPlugins
|
|
36
36
|
def self.action_ssh
|
37
37
|
Vagrant::Action::Builder.new.tap do |b|
|
38
38
|
b.use ConfigValidate
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
# read_state is hook by the call to machine.state.id
|
40
|
+
# in GetState Middleware
|
41
|
+
b.use Call, GetState do |env, b2|
|
42
|
+
if env[:result] != :Running
|
43
|
+
b2.use MessageNotRunning
|
42
44
|
next
|
43
45
|
end
|
44
46
|
b2.use SSHExec
|
@@ -46,16 +48,36 @@ module VagrantPlugins
|
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
51
|
+
|
52
|
+
# This action is called when vagrant ssh -C "..." is used
|
53
|
+
def self.action_ssh_run
|
54
|
+
Vagrant::Action::Builder.new.tap do |b|
|
55
|
+
b.use ConfigValidate
|
56
|
+
b.use Call, GetState do |env, b2|
|
57
|
+
if env[:result] != :Running
|
58
|
+
b2.use MessageNotRunning
|
59
|
+
next
|
60
|
+
end
|
61
|
+
|
62
|
+
b2.use SSHRun
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
|
49
68
|
# This action is called to bring the box up from nothing.
|
50
69
|
def self.action_up
|
51
70
|
Vagrant::Action::Builder.new.tap do |b|
|
52
71
|
b.use ConfigValidate
|
53
|
-
b.use
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
b1.use
|
72
|
+
b.use Call, GetState do |env1, b1|
|
73
|
+
if env1[:result] == :Running then
|
74
|
+
b1.use MessageAlreadyRunning
|
75
|
+
elsif env1[:result] == :Waiting
|
76
|
+
b1.use ConnectG5K
|
77
|
+
b1.use WaitInstance
|
58
78
|
else
|
79
|
+
b1.use ConnectG5K
|
80
|
+
b1.use CreateLocalWorkingDir
|
59
81
|
b1.use RunInstance # launch a new instance
|
60
82
|
end
|
61
83
|
end
|
@@ -69,13 +91,18 @@ module VagrantPlugins
|
|
69
91
|
if env[:result]
|
70
92
|
b2.use ConfigValidate
|
71
93
|
b2.use ConnectG5K
|
72
|
-
b2.use Call,
|
73
|
-
if
|
94
|
+
b2.use Call, GetState do |env2, b3|
|
95
|
+
if [:Running, :Waiting].include?(env2[:result])
|
96
|
+
b3.use DeleteJob
|
97
|
+
b3.use DeleteDisk
|
98
|
+
next
|
99
|
+
elsif env2[:result] == :shutdown
|
100
|
+
b3.use DeleteDisk
|
101
|
+
next
|
102
|
+
else
|
74
103
|
b3.use MessageNotCreated
|
75
104
|
next
|
76
105
|
end
|
77
|
-
b3.use DeleteJob
|
78
|
-
b3.use DeleteDisk
|
79
106
|
end
|
80
107
|
else
|
81
108
|
b2.use MessageWillNotDestroy
|
@@ -89,12 +116,14 @@ module VagrantPlugins
|
|
89
116
|
Vagrant::Action::Builder.new.tap do |b|
|
90
117
|
b.use ConfigValidate
|
91
118
|
b.use ConnectG5K
|
92
|
-
b.use Call,
|
93
|
-
if
|
119
|
+
b.use Call, GetState do |env1, b2|
|
120
|
+
if [:Running, :Waiting].include?(env1[:result])
|
121
|
+
b2.use DeleteJob
|
122
|
+
next
|
123
|
+
else
|
94
124
|
b2.use MessageNotCreated
|
95
125
|
next
|
96
126
|
end
|
97
|
-
b2.use DeleteJob
|
98
127
|
end
|
99
128
|
end
|
100
129
|
end
|
@@ -103,9 +132,9 @@ module VagrantPlugins
|
|
103
132
|
def self.action_provision
|
104
133
|
Vagrant::Action::Builder.new.tap do |b|
|
105
134
|
b.use ConfigValidate
|
106
|
-
b.use Call,
|
107
|
-
if
|
108
|
-
b2.use
|
135
|
+
b.use Call, GetState do |env, b2|
|
136
|
+
if env[:result] != :Running
|
137
|
+
b2.use MessageNotRunning
|
109
138
|
next
|
110
139
|
end
|
111
140
|
b2.use Provision
|
@@ -119,13 +148,16 @@ module VagrantPlugins
|
|
119
148
|
autoload :CreateLocalWorkingDir, action_root.join("create_local_working_dir")
|
120
149
|
autoload :DeleteJob, action_root.join("delete_job")
|
121
150
|
autoload :DeleteDisk, action_root.join("delete_disk")
|
122
|
-
autoload :
|
123
|
-
autoload :
|
151
|
+
autoload :GetState, action_root.join("get_state")
|
152
|
+
autoload :MessageAlreadyRunning, action_root.join("message_already_running")
|
124
153
|
autoload :MessageNotCreated, action_root.join("message_not_created")
|
154
|
+
autoload :MessageNotRunning, action_root.join("message_not_running")
|
125
155
|
autoload :ReadSSHInfo, action_root.join("read_ssh_info")
|
126
156
|
autoload :ReadState, action_root.join("read_state")
|
127
157
|
autoload :RunInstance, action_root.join("run_instance")
|
128
158
|
autoload :StartInstance, action_root.join("start_instance")
|
159
|
+
autoload :WaitInstance, action_root.join("wait_instance")
|
160
|
+
|
129
161
|
|
130
162
|
end
|
131
163
|
end
|
@@ -7,12 +7,6 @@ require 'thread'
|
|
7
7
|
module VagrantPlugins
|
8
8
|
module G5K
|
9
9
|
|
10
|
-
class << self
|
11
|
-
attr_accessor :g5k_lock
|
12
|
-
attr_accessor :pool
|
13
|
-
end
|
14
|
-
@g5k_lock = Mutex.new
|
15
|
-
@pool = {}
|
16
10
|
|
17
11
|
module Action
|
18
12
|
# This action connects to G5K, verifies credentials work, and
|
@@ -20,6 +14,7 @@ module VagrantPlugins
|
|
20
14
|
# in the environment.
|
21
15
|
class ConnectG5K
|
22
16
|
|
17
|
+
include VagrantPlugins::G5K
|
23
18
|
|
24
19
|
def initialize(app, env)
|
25
20
|
@app = app
|
@@ -46,7 +41,7 @@ module VagrantPlugins
|
|
46
41
|
:forward_agent => true
|
47
42
|
}
|
48
43
|
options[:keys] = [private_key] if !private_key.nil?
|
49
|
-
VagrantPlugins::G5K.g5k_lock
|
44
|
+
lockable(:lock => VagrantPlugins::G5K.g5k_lock) do
|
50
45
|
if VagrantPlugins::G5K.pool[key].nil?
|
51
46
|
@logger.debug "Creating a new session object for #{key}"
|
52
47
|
if gateway.nil?
|
@@ -61,7 +56,7 @@ module VagrantPlugins
|
|
61
56
|
else
|
62
57
|
@logger.debug "Reusing existing session for #{key}"
|
63
58
|
end
|
64
|
-
|
59
|
+
end
|
65
60
|
return VagrantPlugins::G5K.pool[key]
|
66
61
|
end
|
67
62
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
3
|
+
module VagrantPlugins
|
4
|
+
module G5K
|
5
|
+
module Action
|
6
|
+
# This can be used with "Call" built-in to check if the machine
|
7
|
+
# is created and branch in the middleware.
|
8
|
+
class GetState
|
9
|
+
def initialize(app, env)
|
10
|
+
@app = app
|
11
|
+
@logger = Log4r::Logger.new("vagrant_g5k::action::get_state")
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
machine_state_id = env[:machine].state.id
|
16
|
+
@logger.info "machine is in state #{machine_state_id}"
|
17
|
+
env[:result] = machine_state_id
|
18
|
+
@app.call(env)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "log4r"
|
2
|
+
|
1
3
|
module VagrantPlugins
|
2
4
|
module G5K
|
3
5
|
module Action
|
@@ -6,11 +8,13 @@ module VagrantPlugins
|
|
6
8
|
class IsCreated
|
7
9
|
def initialize(app, env)
|
8
10
|
@app = app
|
11
|
+
@logger = Log4r::Logger.new("vagrant_g5k::action::is_created")
|
9
12
|
end
|
10
13
|
|
11
14
|
def call(env)
|
12
|
-
|
13
|
-
|
15
|
+
machine_state_id = env[:machine].state.id
|
16
|
+
@logger.info "machine is in state #{machine_state_id}"
|
17
|
+
env[:result] = machine_state_id == :Running or machine_state_id == :Waiting
|
14
18
|
@app.call(env)
|
15
19
|
end
|
16
20
|
end
|
@@ -12,15 +12,20 @@ module VagrantPlugins
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def call(env)
|
15
|
-
|
16
|
-
|
17
|
-
if
|
18
|
-
env[:
|
19
|
-
|
15
|
+
net = env[:machine].provider_config.net
|
16
|
+
# Note: better to encapsulate this in a NetDriver
|
17
|
+
if net["type"] == 'bridge'
|
18
|
+
env[:machine_ssh_info] = read_ssh_info(env[:g5k_connection], env[:machine])
|
19
|
+
else
|
20
|
+
ports = net["ports"]
|
21
|
+
ssh_fwd = ports.select{ |x| x.split(':')[1] == '22'}.first
|
22
|
+
if ssh_fwd.nil?
|
23
|
+
env[:ui].error "SSH port 22 must be forwarded"
|
24
|
+
raise Error "SSh port 22 isn't forwarded"
|
25
|
+
end
|
26
|
+
ssh_fwd = ssh_fwd.split('-:')[0]
|
27
|
+
env[:machine_ssh_info] = read_ssh_info(env[:g5k_connection], env[:machine], ssh_fwd)
|
20
28
|
end
|
21
|
-
ssh_fwd = ssh_fwd.split('-:')[0]
|
22
|
-
env[:machine_ssh_info] = read_ssh_info(env[:g5k_connection], env[:machine], ssh_fwd)
|
23
|
-
|
24
29
|
@app.call(env)
|
25
30
|
end
|
26
31
|
|
@@ -33,18 +38,15 @@ module VagrantPlugins
|
|
33
38
|
end
|
34
39
|
|
35
40
|
|
36
|
-
def read_ssh_info(conn, machine, ssh_fwd)
|
41
|
+
def read_ssh_info(conn, machine, ssh_fwd = nil)
|
37
42
|
return nil if machine.id.nil?
|
38
43
|
|
39
|
-
if ssh_fwd.nil?
|
40
|
-
raise Error "ssh_port should be forwarded"
|
41
|
-
end
|
42
|
-
|
43
44
|
ssh_info = {
|
44
45
|
:host => conn.node,
|
45
|
-
:port => ssh_fwd,
|
46
46
|
}
|
47
47
|
|
48
|
+
ssh_info[:port] = ssh_fwd unless ssh_fwd.nil?
|
49
|
+
|
48
50
|
if !conn.gateway.nil?
|
49
51
|
ssh_info[:proxy_command] = "ssh #{conn.username}@#{conn.gateway} #{ssh_key(conn)} nc %h %p"
|
50
52
|
end
|