Add new parser function: get_network_role_to_ipaddr_map()

blueprint: templates-for-networking

Change-Id: Id6e7e830ac0ff6822e7f3d7a58517c987b705ed4
This commit is contained in:
Sergey Vasilenko 2015-06-30 15:13:27 +03:00
parent 5b9ac8c357
commit 7d6d4979ee
2 changed files with 135 additions and 0 deletions

View File

@ -0,0 +1,24 @@
module Puppet::Parser::Functions
newfunction(:get_node_to_ipaddr_map_by_network_role, :type => :rvalue, :doc => <<-EOS
Return a hash of nodes (node names are keys) that have one of the given roles.
example:
get_node_to_ipaddr_map_by_network_role($nodes_hash, 'role')
EOS
) do |args|
errmsg = "get_node_to_ipaddr_map_by_network_role($nodes_hash, 'role')"
nodes, role = args
raise(Puppet::ParseError, "#{errmsg}: 1st argument should be a hash") if !nodes.is_a?(Hash)
raise(Puppet::ParseError, "#{errmsg}: 2nd argument should be an a network-role name") if !role.is_a?(String)
nodes = nodes['nodes'] if nodes.has_key?('nodes')
rv = {}
nodes.each do |node_name, node_props|
next if ! node_props.is_a?(Hash)
n = node_props['network_roles']
next if ! n.is_a?(Hash)
rv[node_name] = n[role].gsub(/\/\d+$/,'') if n[role] != nil
end
return rv
end
end
# vim: set ts=2 sw=2 et :

View File

@ -0,0 +1,111 @@
require 'spec_helper'
require 'yaml'
describe Puppet::Parser::Functions.function(:get_node_to_ipaddr_map_by_network_role) do
let(:network_metadata) do
YAML.load("
---
nodes:
node-55:
network_roles:
nova/api: 192.168.1.55
neutron/api: 192.168.3.55
node_roles:
- controller
- mongo
- cinder
node-66:
network_roles:
nova/api: 192.168.1.66/24
neutron/api: 192.168.3.66/25
node_roles:
- compute
- cinder
- xxx
- yyy
node-77:
network_roles:
nova/api: 192.168.1.77
neutron/private: 192.168.3.77
node_roles:
- mongo
- cinder
- xxx
")
end
let(:nodes_hash) do
YAML.load("
---
node-55:
network_roles:
nova/api: 192.168.1.5
neutron/api: 192.168.3.5
node-66:
network_roles:
nova/api: 192.168.1.6/24
neutron/api: 192.168.3.6/25
node-77:
network_roles:
nova/api: 192.168.1.7
neutron/private: 192.168.3.7
")
end
let(:scope) { PuppetlabsSpec::PuppetInternals.scope }
subject do
function_name = Puppet::Parser::Functions.function(:get_node_to_ipaddr_map_by_network_role)
scope.method(function_name)
end
context "get_node_to_ipaddr_map_by_network_role($nodes_hash, 'role') usage" do
it 'should exist' do
subject == Puppet::Parser::Functions.function(:get_node_to_ipaddr_map_by_network_role)
end
it 'should return nodes to IP map for "nova/api" role from network_metadata hash' do
should run.with_params(network_metadata, 'nova/api').and_return({
'node-55' => '192.168.1.55',
'node-66' => '192.168.1.66',
'node-77' => '192.168.1.77'
})
end
it 'should return nodes to IP map for "nova/api" role from nodes_hash' do
should run.with_params(nodes_hash, 'nova/api').and_return({
'node-55' => '192.168.1.5',
'node-66' => '192.168.1.6',
'node-77' => '192.168.1.7'
})
end
it 'should return nodes to IP map for "neutron/api" role from network_metadata hash' do
should run.with_params(network_metadata, 'neutron/api').and_return({
'node-55' => '192.168.3.55',
'node-66' => '192.168.3.66'
})
end
it 'should return nodes to IP map for "neutron/api" role from nodes_hash' do
should run.with_params(nodes_hash, 'neutron/api').and_return({
'node-55' => '192.168.3.5',
'node-66' => '192.168.3.6'
})
end
it 'should return {} if 1st argument has wrong format' do
should run.with_params({:a=>1, :b=>2}, 'xxx/yyy').and_return({})
end
it 'should raise Puppet::ParseError if 1st argument not a Hash' do
should run.with_params('xxx', 'yyy').and_raise_error(Puppet::ParseError)
end
it 'should raise Puppet::ParseError if 2nd argument not an string' do
should run.with_params(network_metadata, ['cinder/api',]).and_raise_error(Puppet::ParseError)
end
end
end