# NOW core class for communication with OpenNebula
class Nebula
attr_accessor :logger, :config
+ # for testing
+ attr_accessor :ctx
@ctx = nil
@server_ctx = nil
@user_ctx = nil
--- /dev/null
+require 'spec_helper'
+require 'opennebula'
+
+describe 'network get' do
+ net1 = l('network-example')
+ net6a = l('network-ipv6-global')
+ net6b = l('network-ipv6-local')
+ nebula_base = Now::Nebula.new('opennebula' => { 'endpoint' => 'myendpoint' })
+
+ context 'example' do
+ let(:client) do
+ instance_double('client', call: net1)
+ end
+ let(:nebula) do
+ nebula_base.ctx = client
+ nebula_base
+ end
+ let(:range) { Now::Range.new(address: IPAddress.parse('192.168.0.4/24'), allocation: 'dynamic') }
+
+ it 'get raw' do
+ vn_generic = OpenNebula::VirtualNetwork.build_xml(0)
+ vn = OpenNebula::VirtualNetwork.new(vn_generic, client)
+ vn.info
+
+ expect(vn['ID']).to eq('0')
+ expect(vn['NAME']).to eq('example')
+ expect(vn['UNAME']).to eq('oneadmin')
+ expect(vn['GNAME']).to eq('users')
+ expect(vn['TEMPLATE/BRIDGE']).to eq('br0')
+ end
+
+ it 'get by nebula' do
+ network = nebula.get(0)
+
+ expect(network.id).to eq(0)
+ expect(network.title).to eq('example')
+ expect(network.range).to eq(range)
+ end
+ end
+
+ context 'IPv6 global' do
+ let(:client) do
+ instance_double('client', call: net6a)
+ end
+ let(:nebula) do
+ nebula_base.ctx = client
+ nebula_base
+ end
+ let(:id) { 2 }
+ let(:range) { Now::Range.new(address: IPAddress.parse('2001:718:1801:1052::/64'), allocation: 'dynamic') }
+
+ it 'get' do
+ network = nebula.get(id)
+
+ expect(network.id).to eq(id)
+ expect(network.title).to eq('vx1')
+ #FIXME
+ pending('do not use size for netmask')
+ expect(network.range).to eq(range)
+ end
+ end
+
+ context 'IPv6 local' do
+ let(:client) do
+ instance_double('client', call: net6b)
+ end
+ let(:nebula) do
+ nebula_base.ctx = client
+ nebula_base
+ end
+ let(:id) { 3 }
+ let(:range) { Now::Range.new(address: IPAddress.parse('fd00::/64'), allocation: 'dynamic') }
+
+ it 'get' do
+ network = nebula.get(id)
+
+ expect(network.id).to eq(id)
+ expect(network.title).to eq('vx2')
+ pending('do not use size for netmask')
+ expect(network.range).to eq(range)
+ end
+ end
+end
--- /dev/null
+<VNET>
+ <ID>5</ID>
+ <UID>0</UID>
+ <GID>0</GID>
+ <UNAME>oneadmin</UNAME>
+ <GNAME>oneadmin</GNAME>
+ <NAME>dual</NAME>
+ <PERMISSIONS>
+ <OWNER_U>1</OWNER_U>
+ <OWNER_M>1</OWNER_M>
+ <OWNER_A>0</OWNER_A>
+ <GROUP_U>0</GROUP_U>
+ <GROUP_M>0</GROUP_M>
+ <GROUP_A>0</GROUP_A>
+ <OTHER_U>0</OTHER_U>
+ <OTHER_M>0</OTHER_M>
+ <OTHER_A>0</OTHER_A>
+ </PERMISSIONS>
+ <CLUSTERS>
+ <ID>0</ID>
+ </CLUSTERS>
+ <BRIDGE><![CDATA[br0]]></BRIDGE>
+ <PARENT_NETWORK_ID/>
+ <VN_MAD><![CDATA[vxlan]]></VN_MAD>
+ <PHYDEV><![CDATA[eth0]]></PHYDEV>
+ <VLAN_ID><![CDATA[666]]></VLAN_ID>
+ <VLAN_ID_AUTOMATIC>0</VLAN_ID_AUTOMATIC>
+ <USED_LEASES>0</USED_LEASES>
+ <VROUTERS/>
+ <TEMPLATE>
+ <BRIDGE><![CDATA[br0]]></BRIDGE>
+ <DESCRIPTION><![CDATA[Dual-stack test]]></DESCRIPTION>
+ <PHYDEV><![CDATA[eth0]]></PHYDEV>
+ <SECURITY_GROUPS><![CDATA[0]]></SECURITY_GROUPS>
+ <VLAN_ID><![CDATA[666]]></VLAN_ID>
+ <VN_MAD><![CDATA[vxlan]]></VN_MAD>
+ </TEMPLATE>
+ <AR_POOL>
+ <AR>
+ <AR_ID><![CDATA[1]]></AR_ID>
+ <IP><![CDATA[10.6.6.0]]></IP>
+ <MAC><![CDATA[02:66:60:52:01:01]]></MAC>
+ <SIZE><![CDATA[512]]></SIZE>
+ <TYPE><![CDATA[IP4_6]]></TYPE>
+ <ULA_PREFIX><![CDATA[fd00::]]></ULA_PREFIX>
+ <MAC_END><![CDATA[02:66:60:52:03:00]]></MAC_END>
+ <IP_END><![CDATA[10.6.7.255]]></IP_END>
+ <IP6_ULA><![CDATA[fd00::466:60ff:fe52:101]]></IP6_ULA>
+ <IP6_ULA_END><![CDATA[fd00::466:60ff:fe52:300]]></IP6_ULA_END>
+ <USED_LEASES>0</USED_LEASES>
+ <LEASES/>
+ </AR>
+ </AR_POOL>
+</VNET>
+
--- /dev/null
+<VNET>
+ <ID>0</ID>
+ <UID>0</UID>
+ <GID>1</GID>
+ <UNAME>oneadmin</UNAME>
+ <GNAME>users</GNAME>
+ <NAME>example</NAME>
+ <PERMISSIONS>
+ <OWNER_U>1</OWNER_U>
+ <OWNER_M>1</OWNER_M>
+ <OWNER_A>1</OWNER_A>
+ <GROUP_U>1</GROUP_U>
+ <GROUP_M>0</GROUP_M>
+ <GROUP_A>0</GROUP_A>
+ <OTHER_U>0</OTHER_U>
+ <OTHER_M>0</OTHER_M>
+ <OTHER_A>0</OTHER_A>
+ </PERMISSIONS>
+ <CLUSTERS>
+ <ID>0</ID>
+ </CLUSTERS>
+ <BRIDGE><![CDATA[br0]]></BRIDGE>
+ <PARENT_NETWORK_ID/>
+ <VN_MAD><![CDATA[ebtables]]></VN_MAD>
+ <PHYDEV/>
+ <VLAN_ID/>
+ <VLAN_ID_AUTOMATIC/>
+ <USED_LEASES>3</USED_LEASES>
+ <VROUTERS/>
+ <TEMPLATE>
+ <BRIDGE><![CDATA[br0]]></BRIDGE>
+ <DNS><![CDATA[192.168.0.1]]></DNS>
+ <GATEWAY><![CDATA[192.168.0.1]]></GATEWAY>
+ <NETWORK_ADDRESS><![CDATA[192.168.0.0]]></NETWORK_ADDRESS>
+ <NETWORK_SIZE><![CDATA[C]]></NETWORK_SIZE>
+ <PHYDEV><![CDATA[]]></PHYDEV>
+ <SECURITY_GROUPS><![CDATA[0]]></SECURITY_GROUPS>
+ <TYPE><![CDATA[RANGED]]></TYPE>
+ <VN_MAD><![CDATA[ebtables]]></VN_MAD>
+ </TEMPLATE>
+ <AR_POOL>
+ <AR>
+ <AR_ID><![CDATA[0]]></AR_ID>
+ <IP><![CDATA[192.168.0.4]]></IP>
+ <MAC><![CDATA[02:00:c0:a8:00:04]]></MAC>
+ <SIZE><![CDATA[251]]></SIZE>
+ <TYPE><![CDATA[IP4]]></TYPE>
+ <MAC_END><![CDATA[02:00:c0:a8:00:fe]]></MAC_END>
+ <IP_END><![CDATA[192.168.0.254]]></IP_END>
+ <USED_LEASES>3</USED_LEASES>
+ <LEASES/>
+ </AR>
+ </AR_POOL>
+</VNET>
--- /dev/null
+<VNET>
+ <ID>2</ID>
+ <UID>0</UID>
+ <GID>1</GID>
+ <UNAME>oneadmin</UNAME>
+ <GNAME>users</GNAME>
+ <NAME>vx1</NAME>
+ <PERMISSIONS>
+ <OWNER_U>1</OWNER_U>
+ <OWNER_M>1</OWNER_M>
+ <OWNER_A>0</OWNER_A>
+ <GROUP_U>1</GROUP_U>
+ <GROUP_M>0</GROUP_M>
+ <GROUP_A>0</GROUP_A>
+ <OTHER_U>0</OTHER_U>
+ <OTHER_M>0</OTHER_M>
+ <OTHER_A>0</OTHER_A>
+ </PERMISSIONS>
+ <CLUSTERS>
+ <ID>0</ID>
+ </CLUSTERS>
+ <BRIDGE><![CDATA[br0]]></BRIDGE>
+ <PARENT_NETWORK_ID/>
+ <VN_MAD><![CDATA[vxlan]]></VN_MAD>
+ <PHYDEV><![CDATA[eth0]]></PHYDEV>
+ <VLAN_ID><![CDATA[1]]></VLAN_ID>
+ <VLAN_ID_AUTOMATIC>0</VLAN_ID_AUTOMATIC>
+ <USED_LEASES>2</USED_LEASES>
+ <VROUTERS/>
+ <TEMPLATE>
+ <BRIDGE><![CDATA[br0]]></BRIDGE>
+ <PHYDEV><![CDATA[eth0]]></PHYDEV>
+ <SECURITY_GROUPS><![CDATA[0]]></SECURITY_GROUPS>
+ <VLAN_ID><![CDATA[1]]></VLAN_ID>
+ <VN_MAD><![CDATA[vxlan]]></VN_MAD>
+ </TEMPLATE>
+ <AR_POOL>
+ <AR>
+ <AR_ID><![CDATA[1]]></AR_ID>
+ <GLOBAL_PREFIX><![CDATA[2001:718:1801:1052::]]></GLOBAL_PREFIX>
+ <MAC><![CDATA[02:a6:10:52:01:01]]></MAC>
+ <SIZE><![CDATA[1024]]></SIZE>
+ <TYPE><![CDATA[IP6]]></TYPE>
+ <MAC_END><![CDATA[02:a6:10:52:05:00]]></MAC_END>
+ <IP6_GLOBAL><![CDATA[2001:718:1801:1052:4a6:10ff:fe52:101]]></IP6_GLOBAL>
+ <IP6_GLOBAL_END><![CDATA[2001:718:1801:1052:4a6:10ff:fe52:500]]></IP6_GLOBAL_END>
+ <USED_LEASES>2</USED_LEASES>
+ <LEASES/>
+ </AR>
+ </AR_POOL>
+</VNET>
--- /dev/null
+<VNET>
+ <ID>3</ID>
+ <UID>0</UID>
+ <GID>0</GID>
+ <UNAME>oneadmin</UNAME>
+ <GNAME>oneadmin</GNAME>
+ <NAME>vx2</NAME>
+ <PERMISSIONS>
+ <OWNER_U>1</OWNER_U>
+ <OWNER_M>1</OWNER_M>
+ <OWNER_A>0</OWNER_A>
+ <GROUP_U>0</GROUP_U>
+ <GROUP_M>0</GROUP_M>
+ <GROUP_A>0</GROUP_A>
+ <OTHER_U>0</OTHER_U>
+ <OTHER_M>0</OTHER_M>
+ <OTHER_A>0</OTHER_A>
+ </PERMISSIONS>
+ <CLUSTERS>
+ <ID>0</ID>
+ </CLUSTERS>
+ <BRIDGE><![CDATA[br0]]></BRIDGE>
+ <PARENT_NETWORK_ID/>
+ <VN_MAD><![CDATA[vxlan]]></VN_MAD>
+ <PHYDEV><![CDATA[eth0]]></PHYDEV>
+ <VLAN_ID><![CDATA[666]]></VLAN_ID>
+ <VLAN_ID_AUTOMATIC>0</VLAN_ID_AUTOMATIC>
+ <USED_LEASES>0</USED_LEASES>
+ <VROUTERS/>
+ <TEMPLATE>
+ <BRIDGE><![CDATA[br0]]></BRIDGE>
+ <DESCRIPTION><![CDATA[Test]]></DESCRIPTION>
+ <PHYDEV><![CDATA[eth0]]></PHYDEV>
+ <SECURITY_GROUPS><![CDATA[0]]></SECURITY_GROUPS>
+ <VLAN_ID><![CDATA[666]]></VLAN_ID>
+ <VN_MAD><![CDATA[vxlan]]></VN_MAD>
+ </TEMPLATE>
+ <AR_POOL>
+ <AR>
+ <AR_ID><![CDATA[1]]></AR_ID>
+ <MAC><![CDATA[02:66:60:52:01:01]]></MAC>
+ <SIZE><![CDATA[512]]></SIZE>
+ <TYPE><![CDATA[IP6]]></TYPE>
+ <ULA_PREFIX><![CDATA[fd00::]]></ULA_PREFIX>
+ <MAC_END><![CDATA[02:66:60:52:03:00]]></MAC_END>
+ <IP6_ULA><![CDATA[fd00::466:60ff:fe52:101]]></IP6_ULA>
+ <IP6_ULA_END><![CDATA[fd00::466:60ff:fe52:300]]></IP6_ULA_END>
+ <USED_LEASES>0</USED_LEASES>
+ <LEASES/>
+ </AR>
+ </AR_POOL>
+</VNET>
+
Dir['./models/helpers/*.rb', './models/*.rb', './lib/*.rb'].each do |file|
require file
end
+
+def l(name)
+ fname = File.expand_path("../nebula/#{name}.xml", __FILE__)
+ File.read(fname)
+end
+
+$logger = Logger.new(STDOUT)
+$logger.level = Logger::INFO