nova floating IP range support

This commit is contained in:
Ivan Ponovarev 2013-07-23 16:08:42 +04:00
parent aa96a82f67
commit a88bc1906a
4 changed files with 173 additions and 0 deletions

View File

@ -0,0 +1,75 @@
require 'openstack'
require 'netaddr'
Puppet::Type.type(:nova_floating_range).provide :nova_manage do
desc 'Create nova floating range'
commands :nova_manage => 'nova-manage'
def exists?
@resource[:ensure] = 'present' unless @resource[:ensure]
if @resource[:ensure] == :absent
operate_range.any?
else
operate_range.empty?
end
end
def create
mixed_range.each do |ip|
connect.create_floating_ips_bulk :ip_range => ip, :pool => @resource[:pool]
end
end
def destroy
mixed_range.each do |ip|
nova_manage("floating", "delete", ip )
end
end
# Create range in cidr, including first and last ip
# Nova will create this range, excluding network and broadcast IPs
def mixed_range
range = []
NetAddr.merge(operate_range).each do |cidr|
tmp_range = NetAddr::CIDR.create(cidr).enumerate
range << tmp_range.first.to_s
range << tmp_range.last.to_s
end
range.uniq!
range += NetAddr.merge(operate_range).delete_if{ |part| part =~ /\/3[12]/}
end
# Calculate exist IP and current range
def operate_range
exist_range = []
connect.get_floating_ips_bulk.each do |element|
exist_range << element.address
end
if @resource[:ensure] == :absent
ip_range & exist_range
else
ip_range - exist_range
end
end
# Create array of IPs from range
def ip_range
ip = @resource[:name].split('-')
ip_range = NetAddr.range NetAddr::CIDR.create(ip.first), NetAddr::CIDR.create(ip.last)
ip_range.unshift(ip.first).push(ip.last)
end
# Connect to OpenStack
def connect
@connect ||= OpenStack::Connection.create :username => @resource[:username],
:api_key => @resource[:api_key],
:auth_method => @resource[:auth_method],
:auth_url => @resource[:auth_url],
:authtenant_name => @resource[:authtenant_name],
:service_type => @resource[:service_type]
end
end

View File

@ -0,0 +1,76 @@
Puppet::Type.newtype(:nova_floating_range) do
@doc = 'Manage creation/deletion of nova floating ip ranges.'
ensurable
newparam(:name, :namevar => true) do
desc 'IP range ("192.168.1.1-192.168.1.55")'
validate do |value|
raise Puppet::Error, " #{value} does not look like IP range" unless value =~ /^(\d{1,3}\.){3}\d{1,3}-(\d{1,3}\.){3}\d{1,3}$/
end
end
newparam(:pool) do
desc 'Pool ranges'
defaultto 'nova'
end
newparam(:interface) do
# I don't know how use it
desc 'Interface for floating IP'
end
newparam(:username) do
desc 'authorization user'
munge do |value|
String value
end
end
newparam(:api_key) do
desc 'authorization key'
munge do |value|
String value
end
end
newparam(:auth_method) do
desc 'authorization password'
munge do |value|
String value
end
end
newparam(:auth_url) do
desc 'URL to keystone authorization http://192.168.1.1:5000/v2.0/'
validate do |value|
raise Puppet::Error, "#{value} does not look like URL" unless value =~ /^https?:\/\/\S+:\d{1,5}\/v[\d\.]{1,5}\//
end
end
newparam(:authtenant_name) do
desc 'Tenant name'
munge do |value|
String value
end
end
newparam(:service_type) do
desc 'Connection type :service_type parameter to "compute", "object-store", "volume" or "network" (defaults to "compute")'
defaultto 'compute'
munge do |value|
String value
end
end
end

View File

@ -1,3 +1,4 @@
# This class nova::manage::floating has been deprecated in favor of nova::manage::floating_range
define nova::manage::floating (
$network = $name
) {

View File

@ -0,0 +1,21 @@
# Class for creating floating ip range
# - ip_range = ['192.168.1.1-192.168.1.55','192.168.2.1-192.168.2.66']
class nova::manage::floating_range (
$ip_range,
$pool = 'nova',
$username = 'admin',
$api_key = 'nova',
$password = 'nova',
$auth_url = undef,
$authtenant_name = 'admin',
){
nova_floating_range{$ip_range:
ensure => 'present',
pool => $pool,
username => $username,
api_key => $api_key,
auth_method => $password,
auth_url => $auth_url,
authtenant_name => $authtenant_name,
}
}