vagrant-g5k 0.0.9 → 0.0.10

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 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