Skip to content

Commit 7d8bec4

Browse files
committed
Merge pull request #1 from python-oca/feature/vnet-addressranges
Add basic support for address_ranges, adapt to OpenNebula 4.10 API
2 parents 400d3b6 + 330ad18 commit 7d8bec4

5 files changed

Lines changed: 137 additions & 56 deletions

File tree

oca/tests/fixtures/vnet.xml

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,46 @@
11
<VNET>
2-
<ID>3</ID>
3-
<UID>0</UID>
4-
<GID>0</GID>
5-
<UNAME>oneadmin</UNAME>
6-
<GNAME>oneadmin</GNAME>
7-
<NAME>Red LAN</NAME>
8-
<TYPE>0</TYPE>
9-
<BRIDGE>vbr0</BRIDGE>
10-
<PUBLIC>0</PUBLIC>
11-
<TOTAL_LEASES>2</TOTAL_LEASES>
12-
<TEMPLATE>
13-
<BRIDGE>vbr0</BRIDGE>
14-
<DNS>192.169.1.4</DNS>
15-
<NAME>Red LAN</NAME>
16-
<NETWORK_ADDRESS>192.168.0.0</NETWORK_ADDRESS>
17-
<NETWORK_SIZE>C</NETWORK_SIZE>
18-
<TYPE>RANGED</TYPE>
19-
</TEMPLATE>
20-
<LEASES>
21-
<LEASE>
22-
<IP>192.168.0.1</IP>
23-
<MAC>00:03:c0:a8:00:01</MAC>
24-
<USED>1</USED>
25-
<VID>18</VID>
26-
</LEASE>
27-
</LEASES>
2+
<ID>3</ID>
3+
<UID>0</UID>
4+
<GID>0</GID>
5+
<UNAME>oneadmin</UNAME>
6+
<GNAME>oneadmin</GNAME>
7+
<NAME>Red LAN</NAME>
8+
<PERMISSIONS>
9+
<OWNER_U>1</OWNER_U>
10+
<OWNER_M>1</OWNER_M>
11+
<OWNER_A>0</OWNER_A>
12+
<GROUP_U>0</GROUP_U>
13+
<GROUP_M>0</GROUP_M>
14+
<GROUP_A>0</GROUP_A>
15+
<OTHER_U>1</OTHER_U>
16+
<OTHER_M>0</OTHER_M>
17+
<OTHER_A>0</OTHER_A>
18+
</PERMISSIONS>
19+
<CLUSTER_ID>-1</CLUSTER_ID>
20+
<CLUSTER/>
21+
<BRIDGE>vbr0</BRIDGE>
22+
<VLAN>1</VLAN>
23+
<PARENT_NETWORK_ID/>
24+
<PHYDEV><![CDATA[bond1]]></PHYDEV>
25+
<VLAN_ID><![CDATA[1337]]></VLAN_ID>
26+
<USED_LEASES>3</USED_LEASES>
27+
<TEMPLATE/>
28+
<AR_POOL>
29+
<AR>
30+
<ALLOCATED><![CDATA[ 0 68719479930 1 68719545020]]></ALLOCATED>
31+
<AR_ID><![CDATA[0]]></AR_ID>
32+
<IP><![CDATA[10.1.0.10]]></IP>
33+
<MAC><![CDATA[00:22:44:66:88:aa]]></MAC>
34+
<SIZE><![CDATA[507]]></SIZE>
35+
<TYPE><![CDATA[IP4]]></TYPE>
36+
</AR>
37+
<AR>
38+
<ALLOCATED><![CDATA[ 0 68719546783]]></ALLOCATED>
39+
<AR_ID><![CDATA[1]]></AR_ID>
40+
<IP><![CDATA[10.1.2.5]]></IP>
41+
<MAC><![CDATA[00:22:44:66:aa:cc]]></MAC>
42+
<SIZE><![CDATA[507]]></SIZE>
43+
<TYPE><![CDATA[IP4]]></TYPE>
44+
</AR>
45+
</AR_POOL>
2846
</VNET>

