chef-provisioning-opennebula 0.3.4 → 0.4.3

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: 83946a6cacda760aea3647d4a9d7ca929da411be
4
- data.tar.gz: f6c1ae25e0f01c63048bfe38f7721932b4483961
3
+ metadata.gz: 8609a2bdd368fd8004c7451eec93e7f4801cae99
4
+ data.tar.gz: bb88358b632d8f75e45ed1d3e6f0719302428499
5
5
  SHA512:
6
- metadata.gz: a63666bb3a258be1fb452934670697170d7cb4e3bfbae8769a0ac810fb5c855f6dc0dcbabc041d3b0997c93b5df86695714f9dfddd86a8f79de7f70b006b4528
7
- data.tar.gz: a1d9bb1a0b235c0659c3f7373d4805bf03a93b3d3c741cf7123534e634ffd2ab5435a507c75d3e216ac9eac8eae052783e44ee83919c5f0b03bb0c438c0fe7d6
6
+ metadata.gz: 0c6633a838fb95a2d98183088b7e1c64939cf1efd4f5f161937dd74fd46472b4fb4a15ef6127be71ce0a039d3397b3f534b755cfcebbfedb60608fd3327ae31e
7
+ data.tar.gz: 6932c9456a158bd2b32a805462b25037f54889399e1941779e8a2f17e08f8846195066701d37a55f46280728519506a687e4d0040113868b556527735d754379
data/README.md CHANGED
@@ -45,27 +45,6 @@ A sample one_config file would look like this:
45
45
  }
46
46
  ```
47
47
 
48
- If no profile is specified the driver will attempt to read and use the ```ENV['ONE_AUTH']``` file or ```~/.one/one_auth``` or ```/var/lib/one/.one/one_auth```.
49
- The driver is still backward compatible with previous format and passing ```:secret_file``` or ```:credentials``` in```:driver_options```.
50
-
51
- Additional options to OpenNebual client can be passed vi ```:one_options```.
52
-
53
- ```ruby
54
- with_driver "opennebula:http://1.2.3.4/endpoint:port",
55
- :credentials => "<username>:<text_password>",
56
- :one_options => { :timeout => 3 }
57
- ```
58
-
59
- or
60
-
61
- ```ruby
62
- with_driver "opennebula:http://1.2.3.4/endpoint:port",
63
- :secret_file => "<local_path_to_file_with_credentials>",
64
- :one_options => { :timeout => 3 }
65
- ```
66
-
67
- If additional OpenNebula client options need to be passed they can be specified as a hash ```:one_options => {}```.
68
-
69
48
  In context of OpenNebula ```machine``` resource will take the following additional options:
70
49
 
71
50
  ```ruby
@@ -76,12 +55,13 @@ machine_options {
76
55
  :template_name => String name of the OpenNebula template to use
77
56
  :template_id => Integer id of the OpenNebula template to use
78
57
  :template_options => Hash values to be merged with VM template
79
- :enforce_chef_fqdn => [TrueClass, FalseClass] flag indicating if fqdn names should be used for machine names
80
58
  :is_shutdown => [TrueClass, FalseClass] call vm.shutodwn instead of vm.stop during :stop action
81
59
  :shutdown_hard => [TrueClass, FalseClass] flag indicating hard or soft shutdown
60
+ :mode => String octed to set permissions to the machine
82
61
  },
83
62
  :sudo => true,
84
63
  :ssh_username => 'local',
64
+ :ssh_gateway => 'gary@myproxy.net',
85
65
  :ssh_options => {
86
66
  Hash containing SSH options as specified by net-ssh gem
87
67
  please see https://github.com/net-ssh/net-ssh for all options
@@ -91,9 +71,16 @@ machine_options {
91
71
  :keys => [ File.open(File.expand_path('~/.ssh/id_rsa_new')).read ]
92
72
  :keys_only => false,
93
73
  :forward_agent => true,
74
+ :proxy => 'ssh myproxy.net nc %h %p',
94
75
  :use_agent => true,
95
76
  :user_known_hosts_file => '/dev/null'
96
77
  }
78
+ :vm_name => [Symbol, String] Change how the machine shows up in OpenNebula UI and CLI tools.
79
+ Use :short to rename the machine to the short hostname.
80
+ Use a string to rename the machine to an arbitrary name.
81
+ Note this does not change the hostname of the machine, it
82
+ simply renames the VM in OpenNebula.
83
+ :connection_timeout => [Integer] max wait time to establish connection
97
84
  }
