vagrant-g5k 0.0.18 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad0d6102f863c7b075de47f50ba049609cfe1e65
4
- data.tar.gz: 1a270477aa940ecbb7a7c8ebd157dff3d93538c7
3
+ metadata.gz: 9e0e51fdb1bc354bce80d807d3b6c7500aa32e61
4
+ data.tar.gz: f326ea37cee6bc501848b8deafda61af85a320a7
5
5
  SHA512:
6
- metadata.gz: 9d9ef4b15f56f29adec942817a882d8206c43318513c90ef7edf328fc64c54fcb86780de718458b01000a163cf842e3f579947821202ecea7d30d3c52b8fa156
7
- data.tar.gz: 904d7279690347ba64ecc12ba41c205d565c2f0dbc5434aff88717c2b7c791a1e93360d585ea1df04eed5076f57e1b8a8ce73b6ab042887d4d4341cb1042607c
6
+ metadata.gz: 0e632af665f7c61884dd62b0a105114fbe3a2896f848d66174cf09a79b394c6d365a04be4431e1c9425391c34a8d94d9e85ead25b516f691ef8950fa5175a2f0
7
+ data.tar.gz: 8a67e80906ff550ed7befb257224cafdc01a613f7bc989889e552b46d4b046758dbb155fade5aca2eca7d3a618f174988255042a8a5f75da5368262b9cb1dd17
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # 0.9.0
2
+
3
+ * Code refactoring :
4
+ * Introduce oar_driver to handle operation involving oar
5
+ * Introduce net_driver to configure the network used by the VMs
6
+ * Introduce disk_driver to configure the disk used by the VMs
7
+
1
8
  # 0.0.18
2
9
 
3
10
  * Fix update_subnet_use when using nat network
data/README.md CHANGED
@@ -68,6 +68,8 @@ config.vm.provider "g5k" do |g5k|
68
68
  end