oca/tests/fixtures/vnetpool.xml

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,60 @@
11
<VNET_POOL>
22
<VNET>
33
<ID>4</ID>
4+
<UID>0</UID>
45
<GID>0</GID>
56
<UNAME>oneadmin</UNAME>
67
<GNAME>oneadmin</GNAME>
7-
<UID>0</UID>
8-
<USERNAME>oneadmin</USERNAME>
98
<NAME>Red LAN</NAME>
10-
<TYPE>0</TYPE>
9+
<PERMISSIONS>
10+
<OWNER_U>1</OWNER_U>
11+
<OWNER_M>1</OWNER_M>
12+
<OWNER_A>0</OWNER_A>
13+
<GROUP_U>0</GROUP_U>
14+
<GROUP_M>0</GROUP_M>
15+
<GROUP_A>0</GROUP_A>
16+
<OTHER_U>1</OTHER_U>
17+
<OTHER_M>0</OTHER_M>
18+
<OTHER_A>0</OTHER_A>
19+
</PERMISSIONS>
20+
<CLUSTER_ID>-1</CLUSTER_ID>
21+
<CLUSTER/>
1122
<BRIDGE>vbr0</BRIDGE>
12-
<TOTAL_LEASES>0</TOTAL_LEASES>
13-
<PUBLIC>0</PUBLIC>
14-
<TEMPLATE></TEMPLATE>
15-
<LEASES></LEASES>
23+
<VLAN>1</VLAN>
24+
<PARENT_NETWORK_ID/>
25+
<PHYDEV><![CDATA[bond1]]></PHYDEV>
26+
<VLAN_ID><![CDATA[1337]]></VLAN_ID>
27+
<USED_LEASES>3</USED_LEASES>
28+
<TEMPLATE/>
29+
<AR_POOL/>
1630
</VNET>
1731
<VNET>
18-
<ID>5</ID>
32+
<ID>9</ID>
1933
<UID>0</UID>
2034
<GID>0</GID>
2135
<UNAME>oneadmin</UNAME>
2236
<GNAME>oneadmin</GNAME>
23-
<USERNAME>oneadmin</USERNAME>
2437
<NAME>Public</NAME>
25-
<TYPE>0</TYPE>
38+
<PERMISSIONS>
39+
<OWNER_U>1</OWNER_U>
40+
<OWNER_M>1</OWNER_M>
41+
<OWNER_A>0</OWNER_A>
42+
<GROUP_U>0</GROUP_U>
43+
<GROUP_M>0</GROUP_M>
44+
<GROUP_A>0</GROUP_A>
45+
<OTHER_U>1</OTHER_U>
46+
<OTHER_M>0</OTHER_M>
47+
<OTHER_A>0</OTHER_A>
48+
</PERMISSIONS>
49+
<CLUSTER_ID>-1</CLUSTER_ID>
50+
<CLUSTER/>
2651
<BRIDGE>vbr0</BRIDGE>
27-
<TOTAL_LEASES>1</TOTAL_LEASES>
28-
<PUBLIC>1</PUBLIC>
29-
<TEMPLATE></TEMPLATE>
30-
<LEASES></LEASES>
52+
<VLAN>1</VLAN>
53+
<PARENT_NETWORK_ID/>
54+
<PHYDEV><![CDATA[bond1]]></PHYDEV>
55+
<VLAN_ID><![CDATA[42]]></VLAN_ID>
56+
<USED_LEASES>0</USED_LEASES>
57+
<TEMPLATE/>
58+
<AR_POOL/>
3159
</VNET>
3260
</VNET_POOL>

oca/tests/test_virtual_network.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,37 @@ def test_allocate(self):
2727
def test_publish(self):
2828
self.client.call = Mock(return_value='')
2929
h = oca.VirtualNetwork(self.xml, self.client)
30+
h._convert_types()
3031
h.publish()
31-
self.client.call.assert_called_once_with('vn.publish', '3', True)
32+
self.client.call.assert_called_once_with('vn.publish', 3, True)
3233

3334
def test_unpublish(self):
3435
self.client.call = Mock(return_value='')
3536
h = oca.VirtualNetwork(self.xml, self.client)
37+
h._convert_types()
3638
h.unpublish()
37-
self.client.call.assert_called_once_with('vn.publish', '3', False)
39+
self.client.call.assert_called_once_with('vn.publish', 3, False)
3840

3941
def test_repr(self):
4042
h = oca.VirtualNetwork(self.xml, self.client)
43+
h._convert_types()
4144
assert h.__repr__() == '<oca.VirtualNetwork("Red LAN")>'
4245