98
85
  ```
99
86
 
@@ -109,6 +96,7 @@ This resource will allow to create and delete OpenNebula templates.
109
96
  ```ruby
110
97
  :template => Hash defining OpenNebula template
111
98
  :template_file => String location of the VM template file
99
+ :mode => String octet to set permissions
112
100
  ```
113
101
 
114
102
  ### Actions
@@ -201,6 +189,8 @@ This resource will manage images within OpenNebula.
201
189
  :driver => String Image driver eq. 'qcow2'
202
190
  :machine_id => [String, Integer] id of the machine (VM) for disk attach
203
191
  :disk_id => [String, Integer] id or name of the disk to attach/snapshot
192
+ :mode => String octet to set permissions
193
+ :http_port => Integer port number to start local HTTP server at, for :image_file uploads. Default: 8066
204
194
  ```
205
195
 
206
196
  ### Actions
@@ -272,20 +262,31 @@ one_image "snapshot-img" do
272
262
  end
273
263
  ```
274
264
 
275
- #### 6. Upload a local qcow2 image file to OpenNebula
265
+ #### 6. Upload a local qcow2 image file to OpenNebula, starting HTTP server on port 4567
276
266
 
277
267
  ```ruby
278
- one_image "snapshot-img" do
268
+ one_image "upload-img" do
279
269
  datastore_id 103
280
270
  image_file "/local/path/to/qcow/image/file"
281
271
  img_driver "qcow2"
282
272
  type "OS"
273
+ http_port 4567
283
274
  description "This is my cool qcow image"
284
275
  action :upload
285
276
  end
286
277
  ```
287
278
 
288
- #### 7. Download a 'boggi-test-img' and store it in /home/local/my-image.qcow2. Download URL read from ENV[ONE_DOWNLOAD] variable. It will be stored locally in Chef::Config[:file_cache_path]/boggi-test-img.qcow2.
279
+ #### 7. Upload a qcow2 image file residing on a different host to OpenNebula
280
+
281
+ ```ruby
282
+ one_image "upload-img" do
283
+ datastore_id 103
284
+ download_url "http://my.image.host/path/to/qcow/image/file"
285
+ action :upload
286
+ end
287
+ ```
288
+
289
+ #### 8. Download a 'boggi-test-img' and store it in /home/local/my-image.qcow2. Download URL is read from ENV[ONE_DOWNLOAD] variable. It will be stored locally in Chef::Config[:file_cache_path]/boggi-test-img.qcow2.
289
290
 
290
291
  ```ruby
291
292
  one_image "boggi-test-img" do
@@ -293,7 +294,7 @@ one_image "boggi-test-img" do
293
294
  end
294
295
  ```
295
296
 
296
- #### 8. Download image ID 12345 and store it in /tmp/image.qcow2.
297
+ #### 9. Download image ID 12345 and store it in /tmp/image.qcow2.
297
298
 
298
299
  ```ruby
299
300
  one_image "boggi-test-img" do
@@ -319,6 +320,7 @@ This resource will allow to create and delete OpenNebula vnets.
319
320
  :mac_ip => String ip or mac address
320
321
  :template_file => String local file containing the template of a new vnet
321
322
  :cluster_id => Integer cluster in which to create a vnet