69
69
  ```
70
70
 
71
+ > Due to the dynamic nature of the subnet reserved on Grid'5000, IPs of the VMs will change accross reboots
72
+
71
73
 
72
74
  ## Supported operations
73
75
 
data/Vagrantfile CHANGED
@@ -17,49 +17,44 @@ Vagrant.configure(2) do |config|
17
17
  g5k.walltime = "01:00:00"
18
18
 
19
19
  # Image backed by the ceph cluster
20
- # g5k.image = {
21
- # "pool" => "msimonin_rbds",
22
- # "rbd" => "bases/alpine_docker",
23
- # "snapshot" => "parent",
24
- # "id" => "$USER",
25
- # "conf" => "$HOME/.ceph/config",
26
- # "backing" => "snapshot"
27
- # }
20
+ g5k.image = {
21
+ :pool => "msimonin_rbds",
22
+ :rbd => "bases/ubuntu1404-9p",
23
+ :snapshot => "parent",
24
+ :id => "$USER",
25
+ :conf => "$HOME/.ceph/config",
26
+ :backing => "copy"
27
+ }
28
28
  #
29
29
  # Image backed on the frontend filesystem
30
- g5k.image = {
31
- "path" => "/grid5000/virt-images/alpine_docker.qcow2",
32
- "backing" => "snapshot"
33
- }
30
+ # g5k.image = {
31
+ # :path => "/grid5000/virt-images/alpine_docker.qcow2",
32
+ # :backing => "copy"
33
+ # }
34
34
 
35
- # g5k.net = {
36
- # "type" => "bridge"
35
+ # g5k.net = {
36
+ # :type => "bridge"
37
37
  # }
38
- g5k.net = {
39
- "type" => "nat",
40
- "ports" => ["2222-:22"]
41
- }
38
+ g5k.net = {
39
+ :type => "nat",
40
+ :ports => ["2222-:22"]
41
+ }
42
42
 
43
43
 
44
44
  # oar selection of resource
45
45
  g5k.oar = "virtual != 'none'"
46
46
  end #g5k
47
47
 
48
- config.vm.define "vm1" do |my|
49
- my.vm.box = "dummy"
50
-
51
- my.ssh.username = "root"
52
- my.ssh.password = ""
53
48
 
54
- end #vm
55
-
56
- # config.vm.define "vm2" do |my|
57
- # my.vm.box = "dummy"
49
+ (1..1).each do |i|
50
+ config.vm.define "vm#{i}" do |my|
51
+ my.vm.box = "dummy"
58
52
 
59
- # my.ssh.username = "root"
60
- # my.ssh.password = ""
53
+ # my.ssh.username = "root"
54
+ # my.ssh.password = ""
61
55
 
62
- # end #vm
56
+ end #vm
57
+ end
63
58
  # Repeat block to define another vm
64
59
  # config.vm.define "vm2" do |my|
65
60
  #
@@ -26,8 +26,6 @@ module VagrantPlugins
26
26
  Vagrant::Action::Builder.new.tap do |b|
27
27
  b.use ConfigValidate
28
28
  b.use ConnectG5K
29
- # read the state to find the enclosing ressource
30
- b.use ReadState
31
29
  b.use ReadSSHInfo
32
30
  end
33
31
  end
@@ -144,7 +142,6 @@ module VagrantPlugins
144
142
 
145
143
  action_root = Pathname.new(File.expand_path("../action", __FILE__))
146
144
  autoload :ConnectG5K, action_root.join("connect_g5k")
147
- autoload :CloseG5K, action_root.join("close_g5k")
148
145
  autoload :CreateLocalWorkingDir, action_root.join("create_local_working_dir")
149
146
  autoload :DeleteJob, action_root.join("delete_job")
150
147
  autoload :DeleteDisk, action_root.join("delete_disk")
@@ -1,6 +1,11 @@
1
1
  require "log4r"
2
- require "vagrant-g5k/util/g5k_utils"
2
+ require "vagrant-g5k/g5k_connection"
3
3
  require "vagrant-g5k/driver"
4
+ require "vagrant-g5k/oar"
5
+ require "vagrant-g5k/network/nat"
6
+ require "vagrant-g5k/network/bridge"
7
+ require "vagrant-g5k/disk/local"
8
+ require "vagrant-g5k/disk/rbd"
4
9
  require 'thread'
5
10
 
6
11
 
@@ -22,8 +27,12 @@ module VagrantPlugins
22
27
  end
23
28
 
24
29
  def call(env)
30
+ cwd = File.join('.vagrant', env[:machine].provider_config.project_id)
25
31
  driver = _get_driver(env)
26
- env[:g5k_connection] = Connection.new(env, driver)
32
+ oar_driver = VagrantPlugins::G5K::Oar.new(env[:ui], driver)
33
+ net_driver = _get_net_driver(env, driver, oar_driver)
34
+ disk_driver = _get_disk_driver(env, cwd, driver)
35
+ env[:g5k_connection] = Connection.new(env, cwd, driver, oar_driver, net_driver, disk_driver)
27
36
  @app.call(env)
28
37
  end
29
38
 
@@ -59,6 +68,28 @@ module VagrantPlugins
59
68
  end
60
69
  return VagrantPlugins::G5K.pool[key]
61
70
  end
71
+
72
+ def _get_net_driver(env, driver, oar_driver)
73
+ net_type = env[:machine].provider_config.net[:type]
74
+ if net_type == "bridge"
75
+ klass = VagrantPlugins::G5K::Network::Bridge
76
+ else
77
+ klass = VagrantPlugins::G5K::Network::Nat
78
+ end
79
+ klass.new(env, driver, oar_driver)
80
+ end
81
+
82
+ def _get_disk_driver(env, cwd, driver)
83
+ image = env[:machine].provider_config.image
84
+ if image[:pool].nil?
85
+ klass = VagrantPlugins::G5K::Disk::Local
86
+ else
87
+ klass = VagrantPlugins::G5K::Disk::RBD
88
+ end
89
+ klass.new(env, cwd, driver)
90
+ end
91
+
92
+
62
93
  end
63
94
  end
64
95
  end
@@ -12,46 +12,27 @@ module VagrantPlugins
12
12
  end
13
13
 
14
14
  def call(env)
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)
15
+ conn = env[:g5k_connection]
16
+ ssh_info = conn.vm_ssh_info(env[:machine].id)
17
+ username = env[:machine].provider_config.username
18
+ gateway = env[:machine].provider_config.gateway
19
+ if !env[:machine].provider_config.gateway.nil?
20
+ ssh_info[:proxy_command] = "ssh #{username}@#{gateway} #{ssh_key(env)} nc %h %p"
28
21
  end
22
+ env[:machine_ssh_info] = ssh_info
23
+
29
24
  @app.call(env)
30
25
  end
31
26
 
32
- def ssh_key(conn)
33
- if conn.private_key.nil?
27
+ def ssh_key(env)
28
+ private_key = env[:machine].provider_config.private_key
29
+ if private_key.nil?
34
30
  ""
35
31
  else
36
- "-i #{conn.private_key}"
37
- end
38
- end
39
-
40
-
41
- def read_ssh_info(conn, machine, ssh_fwd = nil)
42
- return nil if machine.id.nil?
43
-
44
- ssh_info = {
45
- :host => conn.node,
46
- }
47
-
48
- ssh_info[:port] = ssh_fwd unless ssh_fwd.nil?
49
-
50
- if !conn.gateway.nil?
51
- ssh_info[:proxy_command] = "ssh #{conn.username}@#{conn.gateway} #{ssh_key(conn)} nc %h %p"
32
+ "-i #{private_key}"
52
33
  end
53
- return ssh_info
54
34
  end
35
+
55
36
  end
56
37
  end
57
38
  end
@@ -20,7 +20,7 @@ module VagrantPlugins
20
20
  machine = env[:machine]
21
21
  conn = env[:g5k_connection]
22
22
  id = machine.id
23
- local_storage = conn.check_local_storage(env)
23
+ local_storage = conn.check_storage(env)
24
24
  if id.nil? and local_storage.nil?
25
25
  return :not_created
26
26
  end
@@ -35,13 +35,9 @@ module VagrantPlugins
35
35
  if job.nil?
36
36
  return :not_created
37
37
  end
38
- if env[:machine].provider_config.net["type"] == "bridge"
39
- # is the subnet still there ?
40
- subnet_id = conn._find_subnet(id)
41
- if subnet_id.nil?
42
- return :subnet_missing
43
- end
44
- end
38
+
39
+ net_state = conn.check_net(id)
40
+ return net_state.to_sym unless net_state.nil?
45
41
 
46
42
  return job["state"].to_sym
47
43
  end
@@ -1,5 +1,5 @@
1
1
  require 'net/ssh/multi'
2
- require 'vagrant-g5k/util/g5k_utils'
2
+ require 'vagrant-g5k/util/g5k_connection'
3
3
  include Process
4
4
 
5
5
  module VagrantPlugins
@@ -15,7 +15,7 @@ module VagrantPlugins
15
15
  # TODO
16
16
  options = {}
17
17
  opts = OptionParser.new do |o|
18
- o.banner = 'Usage: vagrant g(k [vm-name]'
18
+ o.banner = 'Usage: vagrant g5k [vm-name]'
19
19
  o.separator ''
20
20
  o.version = VagrantPlugins::G5K::VERSION
21
21
  o.program_name = 'vagrant g5k'
@@ -60,8 +60,8 @@ module VagrantPlugins
60
60
  @walltime = "01:00:00"
61
61
  @oar = ""
62
62
  @net = {
63
- 'type' => 'nat',
64
- 'ports' => ['2222-,22']
63
+ :type => 'nat',
64
+ :ports => ['2222-:22']
65
65
  }
66
66
  end
67
67
 
@@ -77,7 +77,8 @@ module VagrantPlugins
77
77
  errors << "g5k site is required" if @site.nil?
78
78
  errors << "g5k image is required" if @image.nil?
79
79
  errors << "g5k image must be a Hash" if !@image.is_a?(Hash)
80
-
80
+ errors << "g5k net must be a Hash" if !@net.is_a?(Hash)
81
+
81
82
  { "G5K Provider" => errors }
82
83
  end
83
84
 
@@ -0,0 +1,68 @@
1
+ require 'log4r'
2
+
3
+ module VagrantPlugins
4
+ module G5K
5
+ module Disk
6
+
7
+ class Local
8
+
9
+ def initialize(env, cwd, driver)
10
+ @logger = Log4r::Logger.new("vagrant::network::nat")
11
+ # command driver is unused
12
+ @cwd = cwd
13
+ @driver = driver
14
+ @env = env
15
+ @image = env[:machine].provider_config.image
16
+ @project_id = env[:machine].provider_config.project_id
17
+ @ui = env[:ui]
18
+ end
19
+
20
+ def generate_drive()
21
+ strategy = @image[:backing]
22
+ if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
23
+ file = @image[:path]
24
+ elsif strategy == STRATEGY_COW
25
+ file = _clone_or_copy_image(clone = true)
26
+ elsif strategy == STRATEGY_COPY
27
+ file = _clone_or_copy_image(clone = false)
28
+ end
29
+ return file
30
+ end
31
+
32
+ def check_storage()
33
+ strategy = @image[:backing]
34
+ file_to_check = ""
35
+ if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
36
+ file_to_check = @image[:path]
37
+ else
38
+ file_to_check = File.join(@cwd, @env[:machine].name.to_s)
39
+ end
40
+ @driver.exec("[ -f \"#{file_to_check}\" ] && echo #{file_to_check} || echo \"\"")
41
+ end
42
+
43
+ def delete_disk()
44
+ disk = File.join(@cwd, @env[:machine].name.to_s)
45
+ @driver.exec("rm -f #{disk}")
46
+ end
47
+
48
+ def _clone_or_copy_image( clone = true)
49
+ @ui.info("Clone the file image")
50
+ file = File.join(@cwd, @env[:machine].name.to_s)
51
+ exists = check_storage()
52
+ if exists == ""
53
+ if clone
54
+ @driver.exec("qemu-img create -f qcow2 -b #{@image[:path]} #{file}")
55
+ else
56
+ @driver.exec("cp #{@image[:path]} #{file}")
57
+ end
58
+ end
59
+ return file
60
+ end
61
+
62
+
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+
@@ -0,0 +1,92 @@
1
+ require 'log4r'
2
+
3
+ module VagrantPlugins
4
+ module G5K
5
+ module Disk
6
+
7
+ class RBD
8
+
9
+ include Vagrant::Util::Retryable
10
+
11
+ def initialize(env, cwd, driver)
12
+ @logger = Log4r::Logger.new("vagrant::network::nat")
13
+ # command driver is unused
14
+ @cwd = cwd
15
+ @driver = driver
16
+ @env = env
17
+ @image = env[:machine].provider_config.image
18
+ @project_id = env[:machine].provider_config.project_id
19
+ @ui = env[:ui]
20
+ end
21
+
22
+ def generate_drive()
23
+ strategy = @image[:backing]
24
+ @logger.debug(@image)
25
+ if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
26
+ @logger.debug(@image)
27
+ file = File.join(@image[:pool], @image[:rbd])
28
+ @logger.debug(file)
29
+ elsif strategy == STRATEGY_COW
30
+ file = _clone_or_copy_image(clone = true)
31
+ elsif strategy == STRATEGY_COPY
32
+ file = _clone_or_copy_image(clone = false)
33
+ end
34
+ # encapsulate the file to a qemu ready disk description
35
+ file = "rbd:#{file}:id=#{@image[:id]}:conf=#{@image[:conf]}:rbd_cache=true,cache=writeback"
36
+ @logger.debug("Generated drive string : #{file}")
37
+ return file
38
+ end
39
+
40
+ def check_storage()
41
+ strategy = @image[:backing]
42
+ file_to_check = ""
43
+ if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
44
+ file_to_check = @image[:rbd]
45
+ else
46
+ file_to_check = File.join(@cwd, @env[:machine].name.to_s)
47
+ end
48
+ @driver.exec("(rbd --pool #{@image[:pool]} --id #{@image[:id]} --conf #{@image[:conf]} ls | grep \"^#{file_to_check}$\") || echo \"\"")
49
+ end
50
+
51
+ def delete_disk()
52
+ disk = File.join(@image[:pool], @cwd, @env[:machine].name.to_s)
53
+ begin
54
+ retryable(:on => VagrantPlugins::G5K::Errors::CommandError, :tries => 10, :sleep => 5) do
55
+ @driver.exec("rbd rm #{disk} --conf #{@image[:conf]} --id #{@image[:id]}" )
56
+ break
57
+ end
58
+ rescue VagrantPlugins::G5K::Errors::CommandError
59
+ @ui.error("Reach max attempt while trying to remove the rbd")
60
+ raise VagrantPlugins::G5K::Errors::CommandError
61
+ end
62
+ end
63
+
64
+
65
+
66
+ def _clone_or_copy_image(clone = true)
67
+ # destination in the same pool under the .vagrant ns
68
+ destination = File.join(@image[:pool], @cwd, @env[:machine].name.to_s)
69
+ # Even if nothing bad will happen when the destination already exist, we should test it before
70
+ exists = check_storage()
71
+ if exists == ""
72
+ # we create the destination
73
+ if clone
74
+ # parent = pool/rbd@snap
75
+ @ui.info("Cloning the rbd image")
76
+ parent = File.join(@image[:pool], "#{@image[:rbd]}@#{@image[:snapshot]}")
77
+ @driver.exec("rbd clone #{parent} #{destination} --conf #{@image[:conf]} --id #{@image[:id]}" )
78
+ else
79
+ @ui.info("Copying the rbd image (This may take some time)")
80
+ # parent = pool/rbd@snap
81
+ parent = File.join(@image[:pool], "#{@image[:rbd]}")
82
+ @driver.exec("rbd cp #{parent} #{destination} --conf #{@image[:conf]} --id #{@image[:id]}" )
83
+ end
84
+ end
85
+ return destination
86
+ end
87
+
88
+
89
+ end
90
+ end
91
+ end
92
+ end