vagrant-g5k 0.0.10 → 0.0.11
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 +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:
|