vagrant-g5k 0.0.9 → 0.0.10

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: 71442ce64f1bd79dfaa907ed185ed54bc24a491e
4
- data.tar.gz: abbd6a67d44e02459384e9900679c8da373286ae
3
+ metadata.gz: 2fe452d0c9d49354e7ab25094dcc73723103d67f
4
+ data.tar.gz: 13f854e214d65d43109608ae487c10f642ba81d8
5
5
  SHA512:
6
- metadata.gz: 0816c3a1356533afbfc5e3e97cb993cd2f745230b8b169ca9389af467755cff47ab6eb1f27586ad3dea297efeff7f089ad8f989494500966cd70c840c32c9fd3
7
- data.tar.gz: fde42765e24413a1fded93e330a5ca7482f932e5b7489e2a25e91dfb14663d4096710243e2db1cef2fab59cb7e6bbd378efd41c10795836e8daff86bab942e02
6
+ metadata.gz: 7bad68ae00e744df6b480825fb5da0fb68eaf981a791cd2a7f5ad4c9f1ce1538ebdd9030de1d8a6e8b7a88f30c3be1b85f253350fe6d5fc4ffd88344c57e2a39
7
+ data.tar.gz: c58fc1ef51ccabb2bb1739608f58e77676f1e46eed5222336d7de5cde8aaeebc6430a5c8d4b3f2f9446344fb4bc4e90082f7268fc1e2e624ace76336b3500c29
data/README.md CHANGED
@@ -26,8 +26,26 @@ $ vagrant up --provider=g5k
26
26
 
27
27
  Check the Vagrantfile.
28
28
 