323
+ :mode => String octet to set permissions
322
324
  ```
323
325
 
324
326
  ### Actions
@@ -507,24 +509,21 @@ example:
507
509
 
508
510
  ## <a name="authors"></a> Authors
509
511
 
510
- Created by [Bogdan Buczynski][author] (<bbuczynski@blackberry.com>)
512
+ Created by [Bogdan Buczynski](https://github.com/bbuczynski) (<pikus1@gmail.com>)
511
513
 
512
514
  ## <a name="maintainers"></a> Maintainers
513
515
 
514
516
  Maintained by
515
- * [Bogdan Buczynski][author] (<bbuczynski@blackberry.com>)
516
- * [Philip Oliva][maintainer] (<philoliva8@gmail.com>)
517
- * [Andrew J. Brown][maintainer] (<anbrown@blackberry.com>)
518
- * [Evgeny Yurchenko][maintainer] (<eyurchenko@blackberry.com>)
517
+ * [Andrew J. Brown](https://github.com/andrewjamesbrown) (<anbrown@blackberry.com>)
518
+ * [Bogdan Buczynski](https://github.com/bbuczynski) (<pikus1@gmail.com>)
519
+ * [Dongyu 'Gary' Zheng](https://github.com/dongyuzheng) (<garydzheng@gmail.com>)
520
+ * [Evgeny Yurchenko](https://github.com/EYurchenko) (<eyurchenko@blackberry.com>)
521
+ * [Phil Oliva](https://github.com/poliva83) (<philoliva8@gmail.com>)
519
522
 
520
523
  ## <a name="license"></a> License
521
524
 
522
525
  Apache 2.0 (see [LICENSE][license])
523
526
 
524
- [author]: https://github.com/bbuczynski
525
- [maintainer]: https://github.com/poliva83
526
- [maintainer]: https://github.com/andrewjamesbrown
527
- [maintainer]: https://github.com/EYurchenko
528
527
  [issues]: https://github.com/blackberry/chef-provisioning-opennebula/issues
529
528
  [license]: https://github.com/blackberry/chef-provisioning-opennebula/blob/master/LICENSE
530
529
  [repo]: https://github.com/blackberry/chef-provisioning-opennebula
@@ -43,7 +43,7 @@ class Chef
43
43
 
44
44
  def exists?
45
45
  new_driver = driver
46
- @image = new_driver.one.get_resource('img', :name => new_resource.name)
46
+ @image = new_driver.one.get_resource(:image, :name => @new_resource.name)
47
47
  !@image.nil?
48
48
  end
49
49
 
@@ -56,14 +56,15 @@ class Chef
56
56
 
57
57
  action_handler.perform_action "allocated image '#{new_resource.name}'" do
58
58
  @image = new_driver.one.allocate_img(
59
- new_resource.name,
60
- new_resource.size,
61
- new_resource.datastore_id,
62
- new_resource.type || 'OS',
63
- new_resource.fs_type || 'ext2',
64
- new_resource.img_driver || 'qcow2',
65
- new_resource.prefix || 'vd',
66
- new_resource.persistent || false)
59
+ :name => new_resource.name,
60
+ :size => new_resource.size,
61
+ :datastore_id => new_resource.datastore_id,
62
+ :type => new_resource.type || 'OS',
63
+ :fs_type => new_resource.fs_type || 'ext2',
64
+ :driver => new_resource.img_driver || 'qcow2',
65
+ :prefix => new_resource.prefix || 'vd',
66
+ :persistent => new_resource.persistent || false)
67
+ new_driver.one.chmod_resource(@image, new_resource.mode)
67
68
  Chef::Log.info("Image '#{new_resource.name}' allocate in initial state #{@image.state_str}")
68
69
  @new_resource.updated_by_last_action(true)
69
70
  end
@@ -91,7 +92,7 @@ class Chef
91
92
  action_handler.perform_action "deleted image '#{new_resource.name}'" do
92
93
  rc = @image.delete
93
94
  fail "Failed to delete image '#{new_resource.name}' : #{rc.message}" if OpenNebula.is_error?(rc)
94
- until new_driver.one.get_resource('img', :name => new_resource.name).nil?
95
+ until new_driver.one.get_resource(:image, :name => new_resource.name).nil?
95
96
  Chef::Log.debug("Waiting for delete image to finish...")
96
97
  sleep 1
97
98
  end
@@ -106,8 +107,8 @@ class Chef
106
107
  fail "Missing attribute 'machine_id'" unless new_resource.machine_id
107
108
  fail "Failed to attach disk - image '#{new_resource.name}' does not exist" unless exists?
108
109
 
109
- vm = new_driver.one.get_resource('vm', new_resource.machine_id.is_a?(Integer) ? :id : :name => new_resource.machine_id)
110
- fail "Failed to attach disk - VM '#{new_resource.machine}' does not exist" if vm.nil?
110
+ vm = new_driver.one.get_resource(:virtualmachine, new_resource.machine_id.is_a?(Integer) ? :id : :name => new_resource.machine_id)
111
+ fail "Failed to attach disk - VM '#{new_resource.machine_id}' does not exist" if vm.nil?
111
112
  action_handler.perform_action "attached disk #{new_resource.name} to #{vm.name}" do
112
113
  disk_hash = @image.to_hash
113
114
  disk_tpl = "DISK = [ "
@@ -133,16 +134,16 @@ class Chef
133
134
  action :snapshot do
134
135
  fail "Missing attribute 'machine_id'" unless new_resource.machine_id
135
136
  fail "snapshot '#{new_resource.name}' already exists" if exists?
136
- vm = new_driver.one.get_resource('vm', new_resource.machine_id.is_a?(Integer) ? :id : :name => new_resource.machine_id)
137
+ vm = new_driver.one.get_resource(:virtualmachine, new_resource.machine_id.is_a?(Integer) ? :id : :name => new_resource.machine_id)
137
138
  fail "Failed to create snapshot - VM '#{new_resource.machine_id}' does not exist" if vm.nil?
138
139
  action_handler.perform_action "created snapshot from '#{new_resource.machine_id}'" do
139
140
  disk_id = new_resource.disk_id.is_a?(Integer) ? new_resource.disk_id : new_driver.one.get_disk_id(vm, new_resource.disk_id)
140
141
  fail "No disk '#{new_resource.disk_id}' found on '#{vm.name}'" if disk_id.nil?
141
-
142
- @image = vm.disk_snapshot(disk_id, new_resource.name, "", true)
142
+ @image = new_driver.one.version_ge_4_14 ? vm.disk_saveas(disk_id, new_resource.name) : vm.disk_snapshot(disk_id, new_resource.name, "", true)
143
143
  fail "Failed to create snapshot '#{new_resource.name}': #{@image.message}" if OpenNebula.is_error?(@image)
144
144
 
145
145
  @image = new_driver.one.wait_for_img(new_resource.name, @image)
146
+ new_driver.one.chmod_resource(image, new_resource.mode)
146
147
  if new_resource.persistent
147
148
  action_handler.report_progress "make image '#{new_resource.name}' persistent"
148
149
  @image.persistent
@@ -153,47 +154,67 @@ class Chef
153
154
 
154
155
  action :upload do
155
156
  fail "'datastore_id' is required" unless new_resource.datastore_id
156
- fail "'image_file' is required" unless new_resource.image_file
157
- fail "image_file #{new_resource.image_file} does not exist" unless ::File.exist? new_resource.image_file
157
+ fail "'image_file' or 'download_url' attribute is required" unless new_resource.image_file || new_resource.download_url
158
158
 
159
- file_url = "http://#{node['ipaddress']}/#{::File.basename(@new_resource.image_file)}"
160
- description = @new_resource.description || "#{@new_resource.name} image"
161
- image_driver = @new_resource.img_driver || 'qcow2'
159
+ file_url = nil
160
+ if new_resource.image_file
161
+ fail "image_file #{new_resource.image_file} does not exist" unless ::File.exist? new_resource.image_file
162
+ file_url = "http://#{node['ipaddress']}:#{@new_resource.http_port}/#{::File.basename(@new_resource.image_file)}"
163
+ else
164
+ file_url = new_resource.download_url
165
+ end
166
+ image_config = {
167
+ :name => @new_resource.name,
168
+ :datastore_id => @new_resource.datastore_id.to_s,
169
+ :path => file_url,
170
+ :driver => @new_resource.img_driver || 'qcow2',
171
+ :description => @new_resource.description || "#{@new_resource.name} image",
172
+ :type => @new_resource.type,
173
+ :mode => @new_resource.mode,
174
+ :prefix => @new_resource.prefix,
175
+ :persistent => @new_resource.persistent,
176
+ :public => @new_resource.public,
177
+ :target => @new_resource.target,
178
+ :disk_type => @new_resource.disk_type,
179
+ :source => @new_resource.source,
180
+ :size => @new_resource.size,
181
+ :fs_type => @new_resource.fs_type
182
+ }
162
183
 
163
184
  if exists?
164
- if @image.name == @new_resource.name &&
165
- @image['PATH'] == file_url &&
166
- @image['TEMPLATE/DRIVER'] == image_driver &&
167
- @image['TEMPLATE/DESCRIPTION'] == description &&
168
- @image['DATASTORE_ID'] == @new_resource.datastore_id.to_s
185
+ if @image.name == image_config[:name] &&
186
+ @image['PATH'] == image_config[:path] &&
187
+ @image['TEMPLATE/DRIVER'] == image_config[:driver] &&
188
+ @image['TEMPLATE/DESCRIPTION'] == image_config[:description] &&
189
+ @image['DATASTORE_ID'] == image_config[:datastore_id]
169
190
  action_handler.report_progress("image '#{@new_resource.name}' (ID: #{@image.id}) already exists - nothing to do")
170
191
  else
171
192
  fail "image '#{new_resource.name}' already exists, but it is not the same image"
172
193
  end
173
194
  else
174
- action_handler.perform_action "upload image '#{@new_resource.image_file}'" do
175
- begin
176
- pid = Process.spawn("sudo python -m SimpleHTTPServer 80", :chdir => ::File.dirname(@new_resource.image_file), STDOUT => "/dev/null", STDERR => "/dev/null", :pgroup => true)
177
- fail "Failed to start 'SimpleHTTPServer'" if pid.nil?
178
- new_driver.one.upload_img(
179
- @new_resource.name,
180
- @new_resource.datastore_id,
181
- file_url,
182
- image_driver,
183
- description,
184
- @new_resource.type,
185
- @new_resource.prefix,
186
- @new_resource.persistent,
187
- @new_resource.public,
188
- @new_resource.target,
189
- @new_resource.disk_type,
190
- @new_resource.source,
191
- @new_resource.size,
192
- @new_resource.fs_type)
193
-
195
+ action_handler.perform_action "upload image '#{@new_resource.name}'" do
196
+ if @new_resource.image_file
197
+ begin
198
+ success = false
199
+ pid = nil
200
+ trap("CLD") do
201
+ cpid = Process.wait
202
+ fail "Could not start HTTP server on port #{@new_resource.http_port}" if cpid == pid && !success
203
+ end
204
+ pid = Process.spawn("python -m SimpleHTTPServer #{@new_resource.http_port}",
205
+ :chdir => ::File.dirname(@new_resource.image_file),
206
+ STDOUT => "/dev/null",
207
+ STDERR => "/dev/null",
208
+ :pgroup => true)
209
+ new_driver.one.upload_img(image_config)
210
+ success = true
211
+ @new_resource.updated_by_last_action(true)
212
+ ensure
213
+ system("sudo kill -9 -#{pid}")
214
+ end
215
+ else
216
+ new_driver.one.upload_img(image_config)
194
217
  @new_resource.updated_by_last_action(true)
195
- ensure
196
- system("sudo kill -9 -#{pid}")
197
218
  end
198
219
  end
199
220
  end
@@ -208,7 +229,7 @@ class Chef
208
229
  You can get the value for 'download_url' by loging into your OpenNebula CLI
209
230
  and reading the ONE_DOWNLOAD environment variable) if download_url.nil?
210
231
  # You can get the value for 'download_url' by loging into your OpenNebula CLI and reading the ONE_DOWNLOAD environment variable" if download_url.nil?
211
- image = new_driver.one.get_resource('img', !@new_resource.image_id.nil? ? { :id => @new_resource.image_id } : { :name => @new_resource.name })
232
+ image = new_driver.one.get_resource(:image, !@new_resource.image_id.nil? ? { :id => @new_resource.image_id } : { :name => @new_resource.name })
212
233
  fail "Image 'NAME: #{@new_resource.name}/ID: #{@new_resource.image_id}' does not exist" if image.nil?
213
234
  local_path = @new_resource.image_file || ::File.join(Chef::Config[:file_cache_path], "#{@new_resource.name}.qcow2")
214
235
  fail "Will not overwrite an existing file: #{local_path}" if ::File.exist?(local_path)
@@ -1,4 +1,4 @@
1
- # Copyright 2015, BlackBerry, Inc.
1
+ # Copyright 2015, BlackBerry, Ltd.
2
2
  #
3
3
  # Licensed under the Apache License, Version 2.0 (the "License");
4
4
  # you may not use this file except in compliance with the License.
@@ -28,67 +28,145 @@ class Chef
28
28
 
29
29
  provides :one_template
30
30
 
31
- attr_reader :template
31
+ attr_reader :uname
32
+ attr_reader :equal_template
33
+ attr_reader :equal_mode
34
+ attr_reader :current_id
32
35
 
33
36
  def whyrun_supported?
34
37
  true
35
38
  end
36
39
 
37
40
  def load_current_resource
38
- end
41
+ driver = self.driver
42
+ @uname = uname
43
+ @current_resource = Chef::Resource::OneTemplate.new(new_resource.name,
44
+ run_context)
45
+ @current_resource.name(new_resource.name)
46
+ template = driver.one.get_resource(:template,
47
+ :name => @current_resource.name,
48
+ :uname => @uname)
49
+ @current_resource.exists = !template.nil?
39
50
 
40
- def action_handler
41
- @action_handler ||= Chef::Provisioning::ChefProviderActionHandler.new(self)
42
- end
51
+ return unless @current_resource.exists
52
+
53
+ new_resource_template = @new_resource.template_file.nil? ?
54
+ @new_resource.template :
55
+ driver.one.template_from_file(@new_resource.template_file)
43
56
 
44
- def exists?
45
- new_driver = driver
46
- @template = new_driver.one.get_resource('tpl', :name => new_resource.name)
47
- !@template.nil?
57
+ @current_id = template.to_hash['VMTEMPLATE']['ID'].to_i
58
+ @current_resource.template(template.to_hash['VMTEMPLATE']['TEMPLATE'])
59
+ @current_resource.mode(get_mode(template))
60
+ @equal_template = @current_resource.template == new_resource_template
61
+ @equal_mode = @current_resource.mode == new_resource.mode
62
+ @current_resource.equal = @equal_template && @equal_mode
48
63
  end
49
64
 
50
65
  action :create do
51
- if exists?
52
- action_handler.report_progress "template '#{new_resource.name}' already exists - nothing to do"
53
- else
54
- fail "Missing attribute 'template_file' or 'template'" if !new_resource.template_file && !new_resource.template
55
- action_handler.perform_action "create template '#{new_resource.name}'" do
56
- template_str = File.read(new_resource.template_file) if new_resource.template_file
57
- template_str = new_driver.one.create_template(new_resource.template) if new_resource.template
58
- template_str << "\nNAME=\"#{new_resource.name}\""
59
- @template = new_driver.one.allocate_template(template_str)
60
- @new_resource.updated_by_last_action(true)
66
+ template_str = create_template
67
+
68
+ unless @current_resource.equal
69
+ if @current_resource.exists
70
+ unless @equal_template
71
+ converge_by "update template content on '#{new_resource.name}'" do
72
+ driver.one.update_template(@current_id, template_str)
73
+ end
74
+ end
75
+ unless @equal_mode
76
+ converge_by('update template permissions on ' \
77
+ "'#{new_resource.name}' to #{new_resource.mode}") do
78
+ template = driver.one.get_resource(:template,
79
+ :name => @current_resource.name,
80
+ :uname => @uname)
81
+ driver.one.chmod_resource(template, new_resource.mode)
82
+ end
83
+ end
84
+ else
85
+ converge_by("create template '#{new_resource.name}'") do
86
+ create_one_template(template_str)
87
+ end
61
88
  end
89
+ new_resource.updated_by_last_action(true)
62
90
  end
63
91
  end
64
92
 
65
- action :delete do
66
- if !exists?
67
- action_handler.report_progress "template '#{new_resource.name}' does not exists - nothing to do"
68
- else
69
- action_handler.perform_action "delete template '#{new_resource.name}'" do
70
- @template.delete
71
- @new_resource.updated_by_last_action(true)
93
+ action :create_if_missing do
94
+ template_str = create_template
95
+
96
+ unless @current_resource.exists
97
+ converge_by("create template '#{new_resource.name}'") do
98
+ create_one_template(template_str)
72
99
  end
100
+ new_resource.updated_by_last_action(true)
73
101
  end
74
102
  end
75
103
 
104
+ action :delete do
105
+ converge_by("delete template '#{new_resource.name}'") do
106
+ template = driver.one.get_resource(:template,
107
+ :name => @current_resource.name,
108
+ :uname => @uname)
109
+ template.delete
110
+ new_resource.updated_by_last_action(true)
111
+ end if @current_resource.exists
112
+ end
113
+
76
114
  protected
77
115
 
78
116
  def driver
79
- if current_driver && current_driver.driver_url != new_driver.driver_url
80
- fail "Cannot move '#{machine_spec.name}' from #{current_driver.driver_url} to #{new_driver.driver_url}: machine moving is not supported. Destroy and recreate."
117
+ current_driver = begin
118
+ if new_resource.driver
119
+ run_context.chef_provisioning.driver_for(new_resource.driver)
120
+ elsif run_context.chef_provisioning.current_driver
121
+ run_context.chef_provisioning.driver_for(run_context.chef_provisioning.current_driver)
122
+ end
123
+ end
124
+ fail "Driver not specified for one_template #{new_resource.name}" unless current_driver
125
+ current_driver
126
+ end
127
+
128
+ def create_one_template(template_str)
129
+ unless new_resource.template.key?('NAME')
130
+ template_str << "\n" << 'NAME="' << new_resource.name << '"'
81
131
  end
82
- fail "Driver not specified for one_image #{new_resource.name}" unless new_driver
83
- new_driver
132
+ driver.one.allocate_template(template_str)
133
+ template = driver.one.get_resource(:template,
134
+ :name => @current_resource.name,
135
+ :uname => @uname)
136
+ driver.one.chmod_resource(template, new_resource.mode)
84
137
  end
85
138
 
86
- def new_driver
87
- run_context.chef_provisioning.driver_for(new_resource.driver)
139
+ def create_template
140
+ if new_resource.template_file && new_resource.template.size > 0
141
+ fail("Attributes 'template_file' and 'template' are mutually " \
142
+ 'exclusive.')
143
+ elsif new_resource.template_file
144
+ ::File.read(new_resource.template_file)
145
+ elsif new_resource.template.size > 0
146
+ driver.one.create_template(new_resource.template)
147
+ else
148
+ fail("Missing attribute 'template_file' or 'template' in " \
149
+ 'resource block.')
150
+ end
151
+ end
152
+
153
+ def get_mode(template)
154
+ perms = template.to_hash['VMTEMPLATE']['PERMISSIONS']
155
+ mode = 0
156
+ %w(OWNER_U OWNER_M OWNER_A GROUP_U GROUP_M GROUP_A
157
+ OTHER_U OTHER_M OTHER_A).each do |m|
158
+ mode += perms[m].to_i
159
+ mode = mode << 1
160
+ end
161
+ mode = mode >> 1
162
+ mode.to_s(8)
88
163
  end
89
164
 
90
- def current_driver
91
- run_context.chef_provisioning.driver_for(run_context.chef_provisioning.current_driver) if run_context.chef_provisioning.current_driver
165
+ def uname
166
+ xml = OpenNebula::User.build_xml(OpenNebula::User::SELF)
167
+ my_user = OpenNebula::User.new(xml, driver.one.client)
168
+ my_user.info!
169
+ my_user.to_hash['USER']['NAME']
92
170
  end
93
171
  end
94
172
  end