Rewrite nova_network provider with using only nova client
Currently nova_network provider uses admin tool nova-manage for managing nova-networks, but this tool doesn't have any authentication and doesn't provide all features of nova client. This patch avoids problem with authentication by using nova client for managing networks. Another goal of this patch, with using nova client, is that all providers should use one way for authentication, based on openstack client and openstacklib [1] But the problem is that openstack client doesn't provide possibility to manage nova-networks. So, this provider will be used with nova client, until nova-network exists. Also added new tests. [1] blueprint use-openstackclient-in-module-resources Change-Id: I34c88ab9601b8b0bbf77588005422620eb575d6a
This commit is contained in:
43
lib/puppet/provider/nova_network/nova.rb
Normal file
43
lib/puppet/provider/nova_network/nova.rb
Normal file
@@ -0,0 +1,43 @@
|
||||
require File.join(File.dirname(__FILE__), '..','..','..', 'puppet/provider/nova')
|
||||
|
||||
Puppet::Type.type(:nova_network).provide(:nova, :parent => Puppet::Provider::Nova) do
|
||||
|
||||
desc "Manage nova network"
|
||||
|
||||
optional_commands :nova => 'nova'
|
||||
|
||||
def create
|
||||
optional_opts = []
|
||||
{
|
||||
# this needs to be converted from a project name to an id
|
||||
:project => '--project_id',
|
||||
:dns1 => '--dns1',
|
||||
:dns2 => '--dns2',
|
||||
:gateway => '--gateway',
|
||||
:bridge => '--bridge',
|
||||
:vlan_start => '--vlan-start',
|
||||
:allowed_start => '--allowed-start',
|
||||
:allowed_end => '--allowed-end',
|
||||
}.each do |param, opt|
|
||||
if resource[param]
|
||||
optional_opts.push(opt).push(resource[param])
|
||||
end
|
||||
end
|
||||
|
||||
opts = [resource[:label], "--fixed-range-v4", resource[:name]]
|
||||
|
||||
auth_nova('network-create', opts + optional_opts)
|
||||
end
|
||||
|
||||
def exists?
|
||||
instances = auth_nova('network-list')
|
||||
return instances.split('\n')[1..-1].detect do |n|
|
||||
n =~ /(\S+)\s+(#{resource[:network]})\s+(\S+)/
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
auth_nova("network-delete", resource[:network])
|
||||
end
|
||||
|
||||
end
|
@@ -1,71 +0,0 @@
|
||||
require File.join(File.dirname(__FILE__), '..','..','..',
|
||||
'puppet/provider/nova')
|
||||
|
||||
Puppet::Type.type(:nova_network).provide(:nova_manage, :parent => Puppet::Provider::Nova) do
|
||||
|
||||
desc "Manage nova network"
|
||||
|
||||
optional_commands :nova_manage => 'nova-manage', :nova => 'nova'
|
||||
|
||||
# I need to setup caching and what-not to make this lookup performance not suck
|
||||
def self.instances
|
||||
begin
|
||||
network_list = nova_manage("network", "list")
|
||||
rescue Exception => e
|
||||
if e.message =~ /No networks defined/
|
||||
return []
|
||||
else
|
||||
raise(e)
|
||||
end
|
||||
end
|
||||
network_list.split("\n")[1..-1].collect do |net|
|
||||
if net =~ /^(\S+)\s+(\S+)/
|
||||
new(:name => $2 )
|
||||
end
|
||||
end.compact
|
||||
end
|
||||
|
||||
def create
|
||||
optional_opts = []
|
||||
{
|
||||
# this needs to be converted from a project name to an id
|
||||
:project => '--project_id',
|
||||
:dns1 => '--dns1',
|
||||
:dns2 => '--dns2',
|
||||
:gateway => '--gateway',
|
||||
:bridge => '--bridge',
|
||||
:vlan_start => '--vlan-start',
|
||||
:allowed_start => '--allowed-start',
|
||||
:allowed_end => '--allowed-end',
|
||||
}.each do |param, opt|
|
||||
if resource[param]
|
||||
optional_opts.push(opt).push(resource[param])
|
||||
end
|
||||
end
|
||||
|
||||
auth_nova('network-create',
|
||||
resource[:label],
|
||||
'--fixed-range-v4',
|
||||
resource[:name],
|
||||
optional_opts
|
||||
)
|
||||
end
|
||||
|
||||
def exists?
|
||||
begin
|
||||
network_list = nova_manage("network", "list")
|
||||
return network_list.split("\n")[1..-1].detect do |n|
|
||||
# TODO - this does not take the CIDR into accont. Does it matter?
|
||||
n =~ /^(\S+)\s+(#{resource[:network].split('/').first})/
|
||||
end
|
||||
rescue
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def destroy
|
||||
nova_manage("network", "delete", resource[:network])
|
||||
end
|
||||
|
||||
end
|
63
spec/unit/provider/nova_network/nova_spec.rb
Normal file
63
spec/unit/provider/nova_network/nova_spec.rb
Normal file
@@ -0,0 +1,63 @@
|
||||
require 'puppet'
|
||||
require 'puppet/provider/nova_network/nova'
|
||||
require 'tempfile'
|
||||
|
||||
provider_class = Puppet::Type.type(:nova_network).provider(:nova)
|
||||
|
||||
describe provider_class do
|
||||
|
||||
let :net_attrs do
|
||||
{
|
||||
:network => '10.20.0.0/16',
|
||||
:label => 'novanetwork',
|
||||
:ensure => 'present',
|
||||
}
|
||||
end
|
||||
|
||||
let :resource do
|
||||
Puppet::Type::Nova_network.new(net_attrs)
|
||||
end
|
||||
|
||||
let :provider do
|
||||
provider_class.new(resource)
|
||||
end
|
||||
|
||||
shared_examples 'nova_network' do
|
||||
describe '#exists?' do
|
||||
it 'should check non-existsing network' do
|
||||
provider.expects(:auth_nova).with("network-list")
|
||||
.returns('"+--------------------------------------+-------------+-------------+\n| ID | Label | Cidr |\n+--------------------------------------+-------------+-------------+\n| 703edc62-36ab-4c41-9d73-884b30e9acbd | novanetwork | 10.0.0.0/16 |\n+--------------------------------------+-------------+-------------+\n"
|
||||
')
|
||||
expect(provider.exists?).to be_falsey
|
||||
end
|
||||
|
||||
it 'should check existsing network' do
|
||||
provider.expects(:auth_nova).with("network-list")
|
||||
.returns('"+--------------------------------------+-------------+-------------+\n| ID | Label | Cidr |\n+--------------------------------------+-------------+-------------+\n| 703edc62-36ab-4c41-9d73-884b30e9acbd | novanetwork | 10.20.0.0/16 |\n+--------------------------------------+-------------+-------------+\n"
|
||||
')
|
||||
expect(provider.exists?).to be_truthy
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
it 'should create network' do
|
||||
provider.expects(:auth_nova).with("network-create", ['novanetwork', '--fixed-range-v4', '10.20.0.0/16'] )
|
||||
.returns('"+--------------------------------------+-------------+-------------+\n| ID | Label | Cidr |\n+--------------------------------------+-------------+-------------+\n| 703edc62-36ab-4c41-9d73-88sdfsdfsdfsd | nova-network | 10.20.0.0/16 |\n+--------------------------------------+-------------+-------------+\n"
|
||||
')
|
||||
provider.create
|
||||
end
|
||||
end
|
||||
|
||||
describe '#destroy' do
|
||||
it 'should destroy network' do
|
||||
resource[:ensure] = :absent
|
||||
provider.expects(:auth_nova).with("network-delete", "10.20.0.0/16")
|
||||
.returns('"+--------------------------------------+-------------+-------------+\n| ID | Label | Cidr |\n+--------------------------------------+-------------+-------------+\n
|
||||
')
|
||||
provider.destroy
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
it_behaves_like('nova_network')
|
||||
end
|
Reference in New Issue
Block a user