4346
def test_chown(self):
4447
self.client.call = Mock(return_value='')
4548
h = oca.VirtualNetwork(self.xml, self.client)
49+
h._convert_types()
4650
h.chown(2, 2)
47-
self.client.call.assert_called_once_with('vn.chown', '3', 2, 2)
51+
self.client.call.assert_called_once_with('vn.chown', 3, 2, 2)
52+
53+
def test_address_ranges(self):
54+
h = oca.VirtualNetwork(self.xml, self.client)
55+
h._convert_types()
56+
assert(2==len(h.address_ranges))
57+
assert(1==h.address_ranges[1].id)
58+
assert(0==h.address_ranges[0].id)
59+
assert(" 0 68719479930 1 68719545020"==h.address_ranges[0].allocated)
60+
assert("10.1.0.10"==h.address_ranges[0].ip)
61+
assert("00:22:44:66:88:aa"==h.address_ranges[0].mac)
62+
assert(507==h.address_ranges[0].size)
63+
assert("IP4"==h.address_ranges[0].type)

oca/vn.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,37 @@
11
# -*- coding: UTF-8 -*-
2-
from pool import Pool, PoolElement, Template
2+
from pool import XMLElement, Pool, PoolElement, Template
33

44

5+
class AddressRange(XMLElement):
6+
XML_TYPES = {
7+
'id' : ["AR_ID", lambda xml: int(xml.text)],
8+
'size' : int,
9+
#'template' : ['TEMPLATE', Template],
10+
}
11+
12+
def __init__(self, xml):
13+
super(AddressRange, self).__init__(xml)
14+
self._convert_types()
15+
self.id = self['AR_ID'] if self['AR_ID'] else None
16+
17+
class AddressRangeList(list):
18+
def __init__(self, xml):
19+
self.xml = xml
20+
for element in self.xml:
21+
self.append(self._factory(element))
22+
23+
def _factory(self, xml):
24+
v = AddressRange(xml)
25+
v._convert_types()
26+
return v
27+
528
class VirtualNetwork(PoolElement):
629
METHODS = {
730
'info' : 'vn.info',
831
'allocate' : 'vn.allocate',
932
'delete' : 'vn.delete',
1033
'publish' : 'vn.publish',
1134
'chown' : 'vn.chown',
12-
'addleases': 'vn.addleases',
13-
'rmleases' : 'vn.rmleases'
1435
}
1536

1637
XML_TYPES = {
@@ -20,11 +41,12 @@ class VirtualNetwork(PoolElement):
2041
'uname' : str,
2142
'gname' : str,
2243
'name' : str,
23-
'type' : int,
44+
#'type' : int,
2445
'bridge' : str,
25-
'public' : bool,
26-
'total_leases' : int,
46+
#'public' : bool,
47+
'used_leases' : int,
2748
'template' : ['TEMPLATE', Template],
49+
'address_ranges': ['AR_POOL', AddressRangeList],
2850
}
2951

3052
ELEMENT_NAME = 'VNET'
@@ -74,7 +96,6 @@ def chown(self, uid, gid):
7496
def __repr__(self):
7597
return '<oca.VirtualNetwork("%s")>' % self.name
7698

77-
7899
class VirtualNetworkPool(Pool):
79100
METHODS = {
80101
'info' : 'vnpool.info',
@@ -87,4 +108,3 @@ def _factory(self, xml):
87108
v = VirtualNetwork(xml, self.client)
88109
v._convert_types()
89110
return v
90-

setup.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding: UTF-8 -*-
2-
__version__ = '3.0.0-a1'
2+
__version__ = '4.10.0-a1'
33

44
import os
55

@@ -16,7 +16,7 @@
1616

1717
setup(name = 'oca',
1818
version=__version__,
19-
description='Bindings for XMLRPC OpenNebula Cloud API',
19+
description='Python Bindings for XMLRPC OpenNebula Cloud API',
2020
long_description=README + '\n\n' + CHANGES,
2121
test_suite = 'nose.collector',
2222
classifiers=[
@@ -26,9 +26,8 @@
2626
'Operating System :: OS Independent',
2727
],
2828
keywords='opennebula cloud xmlrpc',
29-
author=u'Łukasz Oleś',
30-
author_email='[email protected]',
31-
url='https://github.com/lukaszo/python-oca',
29+
author=u'Łukasz Oleś, Matthias Schmitz, Michael Schmidt',
30+
url='https://github.com/python-oca/python-oca',
3231
license='Apache License 2.0',
3332
packages=['oca'],
3433
)

0 commit comments

Comments
 (0)