Merge pull request #399 from Zipfer/floating_ip
nova floating IP range support
This commit is contained in:
parent
2af2039d6d
commit
303ec78ddd
@ -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
|
@ -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
|
@ -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
|
||||
) {
|
||||
|
21
deployment/puppet/nova/manifests/manage/floating_range.pp
Normal file
21
deployment/puppet/nova/manifests/manage/floating_range.pp
Normal 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,
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user