diff --git a/deployment/puppet/nova/lib/puppet/provider/nova_floating_range/nova_manage.rb b/deployment/puppet/nova/lib/puppet/provider/nova_floating_range/nova_manage.rb new file mode 100644 index 0000000000..d21d4f9309 --- /dev/null +++ b/deployment/puppet/nova/lib/puppet/provider/nova_floating_range/nova_manage.rb @@ -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 diff --git a/deployment/puppet/nova/lib/puppet/type/nova_floating_range.rb b/deployment/puppet/nova/lib/puppet/type/nova_floating_range.rb new file mode 100644 index 0000000000..1b2fa8793c --- /dev/null +++ b/deployment/puppet/nova/lib/puppet/type/nova_floating_range.rb @@ -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 \ No newline at end of file diff --git a/deployment/puppet/nova/manifests/manage/floating.pp b/deployment/puppet/nova/manifests/manage/floating.pp index 0ccb631e67..7cd83072ff 100644 --- a/deployment/puppet/nova/manifests/manage/floating.pp +++ b/deployment/puppet/nova/manifests/manage/floating.pp @@ -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 ) { diff --git a/deployment/puppet/nova/manifests/manage/floating_range.pp b/deployment/puppet/nova/manifests/manage/floating_range.pp new file mode 100644 index 0000000000..641feaf11a --- /dev/null +++ b/deployment/puppet/nova/manifests/manage/floating_range.pp @@ -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, + } +} \ No newline at end of file