Skip to content

Commit

Permalink
Merge pull request #3 from poliva83/master
Browse files Browse the repository at this point in the history
Version 0.4.3 - 2/12/2016
  • Loading branch information
poliva83 committed Feb 22, 2016
2 parents b4d3a5a + 749b90e commit 359a157
Show file tree
Hide file tree
Showing 12 changed files with 360 additions and 128 deletions.
11 changes: 10 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
# Changelog

## 0.4.2 (8/12/2015)
## 0.4.3 (2/12/2016)
- Fixed get_pool method to process symbols correctly
- Update driver and resources to use new get_pool method
- Add 4.14 support
- Deprecate :enforce_chef_fqdn
- Added template support for embedded quotation marks
- Added ssh_gateway support
- Add :vm_name option to rename VM in OpenNebula UI

## 0.4.1 (8/12/2015)
- Fixed one_vnet_lease :hold action logic.

## 0.4.0 (7/12/2015)
Expand Down
23 changes: 13 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ machine_options {
:template_name => String name of the OpenNebula template to use
:template_id => Integer id of the OpenNebula template to use
:template_options => Hash values to be merged with VM template
:enforce_chef_fqdn => [TrueClass, FalseClass] flag indicating if fqdn names should be used for machine names
:is_shutdown => [TrueClass, FalseClass] call vm.shutodwn instead of vm.stop during :stop action
:shutdown_hard => [TrueClass, FalseClass] flag indicating hard or soft shutdown
:mode => String octed to set permissions to the machine
},
:sudo => true,
:ssh_username => 'local',
:ssh_gateway => '[email protected]',
:ssh_options => {
Hash containing SSH options as specified by net-ssh gem
please see https://github.com/net-ssh/net-ssh for all options
Expand All @@ -71,9 +71,15 @@ machine_options {
:keys => [ File.open(File.expand_path('~/.ssh/id_rsa_new')).read ]
:keys_only => false,
:forward_agent => true,
:proxy => 'ssh myproxy.net nc %h %p',
:use_agent => true,
:user_known_hosts_file => '/dev/null'
}
:vm_name => [Symbol, String] Change how the machine shows up in OpenNebula UI and CLI tools.
Use :short to rename the machine to the short hostname.
Use a string to rename the machine to an arbitrary name.
Note this does not change the hostname of the machine, it
simply renames the VM in OpenNebula.
:connection_timeout => [Integer] max wait time to establish connection
}
```
Expand Down Expand Up @@ -503,24 +509,21 @@ example:

## <a name="authors"></a> Authors

Created by [Bogdan Buczynski][author] (<bbuczynski@blackberry.com>)
Created by [Bogdan Buczynski](https://github.com/bbuczynski) (<pikus1@gmail.com>)

## <a name="maintainers"></a> Maintainers

Maintained by
* [Bogdan Buczynski][author] (<[email protected]>)
* [Philip Oliva][maintainer] (<[email protected]>)
* [Andrew J. Brown][maintainer] (<[email protected]>)
* [Evgeny Yurchenko][maintainer] (<[email protected]>)
* [Andrew J. Brown](https://github.com/andrewjamesbrown) (<[email protected]>)
* [Bogdan Buczynski](https://github.com/bbuczynski) (<[email protected]>)
* [Dongyu 'Gary' Zheng](https://github.com/dongyuzheng) (<[email protected]>)
* [Evgeny Yurchenko](https://github.com/EYurchenko) (<[email protected]>)
* [Phil Oliva](https://github.com/poliva83) (<[email protected]>)

## <a name="license"></a> License

Apache 2.0 (see [LICENSE][license])

[author]: https://github.com/bbuczynski
[maintainer]: https://github.com/poliva83
[maintainer]: https://github.com/andrewjamesbrown
[maintainer]: https://github.com/EYurchenko
[issues]: https://github.com/blackberry/chef-provisioning-opennebula/issues
[license]: https://github.com/blackberry/chef-provisioning-opennebula/blob/master/LICENSE
[repo]: https://github.com/blackberry/chef-provisioning-opennebula
Expand Down
6 changes: 3 additions & 3 deletions chef-provisioning-opennebula.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ Gem::Specification.new do |s|
s.extra_rdoc_files = [ 'README.md', 'LICENSE' ]
s.summary = 'Driver for creating OpenNebula instances in Chef Provisioning.'
s.description = s.summary
s.authors = [ 'Andrew J. Brown', 'Bogdan Buczynski', 'Evgeny Yurchenko', 'Phil Oliva' ]
s.email = [ '[email protected]', '[email protected]', '[email protected]', '[email protected]' ]
s.authors = [ 'Andrew J. Brown', 'Bogdan Buczynski', 'Dongyu \'Gary\' Zheng', 'Evgeny Yurchenko', 'Phil Oliva' ]
s.email = [ '[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]' ]
s.homepage = 'https://github.com/blackberry/chef-provisioning-opennebula'

s.add_dependency 'chef'
s.add_dependency 'chef-provisioning', '> 0.15'
s.add_dependency 'opennebula', '~> 4.10', '< 4.14'
s.add_dependency 'opennebula', '~> 4.10', '< 5'

s.add_development_dependency 'rspec'
s.add_development_dependency 'rake'
Expand Down
15 changes: 7 additions & 8 deletions lib/chef/provider/one_image.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def action_handler

def exists?
new_driver = driver
@image = new_driver.one.get_resource('img', :name => @new_resource.name)
@image = new_driver.one.get_resource(:image, :name => @new_resource.name)
!@image.nil?
end

Expand Down Expand Up @@ -92,7 +92,7 @@ def exists?
action_handler.perform_action "deleted image '#{new_resource.name}'" do
rc = @image.delete
fail "Failed to delete image '#{new_resource.name}' : #{rc.message}" if OpenNebula.is_error?(rc)
until new_driver.one.get_resource('img', :name => new_resource.name).nil?
until new_driver.one.get_resource(:image, :name => new_resource.name).nil?
Chef::Log.debug("Waiting for delete image to finish...")
sleep 1
end
Expand All @@ -107,8 +107,8 @@ def exists?
fail "Missing attribute 'machine_id'" unless new_resource.machine_id
fail "Failed to attach disk - image '#{new_resource.name}' does not exist" unless exists?

vm = new_driver.one.get_resource('vm', new_resource.machine_id.is_a?(Integer) ? :id : :name => new_resource.machine_id)
fail "Failed to attach disk - VM '#{new_resource.machine}' does not exist" if vm.nil?
vm = new_driver.one.get_resource(:virtualmachine, new_resource.machine_id.is_a?(Integer) ? :id : :name => new_resource.machine_id)
fail "Failed to attach disk - VM '#{new_resource.machine_id}' does not exist" if vm.nil?
action_handler.perform_action "attached disk #{new_resource.name} to #{vm.name}" do
disk_hash = @image.to_hash
disk_tpl = "DISK = [ "
Expand All @@ -134,13 +134,12 @@ def exists?
action :snapshot do
fail "Missing attribute 'machine_id'" unless new_resource.machine_id
fail "snapshot '#{new_resource.name}' already exists" if exists?
vm = new_driver.one.get_resource('vm', new_resource.machine_id.is_a?(Integer) ? :id : :name => new_resource.machine_id)
vm = new_driver.one.get_resource(:virtualmachine, new_resource.machine_id.is_a?(Integer) ? :id : :name => new_resource.machine_id)
fail "Failed to create snapshot - VM '#{new_resource.machine_id}' does not exist" if vm.nil?
action_handler.perform_action "created snapshot from '#{new_resource.machine_id}'" do
disk_id = new_resource.disk_id.is_a?(Integer) ? new_resource.disk_id : new_driver.one.get_disk_id(vm, new_resource.disk_id)
fail "No disk '#{new_resource.disk_id}' found on '#{vm.name}'" if disk_id.nil?

@image = vm.disk_snapshot(disk_id, new_resource.name, "", true)
@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)
fail "Failed to create snapshot '#{new_resource.name}': #{@image.message}" if OpenNebula.is_error?(@image)

@image = new_driver.one.wait_for_img(new_resource.name, @image)
Expand Down Expand Up @@ -230,7 +229,7 @@ def exists?
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?
# 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?
image = new_driver.one.get_resource('img', !@new_resource.image_id.nil? ? { :id => @new_resource.image_id } : { :name => @new_resource.name })
image = new_driver.one.get_resource(:image, !@new_resource.image_id.nil? ? { :id => @new_resource.image_id } : { :name => @new_resource.name })
fail "Image 'NAME: #{@new_resource.name}/ID: #{@new_resource.image_id}' does not exist" if image.nil?
local_path = @new_resource.image_file || ::File.join(Chef::Config[:file_cache_path], "#{@new_resource.name}.qcow2")
fail "Will not overwrite an existing file: #{local_path}" if ::File.exist?(local_path)
Expand Down
149 changes: 113 additions & 36 deletions lib/chef/provider/one_template.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright 2015, BlackBerry, Inc.
# Copyright 2015, BlackBerry, Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -28,68 +28,145 @@ class OneTemplate < Chef::Provider::LWRPBase

provides :one_template

attr_reader :template
attr_reader :uname
attr_reader :equal_template
attr_reader :equal_mode
attr_reader :current_id

def whyrun_supported?
true
end

def load_current_resource
end
driver = self.driver
@uname = uname
@current_resource = Chef::Resource::OneTemplate.new(new_resource.name,
run_context)
@current_resource.name(new_resource.name)
template = driver.one.get_resource(:template,
:name => @current_resource.name,
:uname => @uname)
@current_resource.exists = !template.nil?

def action_handler
@action_handler ||= Chef::Provisioning::ChefProviderActionHandler.new(self)
end
return unless @current_resource.exists

new_resource_template = @new_resource.template_file.nil? ?
@new_resource.template :
driver.one.template_from_file(@new_resource.template_file)

def exists?
new_driver = driver
@template = new_driver.one.get_resource('tpl', :name => new_resource.name)
!@template.nil?
@current_id = template.to_hash['VMTEMPLATE']['ID'].to_i
@current_resource.template(template.to_hash['VMTEMPLATE']['TEMPLATE'])
@current_resource.mode(get_mode(template))
@equal_template = @current_resource.template == new_resource_template
@equal_mode = @current_resource.mode == new_resource.mode
@current_resource.equal = @equal_template && @equal_mode
end

action :create do
if exists?
action_handler.report_progress "template '#{new_resource.name}' already exists - nothing to do"
else
fail "Missing attribute 'template_file' or 'template'" if !new_resource.template_file && !new_resource.template
action_handler.perform_action "create template '#{new_resource.name}'" do
template_str = File.read(new_resource.template_file) if new_resource.template_file
template_str = new_driver.one.create_template(new_resource.template) if new_resource.template
template_str << "\nNAME=\"#{new_resource.name}\""
@template = new_driver.one.allocate_template(template_str)
new_driver.one.chmod_resource(@template, new_resource.mode)
@new_resource.updated_by_last_action(true)
template_str = create_template

unless @current_resource.equal
if @current_resource.exists
unless @equal_template
converge_by "update template content on '#{new_resource.name}'" do
driver.one.update_template(@current_id, template_str)
end
end
unless @equal_mode
converge_by('update template permissions on ' \
"'#{new_resource.name}' to #{new_resource.mode}") do
template = driver.one.get_resource(:template,
:name => @current_resource.name,
:uname => @uname)
driver.one.chmod_resource(template, new_resource.mode)
end
end
else
converge_by("create template '#{new_resource.name}'") do
create_one_template(template_str)
end
end
new_resource.updated_by_last_action(true)
end
end

action :delete do
if !exists?
action_handler.report_progress "template '#{new_resource.name}' does not exists - nothing to do"
else
action_handler.perform_action "delete template '#{new_resource.name}'" do
@template.delete
@new_resource.updated_by_last_action(true)
action :create_if_missing do
template_str = create_template

unless @current_resource.exists
converge_by("create template '#{new_resource.name}'") do
create_one_template(template_str)
end
new_resource.updated_by_last_action(true)
end
end

action :delete do
converge_by("delete template '#{new_resource.name}'") do
template = driver.one.get_resource(:template,
:name => @current_resource.name,
:uname => @uname)
template.delete
new_resource.updated_by_last_action(true)
end if @current_resource.exists
end

protected

def driver
if current_driver && current_driver.driver_url != new_driver.driver_url
fail "Cannot move '#{machine_spec.name}' from #{current_driver.driver_url} to #{new_driver.driver_url}: machine moving is not supported. Destroy and recreate."
current_driver = begin
if new_resource.driver
run_context.chef_provisioning.driver_for(new_resource.driver)
elsif run_context.chef_provisioning.current_driver
run_context.chef_provisioning.driver_for(run_context.chef_provisioning.current_driver)
end
end
fail "Driver not specified for one_template #{new_resource.name}" unless current_driver
current_driver
end

def create_one_template(template_str)
unless new_resource.template.key?('NAME')
template_str << "\n" << 'NAME="' << new_resource.name << '"'
end
fail "Driver not specified for one_image #{new_resource.name}" unless new_driver
new_driver
driver.one.allocate_template(template_str)
template = driver.one.get_resource(:template,
:name => @current_resource.name,
:uname => @uname)
driver.one.chmod_resource(template, new_resource.mode)
end

def new_driver
run_context.chef_provisioning.driver_for(new_resource.driver)
def create_template
if new_resource.template_file && new_resource.template.size > 0
fail("Attributes 'template_file' and 'template' are mutually " \
'exclusive.')
elsif new_resource.template_file
::File.read(new_resource.template_file)
elsif new_resource.template.size > 0
driver.one.create_template(new_resource.template)
else
fail("Missing attribute 'template_file' or 'template' in " \
'resource block.')
end
end

def get_mode(template)
perms = template.to_hash['VMTEMPLATE']['PERMISSIONS']
mode = 0
%w(OWNER_U OWNER_M OWNER_A GROUP_U GROUP_M GROUP_A
OTHER_U OTHER_M OTHER_A).each do |m|
mode += perms[m].to_i
mode = mode << 1
end
mode = mode >> 1
mode.to_s(8)
end

def current_driver
run_context.chef_provisioning.driver_for(run_context.chef_provisioning.current_driver) if run_context.chef_provisioning.current_driver
def uname
xml = OpenNebula::User.build_xml(OpenNebula::User::SELF)
my_user = OpenNebula::User.new(xml, driver.one.client)
my_user.info!
my_user.to_hash['USER']['NAME']
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/chef/provider/one_user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def action_handler

def exists?(filter)
new_driver = driver
@current_user = new_driver.one.get_resource('user', filter)
@current_user = new_driver.one.get_resource(:user, filter)
Chef::Log.debug("user '#{filter}' exists: #{!@current_user.nil?}")
!@current_user.nil?
end
Expand Down
2 changes: 1 addition & 1 deletion lib/chef/provider/one_vnet.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def action_handler

def exists?(filter)
new_driver = driver
@current_vnet = new_driver.one.get_resource('vnet', filter)
@current_vnet = new_driver.one.get_resource(:virtualnetwork, filter)
Chef::Log.debug("VNET '#{filter}' exists: #{!@current_vnet.nil?}")
!@current_vnet.nil?
end
Expand Down
2 changes: 1 addition & 1 deletion lib/chef/provider/one_vnet_lease.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def action_handler
def exists?
new_driver = driver
filter = { @new_resource.vnet.is_a?(Integer) ? :id : :name => @new_resource.vnet }
@current_vnet = new_driver.one.get_resource('vnet', filter)
@current_vnet = new_driver.one.get_resource(:virtualnetwork, filter)
fail "vnet '#{@new_resource.vnet}' does not exist" if @current_vnet.nil?
@current_vnet.info!
hash = @current_vnet.to_hash
Expand Down
Loading

0 comments on commit 359a157

Please sign in to comment.