29
+ ## Note on disk format and backing strategy
30
+
31
+ Virtual Machines can be booted either :
32
+
33
+ * From a `qcow2` image stored in the frontend filesystem
34
+ * From a rbd image stored in one of the ceph cluster of Grid'5000.
35
+
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 :
38
+
39
+ * `copy`: will make a full copy of the image in your home directory (resp. in the same pool as the rbd)
40
+ * `cow`: will create a Copy On write image in your home directory (resp. in the same pool as the rbd)
41
+ * `direct`: will use the image directly (you'll need r/w access to the image)
42
+ * `snapshot`: will let `kvm` create an ephemeral copy on write image.
43
+
29
44
  ## Supported operations
30
45
 
31
- * `vagrant up`
32
- * `vagrant ssh`
33
46
  * `vagrant destroy`
47
+ * `vagrant halt`
48
+ * `vagrant provision`
49
+ * `vagrant ssh`
50
+ * `vagrant status`
51
+ * `vagrant up`
data/Vagrantfile CHANGED
@@ -8,14 +8,22 @@ 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
14
  end
12
15
 
13
16
  # user to log with inside the vm
14
17
  config.ssh.username = "root"
15
18
  # password to use to log inside the vm
16
- config.ssh.password = ""
17
-
19
+ # config.ssh.password = ""
20
+
18
21
  config.vm.provider "g5k" do |g5k|
22
+ # The project id.
23
+ # It is used to generate uniq remote storage for images
24
+ # It must be uniq accros all project managed by vagrant.
25
+ g5k.project_id = "vagrant-g5k"
26
+
19
27
  # user name used to connect to g5k
20
28
  g5k.username = ENV['USER']
21
29
 
@@ -29,19 +37,29 @@ Vagrant.configure(2) do |config|
29
37
  # g5k.walltime = "02:00:00"
30
38
 
31
39
  # image location
32
- g5k.image_location = "/grid5000/virt-images/alpine_docker.qcow2"
40
+ #g5k.image = {
41
+ # "path" => "/grid5000/virt-images/alpine_docker.qcow2",
42
+ # "backing" => "cow"
43
+ #}
33
44
 
34
45
  # it could be backed by the ceph
35
- # g5k.image_location = "rbd:msimonin_rbds/virt/alpine_docker_analyse-090916:id=msimonin:conf=/home/msimonin/.ceph/config"
46
+ g5k.image = {
47
+ "pool" => "msimonin_rbds",
48
+ "rbd" => "bases/alpine_docker",
49
+ "snapshot" => "parent",
50
+ "id" => "$USER",
51
+ "conf" => "$HOME/.ceph/config",
52
+ "backing" => "copy"
53
+ }
36
54
 
37
55
  # g5k.backing_strategy = "snapshot"
38
56
  # this is a copy on write strategy
39
57
  # image_location is use to read, an epehemeral disk will hold the writes
40
58
  # if not specified this means that the image is used in r/w mode.
41
59
  # changes will be persistent
42
- g5k.backing_strategy = "snapshot"
60
+ g5k.backing_strategy = "cow"
43
61
  # ports to expose (at least ssh has to be forwarded)
44
- g5k.ports = ['2222-:22']
62
+ g5k.ports = ['2222-:22','3000-:3000']
45
63
  end
46
64
 
47
65
 
@@ -68,14 +68,14 @@ module VagrantPlugins
68
68
  b.use Call, DestroyConfirm do |env, b2|
69
69
  if env[:result]
70
70
  b2.use ConfigValidate
71
+ b2.use ConnectG5K
71
72
  b2.use Call, IsCreated do |env2, b3|
72
73
  if !env2[:result]
73
74
  b3.use MessageNotCreated
74
75
  next
75
76
  end
76
-
77
- b3.use ConnectG5K
78
77
  b3.use DeleteJob
78
+ b3.use DeleteDisk
79
79
  end
80
80
  else
81
81
  b2.use MessageWillNotDestroy
@@ -84,11 +84,41 @@ module VagrantPlugins
84
84
  end
85
85
  end
86
86
 
87
+ # This action is called to shutdown the remote machine.
88
+ def self.action_halt
89
+ Vagrant::Action::Builder.new.tap do |b|
90
+ b.use ConfigValidate
91
+ b.use ConnectG5K
92
+ b.use Call, IsCreated do |env1, b2|
93
+ if !env1[:result]
94
+ b2.use MessageNotCreated
95
+ next
96
+ end
97
+ b2.use DeleteJob
98
+ end
99
+ end
100
+ end
101
+
102
+ # This action is called when `vagrant provision` is called.
103
+ def self.action_provision
104
+ Vagrant::Action::Builder.new.tap do |b|
105
+ b.use ConfigValidate
106
+ b.use Call, IsCreated do |env, b2|
107
+ if !env[:result]
108
+ b2.use MessageNotCreated
109
+ next
110
+ end
111
+ puts "provision"
112
+ b2.use Provision
113
+ end
114
+ end
115
+ end
87
116
 
88
117
  action_root = Pathname.new(File.expand_path("../action", __FILE__))
89
118
  autoload :ConnectG5K, action_root.join("connect_g5k")
90
119
  autoload :CreateLocalWorkingDir, action_root.join("create_local_working_dir")
91
120
  autoload :DeleteJob, action_root.join("delete_job")
121
+ autoload :DeleteDisk, action_root.join("delete_disk")
92
122
  autoload :IsCreated, action_root.join("is_created")
93
123
  autoload :MessageAlreadyCreated, action_root.join("message_already_created")
94
124
  autoload :MessageNotCreated, action_root.join("message_not_created")
@@ -14,15 +14,18 @@ module VagrantPlugins
14
14
  end
15
15
 
16
16
  def call(env)
17
+ args = {
18
+ :@ui => env[:ui]
19
+ }
20
+ a = env[:machine].provider_config.instance_variables.map do |attr|
21
+ [ attr, env[:machine].provider_config.instance_variable_get(attr)]
22
+ end.to_h
23
+ args.merge!(a)
24
+ #.map do |attr|
25
+ # {attr => env[:machine].provider_config.instance_variable_get(attr)}
26
+ #end
17
27
  env[:g5k_connection] = Connection.new(
18
- :logger => env[:ui],
19
- :username => env[:machine].provider_config.username,
20
- :private_key => env[:machine].provider_config.private_key,
21
- :walltime => env[:machine].provider_config.walltime,
22
- :image_location => env[:machine].provider_config.image_location,
23
- :site => env[:machine].provider_config.site,
24
- :ports => env[:machine].provider_config.ports,
25
- :backing_strategy => env[:machine].provider_config.backing_strategy
28
+ args
26
29
  )
27
30
  @app.call(env)
28
31
  end
@@ -0,0 +1,18 @@
1
+ module VagrantPlugins
2
+ module G5K
3
+ module Action
4
+ class DeleteDisk
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ conn = env[:g5k_connection]
11
+ env[:ui].info("Deleting the associated disk")
12
+ conn.delete_disk(env)
13
+ @app.call(env)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -9,6 +9,7 @@ module VagrantPlugins
9
9
  def call(env)
10
10
  job_id = env[:machine].id
11
11
  conn = env[:g5k_connection]
12
+ env[:ui].info("Deleting the associated job")
12
13
  conn.exec("oardel #{job_id}")
13
14
  @app.call(env)
14
15
  end
@@ -9,7 +9,8 @@ module VagrantPlugins
9
9
  end
10
10
 
11
11
  def call(env)
12
- env[:result] = env[:machine].state.id != :not_created
12
+ state_id = env[:machine].state.id
13
+ env[:result] = state_id == :Running and state_id == :shutdown
13
14
  @app.call(env)
14
15
  end
15
16
  end
@@ -7,7 +7,7 @@ module VagrantPlugins
7
7
  end
8
8
 
9
9
  def call(env)
10
- env[:ui].info("vagrant_g5k.already_status", :status => "created")
10
+ env[:ui].info("vagrant_g5k.already_up", :status => "created")
11
11
  @app.call(env)
12
12
  end
13
13
  end
@@ -12,19 +12,33 @@ module VagrantPlugins
12
12
  end
13
13
 
14
14
  def call(env)
15
- env[:machine_state_id] = read_state(env[:machine], env[:g5k_connection])
15
+ env[:machine_state_id] = read_state(env)
16
16
  @app.call(env)
17
17
  end
18
18
 
19
- def read_state(machine, conn)
20
- return :not_created if machine.id.nil?
21
- # is there a job running for this vm ?
22
- job = conn.check_job(machine.id)
23
- if job.nil? # TODO or fraged
19
+ def read_state(env)
20
+ machine = env[:machine]
21
+ conn = env[:g5k_connection]
22
+ id = machine.id
23
+ local_storage = conn.check_local_storage(env)
24
+ if id.nil? and local_storage.nil?
24
25
  return :not_created
25
26
  end
26
27
 
27
- return job["state"].to_sym
28
+ if id.nil? and not local_storage.nil?
29
+ return :shutdown
30
+ end
31
+
32
+ if not id.nil?
33
+ # is there a job running for this vm ?
34
+ job = conn.check_job(id)
35
+ if job.nil?
36
+ return :not_created
37
+ end
38
+ return job["state"].to_sym
39
+ end
40
+
41
+ return :guru_meditation
28
42
  end
29
43
  end
30
44
  end
@@ -14,6 +14,11 @@ module VagrantPlugins
14
14
  # @return [String]
15
15
  attr_accessor :private_key
16
16
 
17
+ # G5K project_id
18
+ #
19
+ # @return [String]
20
+ attr_accessor :project_id
21
+
17
22
  # G5K walltime
18
23
  #
19
24
  # @return [String]
@@ -23,10 +28,12 @@ module VagrantPlugins
23
28
  #
24
29
  # @return [String]
25
30
  attr_accessor :site
26
- # G5K image location (path)
31
+
32
+ # G5K image
27
33
  #
28
- # @return [String]
29
- attr_accessor :image_location
34
+ # @return [Hash]
35
+ attr_accessor :image
36
+
30
37
 
31
38
  # G5K ports mapping
32
39
  #
@@ -41,11 +48,11 @@ module VagrantPlugins
41
48
  attr_accessor :backing_strategy
42
49
 
43
50
  def initialize()
44
- @username = nil
45
- @image_location = nil
46
- @site = "rennes"
51
+ @username = nil
52
+ @project_id = nil
53
+ @site = "rennes"
47
54
  @backing_strategy = ""
48
- @walltime = "01:00:00"
55
+ @walltime = "01:00:00"
49
56
  end
50
57
 
51
58
  def finalize!()
@@ -57,8 +64,10 @@ module VagrantPlugins
57
64
  errors = _detected_errors
58
65
 
59
66
  errors << "g5k username is required" if @username.nil?
60
- errors << "g5k image_location is required" if @image_location.nil?
67
+ errors << "g5k image is required" if @image.nil?
68
+ errors << "g5k image is required" if @project_id.nil?
61
69
 
70
+ # TODO validate image hash
62
71
  { "G5K Provider" => errors }
63
72
  end
64
73
 
@@ -14,6 +14,12 @@ module VagrantPlugins
14
14
  class JobNotRunning < VagrantG5KError
15
15
  error_key("tired of waiting")
16
16
  end
17
+
18
+ class CommandError < VagrantG5KError
19
+ error_key("remote command error")
20
+ end
21
+
22
+
17
23
  end
18
24
  end
19
25
  end
@@ -24,7 +24,7 @@ module VagrantPlugins
24
24
  Config
25
25
  end
26
26
 
27
- provider(:g5k, parallel: true) do
27
+ provider(:g5k) do
28
28
  # Setup logging and i18n
29
29
  setup_logging
30
30
  setup_i18n
@@ -1,12 +1,16 @@
1
1
  require 'net/ssh/multi'
2
2
  require 'net/scp'
3
3
  require 'json'
4
+ require 'digest'
4
5
 
5
6
  require 'vagrant/util/retryable'
6
7
 
7
- WORKING_DIR = ".vagrant-g5k"
8
8
  LAUNCHER_SCRIPT = "launch_vm_fwd.sh"
9
- JOB_SUBNET_NAME = "vagrant-g5k-subnet"
9
+
10
+ STRATEGY_SNAPSHOT = "snapshot"
11
+ STRATEGY_COPY = "copy"
12
+ STRATEGY_COW = "cow"
13
+ STRATEGY_DIRECT = "direct"
10
14
 
11
15
  module VagrantPlugins
12
16
  module G5K
@@ -17,6 +21,8 @@ module VagrantPlugins
17
21
 
18
22
  attr_accessor :username
19
23
 
24
+ attr_accessor :project_id
25
+
20
26
  attr_accessor :private_key
21
27
 
22
28
  attr_accessor :site
@@ -35,55 +41,32 @@ module VagrantPlugins
35
41
 
36
42
  attr_accessor :backing_strategy
37
43
 
38
- # legacy
39
- @@locations = [
40
- {
41
- :path => "/grid5000/virt-images",
42
- :type => "local"
43
- }
44
- ]
45
-
46
44
  def initialize(args)
47
45
  # initialize
48
46
  args.each do |k,v|
49
- instance_variable_set("@#{k}", v) unless v.nil?
47
+ instance_variable_set("#{k}", v) unless v.nil?
50
48
  end
51
- @logger.info("connecting with #{@username} on site #{@site}")
49
+ @logger = Log4r::Logger.new("vagrant::environment")
50
+ @logger.debug("connecting with #{@username} on site #{@site}")
52
51
  options = {
53
52
  :forward_agent => true
54
53
  }
55
54
  options[:keys] = [@private_key] if !@private_key.nil?
56
55
  gateway = Net::SSH::Gateway.new("access.grid5000.fr", @username, options)
57
-
58
56
  @session = gateway.ssh(@site, @username, options)
59
57
  end
60
58
 
61
- def list_images()
62
- images = []
63
- @@locations.each do |location|
64
- if location[:type] == "local"
65
- stdout = ""
66
- @session.exec!("ls #{location[:path]}/*.qcow2") do |channel, stream, data|
67
- stdout << data
68
- end
69
- images += stdout.split("\n").map{ |i| {:path => i, :type => 'local'} }
70
- #elsif location[:type] == "ceph"
71
- # stdout = ""
72
- # @session.exec!("rbd --pool #{location[:pool]} --conf $HOME/.ceph/config --id #{location[:id]} ls") do |channel, stream, data|
73
- # stdout << data
74
- # end
75
- # images += stdout.split("\n").map{ |i| {:path => i, :type => 'ceph'} }
76
- end
77
- end
78
- images
79
- end
80
-
81
59
  def create_local_working_dir(env)
82
- @session.exec("mkdir -p #{WORKING_DIR}")
60
+ @session.exec("mkdir -p #{cwd(env)}")
61
+ end
62
+
63
+ def cwd(env)
64
+ # remote working directory
65
+ File.join("/home", @username, ".vagrant", @project_id)
83
66
  end
84
67
 
85
68
 
86
- def check_job(job_id)
69
+ def check_job(job_id)
87
70
  oarstat = exec("oarstat --json")
88
71
  oarstat = JSON.load(oarstat)
89
72
  r = oarstat.select!{ |k,v| k == job_id and v["owner"] == @username }.values.first
@@ -95,30 +78,60 @@ module VagrantPlugins
95
78
  return r
96
79
  end
97
80
 
81
+ def check_local_storage(env)
82
+ # Is the disk image already here ?
83
+ if @image["pool"].nil?
84
+ file = _check_file_local_storage(env)
85
+ else
86
+ file = _check_rbd_local_storage(env)
87
+ end
88
+ return file if file != ""
89
+ return nil
90
+ end
91
+
92
+ def _check_file_local_storage(env)
93
+ strategy = @image["backing"]
94
+ file_to_check = ""
95
+ if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
96
+ file_to_check = @image[path]
97
+ else
98
+ file_to_check = File.join(cwd(env), env[:machine].name.to_s)
99
+ end
100
+ exec("[ -f \"#{file_to_check}\" ] && echo #{file_to_check} || echo \"\"")
101
+ end
102
+
103
+ def _check_rbd_local_storage(env)
104
+ strategy = @image["backing"]
105
+ file_to_check = ""
106
+ if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
107
+ file_to_check = @image[path]
108
+ else
109
+ file_to_check = File.join(cwd(env), env[:machine].name.to_s)[1..-1]
110
+ end
111
+ exec("(rbd --pool #{@image["pool"]} --id #{@image["id"]} --conf #{@image["conf"]} ls | grep #{file_to_check}) || echo \"\"")
112
+ end
113
+
114
+
98
115
  def launch_vm(env)
99
116
  launcher_path = File.join(File.dirname(__FILE__), LAUNCHER_SCRIPT)
100
- @logger.info("Launching the VM on Grid'50001")
117
+ @ui.info("Launching the VM on Grid'5000")
101
118
  # Checking the subnet job
102
- @logger.info("Uploading launcher")
103
119
  # uploading the launcher
104
- launcher_remote_path = File.join("/home", @username , WORKING_DIR, LAUNCHER_SCRIPT)
120
+ launcher_remote_path = File.join(cwd(env), LAUNCHER_SCRIPT)
105
121
  upload(launcher_path, launcher_remote_path)
106
122
 
107
123
  # Generate partial arguments for the kvm command
108
- drive = _generate_drive()
124
+ drive = _generate_drive(env)
109
125
  net = _generate_net()
110
- # TODO implement different backing strategy
111
- snapshot_flag = "-snapshot" if @backing_strategy == "snapshot"
112
126
 
113
- args = [drive, net, snapshot_flag].join(" ")
127
+ args = [drive, net].join(" ")
114
128
  # Submitting a new job
115
- @logger.info("Starting a new job")
116
129
  job_id = exec("oarsub -t allow_classic_ssh -l \"{virtual!=\'none\'}/nodes=1,walltime=#{@walltime}\" --name #{env[:machine].name} --checkpoint 60 --signal 12 \"#{launcher_remote_path} #{args}\" | grep OAR_JOB_ID | cut -d '=' -f2").chomp
117
130
 
118
131
 
119
132
  begin
120
133
  retryable(:on => VagrantPlugins::G5K::Errors::JobNotRunning, :tries => 100, :sleep => 2) do
121
- @logger.info("Waiting for the job to be running")
134
+ @ui.info("Waiting for the job to be running")
122
135
  job = check_job(job_id)
123
136
  if job.nil? or job["state"] != "Running"
124
137
  raise VagrantPlugins::G5K::Errors::JobNotRunning
@@ -128,29 +141,150 @@ module VagrantPlugins
128
141
  break
129
142
  end
130
143
  rescue VagrantPlugins::G5K::Errors::JobNotRunning
131
- @logger.error("Tired of waiting")
144
+ @ui.error("Tired of waiting")
132
145
  raise VagrantPlugins::G5K::Errors::JobNotRunning
133
146
  end
134
- @logger.info("VM booted on Grid'5000")
147
+ @ui.info("VM booted on Grid'5000")
148
+
149
+ end
150
+
151
+ def delete_disk(env)
152
+ if [STRATEGY_DIRECT, STRATEGY_SNAPSHOT].include?(@image["backing"])
153
+ @ui.error("Destroy not support for the strategy #{@image["backing"]}")
154
+ return
155
+ end
135
156
 
157
+ if @image["pool"].nil?
158
+ disk = File.join(cwd(env), env[:machine].name.to_s)
159
+ exec("rm #{disk}")
160
+ else
161
+ disk = File.join(@image["pool"], cwd(env), env[:machine].name.to_s)
162
+ begin
163
+ retryable(:on => VagrantPlugins::G5K::Errors::CommandError, :tries => 10, :sleep => 5) do
164
+ exec("rbd rm #{disk} --conf #{@image["conf"]} --id #{@image["id"]}" )
165
+ break
166
+ end
167
+ rescue VagrantPlugins::G5K::Errors::CommandError
168
+ @ui.error("Reach max attempt while trying to remove the rbd")
169
+ raise VagrantPlugins::G5K::Errors::CommandError
170
+ end
171
+ end
136
172
  end
137
173
 
138
174
 
139
175
  def exec(cmd)
140
- @logger.info("Executing #{cmd}")
176
+ @logger.debug("Executing #{cmd}")
141
177
  stdout = ""
142
- @session.exec!(cmd) do |channel, stream, data|
143
- stdout << data
178
+ stderr = ""
179
+ exit_code = 0
180
+ @session.open_channel do |channel|
181
+ channel.exec(cmd) do |ch, success|
182
+ abort "could not execute command" unless success
183
+
184
+ channel.on_data do |c, data|
185
+ stdout << data.chomp
186
+ end
187
+
188
+ channel.on_extended_data do |c, type, data|
189
+ stderr << data.chomp
190
+ end
191
+
192
+ channel.on_request("exit-status") do |c,data|
193
+ exit_code = data.read_long
194
+ end
195
+
196
+ channel.on_close do |c|
197
+ end
198
+ end
144
199
  end
145
- return stdout
200
+ @session.loop
201
+ if exit_code != 0
202
+ @logger.error(:stderr => stderr, :code => exit_code)
203
+ raise VagrantPlugins::G5K::Errors::CommandError
204
+ end
205
+ @logger.debug("Returning #{stdout}")
206
+ stdout
146
207
  end
147
208
 
148
209
  def upload(src, dst)
149
210
  @session.scp.upload!(src, dst)
150
211
  end
151
212
 
152
- def _generate_drive()
153
- return "-drive file=#{@image_location},if=virtio"
213
+ def _generate_drive(env)
214
+ # Depending on the strategy we generate the file location
215
+ # This code smells a bit better
216
+ file = ""
217
+ snapshot = ""
218
+ if @image["backing"] == STRATEGY_SNAPSHOT
219
+ snapshot = "-snapshot"
220
+ end
221
+
222
+ if @image["pool"].nil?
223
+ file = _generate_drive_local(env)
224
+ else
225
+ file = _generate_drive_rbd(env)
226
+ end
227
+
228
+ return "-drive file=#{file},if=virtio #{snapshot}"
229
+ end
230
+
231
+ def _generate_drive_rbd(env)
232
+ strategy = @image["backing"]
233
+ if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
234
+ file = @image["path"]
235
+ elsif strategy == STRATEGY_COW
236
+ file = _rbd_clone_or_copy_image(env, clone = true)
237
+ elsif strategy == STRATEGY_COPY
238
+ file = _rbd_clone_or_copy_image(env, clone = false)
239
+ end
240
+ return file
241
+ end
242
+
243
+ def _generate_drive_local(env)
244
+ strategy = @image["backing"]
245
+ if [STRATEGY_SNAPSHOT, STRATEGY_DIRECT].include?(strategy)
246
+ file = @image["path"]
247
+ elsif strategy == STRATEGY_COW
248
+ file = _file_clone_or_copy_image(env, clone = true)
249
+ elsif strategy == STRATEGY_COPY
250
+ file = _file_clone_or_copy_image(env, clone = false)
251
+ end
252
+ return file
253
+ end
254
+
255
+ def _rbd_clone_or_copy_image(env, clone = true)
256
+ @ui.info("Clone the rbd image")
257
+ # destination in the same pool under the .vagrant ns
258
+ 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
260
+ exists = _check_rbd_local_storage(env)
261
+ if exists == ""
262
+ # we create the destination
263
+ if clone
264
+ # parent = pool/rbd@snap
265
+ parent = File.join(@image["pool"], "#{@image["rbd"]}@#{@image["snapshot"]}")
266
+ exec("rbd clone #{parent} #{destination} --conf #{@image["conf"]} --id #{@image["id"]}" )
267
+ else
268
+ # parent = pool/rbd@snap
269
+ parent = File.join(@image["pool"], "#{@image["rbd"]}")
270
+ exec("rbd cp #{parent} #{destination} --conf #{@image["conf"]} --id #{@image["id"]}" )
271
+ end
272
+ end
273
+ return "rbd:#{destination}:id=#{@image["id"]}:conf=#{@image["conf"]}"
274
+ end
275
+
276
+ def _file_clone_or_copy_image(env, clone = true)
277
+ @ui.info("Clone the file image")
278
+ file = File.join(cwd(env), env[:machine].name.to_s)
279
+ exists = _check_file_local_storage(env)
280
+ if exists == ""
281
+ if clone
282
+ exec("qemu-img create -f qcow2 -b #{@image["path"]} #{file}")
283
+ else
284
+ exec("cp #{@image["path"]} #{file}")
285
+ end
286
+ end
287
+ return file
154
288
  end
155
289
 
156
290
  def _generate_net()
@@ -160,8 +294,6 @@ module VagrantPlugins
160
294
  net = "-net nic,model=virtio -net user,#{fwd_ports}"
161
295
  return net
162
296
  end
163
-
164
-
165
297
  end
166
298
  end
167
299
  end
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module G5K
3
- VERSION = '0.0.9'
3
+ VERSION = '0.0.10'
4
4
  end
5
5
  end
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.9
4
+ version: 0.0.10
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-09-16 00:00:00.000000000 Z
11
+ date: 2016-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: iniparse
@@ -132,6 +132,7 @@ files:
132
132
  - lib/vagrant-g5k/action.rb
133
133
  - lib/vagrant-g5k/action/connect_g5k.rb
134
134
  - lib/vagrant-g5k/action/create_local_working_dir.rb
135
+ - lib/vagrant-g5k/action/delete_disk.rb
135
136
  - lib/vagrant-g5k/action/delete_job.rb
136
137
  - lib/vagrant-g5k/action/is_created.rb
137
138
  - lib/vagrant-g5k/action/message_already_created.rb