vagrant-g5k 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +7 -9
- data/Vagrantfile +22 -24
- data/lib/vagrant-g5k/action.rb +1 -1
- data/lib/vagrant-g5k/action/close_g5k.rb +24 -0
- data/lib/vagrant-g5k/action/connect_g5k.rb +10 -13
- data/lib/vagrant-g5k/action/read_ssh_info.rb +5 -2
- data/lib/vagrant-g5k/action/run_instance.rb +5 -1
- data/lib/vagrant-g5k/command.rb +14 -1
- data/lib/vagrant-g5k/config.rb +12 -13
- data/lib/vagrant-g5k/plugin.rb +1 -1
- data/lib/vagrant-g5k/provider.rb +1 -1
- data/lib/vagrant-g5k/util/g5k_utils.rb +60 -25
- data/lib/vagrant-g5k/util/launch_vm_fwd.sh +4 -13
- data/lib/vagrant-g5k/version.rb +1 -1
- data/spec/vagrant-g5k/config_spec.rb +20 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3584cb138bea51e6e39c67fbce25e69edab6a742
|
4
|
+
data.tar.gz: bbc3daa4abec3664a478c2c3cc74e4902a0e3687
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e15b9be060f76de0210b35d7392e13ac2c876b8f4ff37a3dfd9bbbe45246535efd1fcdd00cd71817a30c820c51235e5a658ff3efee765ef5e1a7fdfc283cae83
|
7
|
+
data.tar.gz: d0e4163e16ed67890ad4f5011ea18cf54edd991395022bc12e1abcec6dc120aefea755061d542c58b4a6a2d5be97af9e3dbd14c10d7b06b4e32d9b421e8f00a0
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
# 0.0.11
|
2
|
+
|
3
|
+
* Support for other "OAR behind ssh scheduler" (e.g Igrida)
|
4
|
+
* Reuse already opened ssh connection
|
5
|
+
|
6
|
+
# 0.0.10
|
7
|
+
|
8
|
+
* Support different backing strategies (copy, cow, direct, snapshot)
|
9
|
+
* Add a mandatory project_id in the configuration
|
10
|
+
|
1
11
|
# 0.0.9
|
2
12
|
|
3
13
|
* Add support for custom walltime
|
data/README.md
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
# Vagrant G5K Provider
|
2
2
|
This is a [Vagrant](http://www.vagrantup.com) 1.2+ plugin that adds an [G5K](https://www.grid5000.fr)
|
3
|
-
provider to Vagrant, allowing Vagrant to control and provision **virtual machines**
|
4
|
-
Grid5000.
|
3
|
+
provider to Vagrant, allowing Vagrant to control and provision **virtual machines** on Grid5000.
|
5
4
|
|
6
|
-
|
5
|
+
More generally any *OAR behind ssh* that support launching `kvm` could be used (e.g [Igrida](http://igrida.gforge.inria.fr/)). Thus *vagrant-oar* could be a more appropriate name.
|
7
6
|
|
8
|
-
|
7
|
+
> This plugin requires
|
8
|
+
* Vagrant 1.2+,
|
9
9
|
|
10
|
-
* Boot one vm instance
|
11
|
-
* SSH into the instances.
|
12
10
|
|
13
11
|
## Usage
|
14
12
|
|
@@ -28,13 +26,13 @@ Check the Vagrantfile.
|
|
28
26
|
|
29
27
|
## Note on disk format and backing strategy
|
30
28
|
|
31
|
-
Virtual Machines can be booted either :
|
29
|
+
Virtual Machines can be booted either :
|
32
30
|
|
33
31
|
* From a `qcow2` image stored in the frontend filesystem
|
34
32
|
* From a rbd image stored in one of the ceph cluster of Grid'5000.
|
35
33
|
|
36
|
-
Once the base image is chosen, you can pick one of the following strategy
|
37
|
-
to back the disk image of the virtual machines :
|
34
|
+
Once the base image is chosen, you can pick one of the following strategy
|
35
|
+
to back the disk image of the virtual machines :
|
38
36
|
|
39
37
|
* `copy`: will make a full copy of the image in your home directory (resp. in the same pool as the rbd)
|
40
38
|
* `cow`: will create a Copy On write image in your home directory (resp. in the same pool as the rbd)
|
data/Vagrantfile
CHANGED
@@ -2,21 +2,19 @@
|
|
2
2
|
# vi: set ft=ruby :
|
3
3
|
#
|
4
4
|
# Testing purpose only
|
5
|
-
Vagrant.require_plugin "vagrant-g5k"
|
5
|
+
#Vagrant.require_plugin "vagrant-g5k"
|
6
6
|
|
7
7
|
Vagrant.configure(2) do |config|
|
8
8
|
# box isn't used
|
9
9
|
config.vm.define "vm" do |my|
|
10
10
|
my.vm.box = "dummy"
|
11
|
-
|
12
|
-
# make sure the insecure-key of vagrant is authorized
|
13
|
-
my.vm.provision "shell", inline: "echo hello", privileged: false
|
11
|
+
my.vm.provision "ansible", :playbook => "playbook.yml"
|
14
12
|
end
|
15
13
|
|
16
14
|
# user to log with inside the vm
|
17
15
|
config.ssh.username = "root"
|
18
16
|
# password to use to log inside the vm
|
19
|
-
|
17
|
+
config.ssh.password = ""
|
20
18
|
|
21
19
|
config.vm.provider "g5k" do |g5k|
|
22
20
|
# The project id.
|
@@ -25,41 +23,41 @@ Vagrant.configure(2) do |config|
|
|
25
23
|
g5k.project_id = "vagrant-g5k"
|
26
24
|
|
27
25
|
# user name used to connect to g5k
|
28
|
-
|
26
|
+
# default to ENV["USER"]
|
27
|
+
# g5k.username = "john"
|
29
28
|
|
30
|
-
# private key
|
29
|
+
# private key to use
|
31
30
|
# g5k.private_key = File.join(ENV['HOME'], ".ssh/id_rsa_discovery")
|
32
31
|
|
33
32
|
# site to use
|
33
|
+
# g5k.site = "igrida-oar-frontend"
|
34
34
|
g5k.site = "rennes"
|
35
35
|
|
36
|
+
# gateway to use (if needed)
|
37
|
+
g5k.gateway = "access.grid5000.fr"
|
38
|
+
# g5k.gateway = "transit.irisa.fr"
|
39
|
+
|
36
40
|
# walltime to use
|
37
41
|
# g5k.walltime = "02:00:00"
|
38
42
|
|
39
43
|
# image location
|
40
44
|
#g5k.image = {
|
41
|
-
# "path" => "/
|
42
|
-
# "backing" => "
|
45
|
+
# "path" => "/udd/msimonin/precise.qcow2",
|
46
|
+
# "backing" => "copy"
|
43
47
|
#}
|
44
48
|
|
45
49
|
# it could be backed by the ceph
|
46
50
|
g5k.image = {
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
# g5k.backing_strategy = "snapshot"
|
56
|
-
# this is a copy on write strategy
|
57
|
-
# image_location is use to read, an epehemeral disk will hold the writes
|
58
|
-
# if not specified this means that the image is used in r/w mode.
|
59
|
-
# changes will be persistent
|
60
|
-
g5k.backing_strategy = "cow"
|
51
|
+
"pool" => "msimonin_rbds",
|
52
|
+
"rbd" => "bases/alpine_docker",
|
53
|
+
"snapshot" => "parent",
|
54
|
+
"id" => "$USER",
|
55
|
+
"conf" => "$HOME/.ceph/config",
|
56
|
+
"backing" => "snapshot"
|
57
|
+
}
|
58
|
+
|
61
59
|
# ports to expose (at least ssh has to be forwarded)
|
62
|
-
g5k.ports = ['2222-:22'
|
60
|
+
g5k.ports = ['2222-:22']
|
63
61
|
end
|
64
62
|
|
65
63
|
|
data/lib/vagrant-g5k/action.rb
CHANGED
@@ -108,7 +108,6 @@ module VagrantPlugins
|
|
108
108
|
b2.use MessageNotCreated
|
109
109
|
next
|
110
110
|
end
|
111
|
-
puts "provision"
|
112
111
|
b2.use Provision
|
113
112
|
end
|
114
113
|
end
|
@@ -116,6 +115,7 @@ module VagrantPlugins
|
|
116
115
|
|
117
116
|
action_root = Pathname.new(File.expand_path("../action", __FILE__))
|
118
117
|
autoload :ConnectG5K, action_root.join("connect_g5k")
|
118
|
+
autoload :CloseG5K, action_root.join("close_g5k")
|
119
119
|
autoload :CreateLocalWorkingDir, action_root.join("create_local_working_dir")
|
120
120
|
autoload :DeleteJob, action_root.join("delete_job")
|
121
121
|
autoload :DeleteDisk, action_root.join("delete_disk")
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require "vagrant-g5k/util/g5k_utils"
|
3
|
+
|
4
|
+
# Unused
|
5
|
+
module VagrantPlugins
|
6
|
+
module G5K
|
7
|
+
module Action
|
8
|
+
# This action connects to G5K, verifies credentials work, and
|
9
|
+
# puts the G5K connection object into the `:g5k_connection` key
|
10
|
+
# in the environment.
|
11
|
+
class CloseG5K
|
12
|
+
def initialize(app, env)
|
13
|
+
@app = app
|
14
|
+
@logger = Log4r::Logger.new("vagrant_g5k::action::close_g5k")
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
env[:g5k_connection].close()
|
19
|
+
@app.call(env)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -14,19 +14,16 @@ module VagrantPlugins
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def call(env)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
env[:g5k_connection] = Connection.new(
|
28
|
-
args
|
29
|
-
)
|
17
|
+
# This is a hack to make the connection persistent
|
18
|
+
# even after environment unload is called
|
19
|
+
if Connection.instance.nil?
|
20
|
+
@logger.debug("Creating new connection")
|
21
|
+
env[:g5k_connection] = Connection.new(env)
|
22
|
+
else
|
23
|
+
@logger.debug("Reusing connection")
|
24
|
+
env[:g5k_connection] = Connection.instance
|
25
|
+
end
|
26
|
+
|
30
27
|
@app.call(env)
|
31
28
|
end
|
32
29
|
end
|
@@ -37,14 +37,17 @@ module VagrantPlugins
|
|
37
37
|
return nil if machine.id.nil?
|
38
38
|
|
39
39
|
if ssh_fwd.nil?
|
40
|
-
|
41
40
|
raise Error "ssh_port should be forwarded"
|
42
41
|
end
|
42
|
+
|
43
43
|
ssh_info = {
|
44
44
|
:host => conn.node,
|
45
45
|
:port => ssh_fwd,
|
46
|
-
:proxy_command => "ssh #{conn.username}@access.grid5000.fr #{ssh_key(conn)} nc %h %p",
|
47
46
|
}
|
47
|
+
|
48
|
+
if !conn.gateway.nil?
|
49
|
+
ssh_info[:proxy_command] = "ssh #{conn.username}@#{conn.gateway} #{ssh_key(conn)} nc %h %p"
|
50
|
+
end
|
48
51
|
ssh_info[:private_key_path] = [conn.private_key] if ! conn.private_key.nil?
|
49
52
|
return ssh_info
|
50
53
|
end
|
@@ -24,12 +24,16 @@ module VagrantPlugins
|
|
24
24
|
def recover(env)
|
25
25
|
return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)
|
26
26
|
|
27
|
-
if env[:machine].provider.state.id
|
27
|
+
if ![:not_created, :shutdown].include?(env[:machine].provider.state.id)
|
28
28
|
# Undo the import
|
29
29
|
terminate(env)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
+
def terminate(env)
|
34
|
+
@logger.info("Terminate the machine")
|
35
|
+
end
|
36
|
+
|
33
37
|
end
|
34
38
|
end
|
35
39
|
end
|
data/lib/vagrant-g5k/command.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'net/ssh/multi'
|
2
2
|
require 'vagrant-g5k/util/g5k_utils'
|
3
|
+
include Process
|
3
4
|
|
4
5
|
module VagrantPlugins
|
5
6
|
module G5K
|
@@ -12,8 +13,20 @@ module VagrantPlugins
|
|
12
13
|
|
13
14
|
def execute
|
14
15
|
# TODO
|
16
|
+
options = {}
|
17
|
+
opts = OptionParser.new do |o|
|
18
|
+
o.banner = 'Usage: vagrant g(k [vm-name]'
|
19
|
+
o.separator ''
|
20
|
+
o.version = VagrantPlugins::G5K::VERSION
|
21
|
+
o.program_name = 'vagrant g5k'
|
22
|
+
end
|
23
|
+
argv = parse_options(opts)
|
24
|
+
with_target_vms(argv, options) do |machine|
|
25
|
+
puts machine.config.vm.networks
|
26
|
+
end
|
27
|
+
puts "sleeping"
|
28
|
+
wait
|
15
29
|
end
|
16
|
-
|
17
30
|
end
|
18
31
|
end
|
19
32
|
end
|
data/lib/vagrant-g5k/config.rb
CHANGED
@@ -29,6 +29,11 @@ module VagrantPlugins
|
|
29
29
|
# @return [String]
|
30
30
|
attr_accessor :site
|
31
31
|
|
32
|
+
# G5K gateway
|
33
|
+
#
|
34
|
+
# @return [String]
|
35
|
+
attr_accessor :gateway
|
36
|
+
|
32
37
|
# G5K image
|
33
38
|
#
|
34
39
|
# @return [Hash]
|
@@ -41,17 +46,11 @@ module VagrantPlugins
|
|
41
46
|
# @return [Array]
|
42
47
|
attr_accessor :ports
|
43
48
|
|
44
|
-
# G5K backing strategy
|
45
|
-
#
|
46
|
-
#
|
47
|
-
# @return [String]
|
48
|
-
attr_accessor :backing_strategy
|
49
|
-
|
50
49
|
def initialize()
|
51
|
-
@username =
|
50
|
+
@username = ENV['USER']
|
52
51
|
@project_id = nil
|
53
|
-
@site =
|
54
|
-
@
|
52
|
+
@site = nil
|
53
|
+
@gateway = nil
|
55
54
|
@walltime = "01:00:00"
|
56
55
|
end
|
57
56
|
|
@@ -63,11 +62,11 @@ module VagrantPlugins
|
|
63
62
|
def validate(machine)
|
64
63
|
errors = _detected_errors
|
65
64
|
|
66
|
-
errors << "g5k
|
65
|
+
errors << "g5k project_id is required" if @project_id.nil?
|
66
|
+
errors << "g5k site is required" if @site.nil?
|
67
67
|
errors << "g5k image is required" if @image.nil?
|
68
|
-
errors << "g5k image
|
69
|
-
|
70
|
-
# TODO validate image hash
|
68
|
+
errors << "g5k image must be a Hash" if !@image.is_a?(Hash)
|
69
|
+
|
71
70
|
{ "G5K Provider" => errors }
|
72
71
|
end
|
73
72
|
|
data/lib/vagrant-g5k/plugin.rb
CHANGED
data/lib/vagrant-g5k/provider.rb
CHANGED
@@ -16,7 +16,7 @@ module VagrantPlugins
|
|
16
16
|
return Action.send(action_method) if Action.respond_to?(action_method)
|
17
17
|
nil
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def ssh_info
|
21
21
|
# Run a custom action called "read_ssh_info" which does what it
|
22
22
|
# says and puts the resulting SSH info into the `:machine_ssh_info`
|
@@ -21,6 +21,8 @@ module VagrantPlugins
|
|
21
21
|
|
22
22
|
attr_accessor :username
|
23
23
|
|
24
|
+
attr_accessor :gateway
|
25
|
+
|
24
26
|
attr_accessor :project_id
|
25
27
|
|
26
28
|
attr_accessor :private_key
|
@@ -29,8 +31,6 @@ module VagrantPlugins
|
|
29
31
|
|
30
32
|
attr_accessor :walltime
|
31
33
|
|
32
|
-
attr_accessor :image_location
|
33
|
-
|
34
34
|
attr_accessor :logger
|
35
35
|
|
36
36
|
attr_accessor :node
|
@@ -39,21 +39,43 @@ module VagrantPlugins
|
|
39
39
|
|
40
40
|
attr_accessor :ports
|
41
41
|
|
42
|
-
|
42
|
+
@@instance = nil
|
43
|
+
|
44
|
+
def self.instance
|
45
|
+
@@instance
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
def initialize(env)
|
50
|
+
# provider specific config
|
51
|
+
@provider_config = env[:machine].provider_config
|
52
|
+
@username = @provider_config.username
|
53
|
+
@project_id = @provider_config.project_id
|
54
|
+
@private_key = @provider_config.private_key
|
55
|
+
@site = @provider_config.site
|
56
|
+
@walltime = @provider_config.walltime
|
57
|
+
@ports = @provider_config.ports
|
58
|
+
@image= @provider_config.image
|
59
|
+
@gateway = @provider_config.gateway
|
60
|
+
# grab the network config of the vm
|
61
|
+
@networks = env[:machine].config.vm.networks
|
62
|
+
# to log to the ui
|
63
|
+
@ui = env[:ui]
|
43
64
|
|
44
|
-
def initialize(args)
|
45
|
-
# initialize
|
46
|
-
args.each do |k,v|
|
47
|
-
instance_variable_set("#{k}", v) unless v.nil?
|
48
|
-
end
|
49
65
|
@logger = Log4r::Logger.new("vagrant::environment")
|
50
|
-
@logger.debug("connecting with #{@username} on site #{@site}")
|
51
66
|
options = {
|
52
67
|
:forward_agent => true
|
53
68
|
}
|
54
69
|
options[:keys] = [@private_key] if !@private_key.nil?
|
55
|
-
gateway
|
56
|
-
|
70
|
+
if @gateway.nil?
|
71
|
+
@logger.debug("connecting with #{@username} on site #{@site}")
|
72
|
+
@session = Net::SSH.start(@site, @username, options)
|
73
|
+
else
|
74
|
+
@logger.debug("connecting with #{@username} on site #{@site} through #{@gateway}")
|
75
|
+
gateway = Net::SSH::Gateway.new(@gateway, @username, options)
|
76
|
+
@session = gateway.ssh(@site, @username, options)
|
77
|
+
end
|
78
|
+
@@instance = self
|
57
79
|
end
|
58
80
|
|
59
81
|
def create_local_working_dir(env)
|
@@ -62,14 +84,16 @@ module VagrantPlugins
|
|
62
84
|
|
63
85
|
def cwd(env)
|
64
86
|
# remote working directory
|
65
|
-
File.join("
|
87
|
+
File.join(".vagrant", @project_id)
|
66
88
|
end
|
67
89
|
|
68
90
|
|
69
91
|
def check_job(job_id)
|
70
92
|
oarstat = exec("oarstat --json")
|
71
93
|
oarstat = JSON.load(oarstat)
|
94
|
+
@logger.debug("Looking for the job id #{job_id} and username #{@username}")
|
72
95
|
r = oarstat.select!{ |k,v| k == job_id and v["owner"] == @username }.values.first
|
96
|
+
@logger.debug(r.inspect)
|
73
97
|
# update the assigned hostname
|
74
98
|
# this will be used to reach the vm
|
75
99
|
if !r.nil?
|
@@ -93,7 +117,7 @@ module VagrantPlugins
|
|
93
117
|
strategy = @image["backing"]
|
94
118
|
file_to_check = ""
|
95
119
|
if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
|
96
|
-
file_to_check = @image[path]
|
120
|
+
file_to_check = @image["path"]
|
97
121
|
else
|
98
122
|
file_to_check = File.join(cwd(env), env[:machine].name.to_s)
|
99
123
|
end
|
@@ -104,17 +128,17 @@ module VagrantPlugins
|
|
104
128
|
strategy = @image["backing"]
|
105
129
|
file_to_check = ""
|
106
130
|
if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
|
107
|
-
file_to_check = @image[
|
131
|
+
file_to_check = @image["rbd"]
|
108
132
|
else
|
109
|
-
file_to_check = File.join(cwd(env), env[:machine].name.to_s)
|
133
|
+
file_to_check = File.join(cwd(env), env[:machine].name.to_s)
|
110
134
|
end
|
111
|
-
exec("(rbd --pool #{@image["pool"]} --id #{@image["id"]} --conf #{@image["conf"]} ls | grep
|
135
|
+
exec("(rbd --pool #{@image["pool"]} --id #{@image["id"]} --conf #{@image["conf"]} ls | grep \"^#{file_to_check}\") || echo \"\"")
|
112
136
|
end
|
113
137
|
|
114
138
|
|
115
139
|
def launch_vm(env)
|
116
140
|
launcher_path = File.join(File.dirname(__FILE__), LAUNCHER_SCRIPT)
|
117
|
-
@ui.info("Launching the VM on
|
141
|
+
@ui.info("Launching the VM on #{@site}")
|
118
142
|
# Checking the subnet job
|
119
143
|
# uploading the launcher
|
120
144
|
launcher_remote_path = File.join(cwd(env), LAUNCHER_SCRIPT)
|
@@ -126,8 +150,8 @@ module VagrantPlugins
|
|
126
150
|
|
127
151
|
args = [drive, net].join(" ")
|
128
152
|
# Submitting a new job
|
129
|
-
|
130
|
-
|
153
|
+
# Getting the job_id as a ruby string
|
154
|
+
job_id = exec("oarsub --json -t allow_classic_ssh -l \"nodes=1,walltime=#{@walltime}\" --name #{env[:machine].name} --checkpoint 60 --signal 12 \"#{launcher_remote_path} #{args}\" | grep \"job_id\"| cut -d':' -f2").gsub(/"/,"").strip
|
131
155
|
|
132
156
|
begin
|
133
157
|
retryable(:on => VagrantPlugins::G5K::Errors::JobNotRunning, :tries => 100, :sleep => 2) do
|
@@ -144,7 +168,7 @@ module VagrantPlugins
|
|
144
168
|
@ui.error("Tired of waiting")
|
145
169
|
raise VagrantPlugins::G5K::Errors::JobNotRunning
|
146
170
|
end
|
147
|
-
@ui.info("VM booted on
|
171
|
+
@ui.info("VM booted on #{@site}")
|
148
172
|
|
149
173
|
end
|
150
174
|
|
@@ -156,7 +180,7 @@ module VagrantPlugins
|
|
156
180
|
|
157
181
|
if @image["pool"].nil?
|
158
182
|
disk = File.join(cwd(env), env[:machine].name.to_s)
|
159
|
-
exec("rm #{disk}")
|
183
|
+
exec("rm -f #{disk}")
|
160
184
|
else
|
161
185
|
disk = File.join(@image["pool"], cwd(env), env[:machine].name.to_s)
|
162
186
|
begin
|
@@ -171,6 +195,12 @@ module VagrantPlugins
|
|
171
195
|
end
|
172
196
|
end
|
173
197
|
|
198
|
+
def close()
|
199
|
+
# Terminate the session
|
200
|
+
@session.close
|
201
|
+
end
|
202
|
+
|
203
|
+
|
174
204
|
|
175
205
|
def exec(cmd)
|
176
206
|
@logger.debug("Executing #{cmd}")
|
@@ -231,12 +261,15 @@ module VagrantPlugins
|
|
231
261
|
def _generate_drive_rbd(env)
|
232
262
|
strategy = @image["backing"]
|
233
263
|
if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
|
234
|
-
file = @image["
|
264
|
+
file = File.join(@image["pool"], @image["rbd"])
|
235
265
|
elsif strategy == STRATEGY_COW
|
236
266
|
file = _rbd_clone_or_copy_image(env, clone = true)
|
237
267
|
elsif strategy == STRATEGY_COPY
|
238
268
|
file = _rbd_clone_or_copy_image(env, clone = false)
|
239
269
|
end
|
270
|
+
# encapsulate the file to a qemu ready disk description
|
271
|
+
file = "rbd:#{file}:id=#{@image["id"]}:conf=#{@image["conf"]}"
|
272
|
+
@logger.debug("Generated drive string : #{file}")
|
240
273
|
return file
|
241
274
|
end
|
242
275
|
|
@@ -253,24 +286,25 @@ module VagrantPlugins
|
|
253
286
|
end
|
254
287
|
|
255
288
|
def _rbd_clone_or_copy_image(env, clone = true)
|
256
|
-
@ui.info("Clone the rbd image")
|
257
289
|
# destination in the same pool under the .vagrant ns
|
258
290
|
destination = File.join(@image["pool"], cwd(env), env[:machine].name.to_s)
|
259
|
-
# Even if nothing will happen when the destination already exist, we should test it before
|
291
|
+
# Even if nothing bad will happen when the destination already exist, we should test it before
|
260
292
|
exists = _check_rbd_local_storage(env)
|
261
293
|
if exists == ""
|
262
294
|
# we create the destination
|
263
295
|
if clone
|
264
296
|
# parent = pool/rbd@snap
|
297
|
+
@ui.info("Cloning the rbd image")
|
265
298
|
parent = File.join(@image["pool"], "#{@image["rbd"]}@#{@image["snapshot"]}")
|
266
299
|
exec("rbd clone #{parent} #{destination} --conf #{@image["conf"]} --id #{@image["id"]}" )
|
267
300
|
else
|
301
|
+
@ui.info("Copying the rbd image (This may take some time)")
|
268
302
|
# parent = pool/rbd@snap
|
269
303
|
parent = File.join(@image["pool"], "#{@image["rbd"]}")
|
270
304
|
exec("rbd cp #{parent} #{destination} --conf #{@image["conf"]} --id #{@image["id"]}" )
|
271
305
|
end
|
272
306
|
end
|
273
|
-
return
|
307
|
+
return destination
|
274
308
|
end
|
275
309
|
|
276
310
|
def _file_clone_or_copy_image(env, clone = true)
|
@@ -292,6 +326,7 @@ module VagrantPlugins
|
|
292
326
|
"hostfwd=tcp::#{p}"
|
293
327
|
end.join(',')
|
294
328
|
net = "-net nic,model=virtio -net user,#{fwd_ports}"
|
329
|
+
@logger.info("Mapping ports")
|
295
330
|
return net
|
296
331
|
end
|
297
332
|
end
|
@@ -1,22 +1,14 @@
|
|
1
1
|
#!/bin/bash
|
2
|
+
|
3
|
+
# This script is borrowed from pmorrillon.
|
4
|
+
# Thanks to him !
|
5
|
+
|
2
6
|
#OAR -l slash_22=1+{virtual!='none'}/nodes=1,walltime=06:00:00
|
3
7
|
#OAR --checkpoint 60
|
4
8
|
#OAR --signal 12
|
5
9
|
|
6
10
|
# Directory for qcow2 snapshots
|
7
11
|
export TMPDIR=/tmp
|
8
|
-
#IMAGE=/grid5000/virt-images/alpine-docker.qcow2
|
9
|
-
|
10
|
-
# GET Virtual IP information
|
11
|
-
IP_ADDR=$(/usr/local/bin/g5k-subnets -im | head -1 | awk '{print $1}')
|
12
|
-
MAC_ADDR=$(/usr/local/bin/g5k-subnets -im | head -1 | awk '{print $2}')
|
13
|
-
|
14
|
-
echo "VM IP informations :"
|
15
|
-
echo "IP address: $IP_ADDR"
|
16
|
-
echo "MAC address: $MAC_ADDR"
|
17
|
-
|
18
|
-
# Create tap
|
19
|
-
TAP=$(sudo create_tap)
|
20
12
|
|
21
13
|
# Memory allocation
|
22
14
|
KEEP_SYSTEM_MEM=1 # Gb
|
@@ -35,7 +27,6 @@ clean_shutdown() {
|
|
35
27
|
trap clean_shutdown 12
|
36
28
|
|
37
29
|
# Launch virtual machine
|
38
|
-
#kvm -m $VM_MEM -smp $SMP -drive file=/grid5000/images/KVM/alpine_docker.qcow2,if=virtio -snapshot -fsdev local,security_model=none,id=fsdev0,path=$HOME -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare -nographic -net nic,model=virtio,macaddr=$MAC_ADDR -net tap,ifname=$TAP,script=no -monitor unix:/tmp/alpine_docker_vm.mon,server,nowait -localtime -enable-kvm &
|
39
30
|
#kvm -m $VM_MEM -smp $SMP -drive file=$IMAGE,if=virtio -snapshot -fsdev local,security_model=none,id=fsdev0,path=$HOME -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare -nographic -net nic,model=virtio,macaddr=$MAC_ADDR -net tap,ifname=$TAP,script=no -monitor unix:/tmp/vagrant-g5k.mon,server,nowait -localtime -enable-kvm &
|
40
31
|
kvm -m $VM_MEM -smp $SMP -fsdev local,security_model=none,id=fsdev0,path=$HOME -device virtio-9p-pci,id=fs0,fsdev=fsdev0,mount_tag=hostshare -nographic -monitor unix:/tmp/vagrant-g5k.mon,server,nowait -localtime -enable-kvm $@ &
|
41
32
|
|
data/lib/vagrant-g5k/version.rb
CHANGED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "vagrant-g5k/config"
|
2
|
+
require 'rspec/its'
|
3
|
+
|
4
|
+
describe VagrantPlugins::G5K::Config do
|
5
|
+
let(:instance) {described_class.new}
|
6
|
+
|
7
|
+
before :each do
|
8
|
+
ENV["USER"] = "user"
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
describe "defaults" do
|
13
|
+
its("project_id"){should == nil}
|
14
|
+
its("site"){should == nil}
|
15
|
+
its("walltime"){should == "01:00:00"}
|
16
|
+
its("username"){should == "user"}
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-g5k
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthieu Simonin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: iniparse
|
@@ -130,6 +130,7 @@ files:
|
|
130
130
|
- lib/vagrant-g5k.rb
|
131
131
|
- lib/vagrant-g5k/.config.rb.swp
|
132
132
|
- lib/vagrant-g5k/action.rb
|
133
|
+
- lib/vagrant-g5k/action/close_g5k.rb
|
133
134
|
- lib/vagrant-g5k/action/connect_g5k.rb
|
134
135
|
- lib/vagrant-g5k/action/create_local_working_dir.rb
|
135
136
|
- lib/vagrant-g5k/action/delete_disk.rb
|
@@ -149,6 +150,7 @@ files:
|
|
149
150
|
- lib/vagrant-g5k/util/launch_vm_fwd.sh
|
150
151
|
- lib/vagrant-g5k/version.rb
|
151
152
|
- locales/en.yml
|
153
|
+
- spec/vagrant-g5k/config_spec.rb
|
152
154
|
- vagrant-g5k.gemspec
|
153
155
|
homepage: https://github.com/msimonin/vagrant-g5k
|
154
156
|
licenses:
|