Unit-tests for OpenNebula network parsing.
authorFrantišek Dvořák <valtri@civ.zcu.cz>
Thu, 23 Jun 2016 09:03:15 +0000 (11:03 +0200)
committerFrantišek Dvořák <valtri@civ.zcu.cz>
Thu, 23 Jun 2016 09:03:15 +0000 (11:03 +0200)
lib/nebula.rb
spec/nebula/get_spec.rb [new file with mode: 0644]
spec/nebula/network-dual.xml [new file with mode: 0644]
spec/nebula/network-example.xml [new file with mode: 0644]
spec/nebula/network-ipv6-global.xml [new file with mode: 0644]
spec/nebula/network-ipv6-local.xml [new file with mode: 0644]
spec/spec_helper.rb

index 5e3e7a6..3e76c54 100644 (file)
@@ -9,6 +9,8 @@ module Now
   # 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
diff --git a/spec/nebula/get_spec.rb b/spec/nebula/get_spec.rb
new file mode 100644 (file)
index 0000000..c5e6825
--- /dev/null
@@ -0,0 +1,83 @@
+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
diff --git a/spec/nebula/network-dual.xml b/spec/nebula/network-dual.xml
new file mode 100644 (file)
index 0000000..96dddb5
--- /dev/null
@@ -0,0 +1,55 @@
+<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>
+
diff --git a/spec/nebula/network-example.xml b/spec/nebula/network-example.xml
new file mode 100644 (file)
index 0000000..758e295
--- /dev/null
@@ -0,0 +1,54 @@
+<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>
diff --git a/spec/nebula/network-ipv6-global.xml b/spec/nebula/network-ipv6-global.xml
new file mode 100644 (file)
index 0000000..f945490
--- /dev/null
@@ -0,0 +1,51 @@
+<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>
diff --git a/spec/nebula/network-ipv6-local.xml b/spec/nebula/network-ipv6-local.xml
new file mode 100644 (file)
index 0000000..2f89fa5
--- /dev/null
@@ -0,0 +1,53 @@
+<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>
+
index 6398913..6e22b7a 100644 (file)
@@ -3,3 +3,11 @@ require 'rspec'
 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