diff --git a/doc/api_samples/os-networks/network-add-req.json b/doc/api_samples/os-networks/network-add-req.json
new file mode 100644
index 000000000000..eca9c65b8bc1
--- /dev/null
+++ b/doc/api_samples/os-networks/network-add-req.json
@@ -0,0 +1 @@
+{"id": "1"}
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/network-add-req.xml b/doc/api_samples/os-networks/network-add-req.xml
new file mode 100644
index 000000000000..3ba873da3667
--- /dev/null
+++ b/doc/api_samples/os-networks/network-add-req.xml
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/network-create-req.json b/doc/api_samples/os-networks/network-create-req.json
new file mode 100644
index 000000000000..422e772345fd
--- /dev/null
+++ b/doc/api_samples/os-networks/network-create-req.json
@@ -0,0 +1,6 @@
+{
+ "network": {
+ "label": "new net 111",
+ "cidr": "10.20.105.0/24"
+ }
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/network-create-req.xml b/doc/api_samples/os-networks/network-create-req.xml
new file mode 100644
index 000000000000..890d7bf3a1e5
--- /dev/null
+++ b/doc/api_samples/os-networks/network-create-req.xml
@@ -0,0 +1,4 @@
+
+
+ 10.20.105.0/24
+
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/network-create-resp.json b/doc/api_samples/os-networks/network-create-resp.json
new file mode 100644
index 000000000000..194694a77f7b
--- /dev/null
+++ b/doc/api_samples/os-networks/network-create-resp.json
@@ -0,0 +1,32 @@
+{
+ "network": {
+ "bridge": null,
+ "bridge_interface": null,
+ "broadcast": "10.20.105.255",
+ "cidr": "10.20.105.0/24",
+ "cidr_v6": null,
+ "created_at": null,
+ "deleted": null,
+ "deleted_at": null,
+ "dhcp_start": "10.20.105.2",
+ "dns1": null,
+ "dns2": null,
+ "gateway": "10.20.105.1",
+ "gateway_v6": null,
+ "host": null,
+ "id": "668687f9-d724-4976-a6f4-a6fd3ad83da3",
+ "injected": null,
+ "label": "new net 111",
+ "multi_host": null,
+ "netmask": "255.255.255.0",
+ "netmask_v6": null,
+ "priority": null,
+ "project_id": null,
+ "rxtx_base": null,
+ "updated_at": null,
+ "vlan": null,
+ "vpn_private_address": null,
+ "vpn_public_address": null,
+ "vpn_public_port": null
+ }
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/network-create-resp.xml b/doc/api_samples/os-networks/network-create-resp.xml
new file mode 100644
index 000000000000..f638228ef50d
--- /dev/null
+++ b/doc/api_samples/os-networks/network-create-resp.xml
@@ -0,0 +1,31 @@
+
+
+ None
+ None
+ 10.20.105.2
+ None
+ None
+ 1bbbed2b-0daa-47a1-b869-1981c29150b1
+ None
+ None
+ 10.20.105.1
+ None
+
+ None
+ None
+ None
+ False
+ None
+ 10.20.105.255
+ 255.255.255.0
+ None
+ 10.20.105.0/24
+ None
+ None
+ None
+ None
+ None
+ None
+ None
+ None
+
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/network-show-resp.json b/doc/api_samples/os-networks/network-show-resp.json
new file mode 100644
index 000000000000..f3d7a18ce84b
--- /dev/null
+++ b/doc/api_samples/os-networks/network-show-resp.json
@@ -0,0 +1,32 @@
+{
+ "network": {
+ "bridge": "br100",
+ "bridge_interface": "eth0",
+ "broadcast": "10.0.0.7",
+ "cidr": "10.0.0.0/29",
+ "cidr_v6": null,
+ "created_at": "2011-08-15 06:19:19.387525",
+ "deleted": false,
+ "deleted_at": null,
+ "dhcp_start": "10.0.0.3",
+ "dns1": null,
+ "dns2": null,
+ "gateway": "10.0.0.1",
+ "gateway_v6": null,
+ "host": "nsokolov-desktop",
+ "id": "20c8acc0-f747-4d71-a389-46d078ebf047",
+ "injected": false,
+ "label": "mynet_0",
+ "multi_host": false,
+ "netmask": "255.255.255.248",
+ "netmask_v6": null,
+ "priority": null,
+ "project_id": "1234",
+ "rxtx_base": null,
+ "updated_at": "2011-08-16 09:26:13.048257",
+ "vlan": 100,
+ "vpn_private_address": "10.0.0.2",
+ "vpn_public_address": "127.0.0.1",
+ "vpn_public_port": 1000
+ }
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/network-show-resp.xml b/doc/api_samples/os-networks/network-show-resp.xml
new file mode 100644
index 000000000000..2faed7a286c2
--- /dev/null
+++ b/doc/api_samples/os-networks/network-show-resp.xml
@@ -0,0 +1,31 @@
+
+
+ br100
+ 1000
+ 10.0.0.3
+ eth0
+ 2011-08-16 09:26:13.048257
+ 20c8acc0-f747-4d71-a389-46d078ebf047
+ None
+ None
+ 10.0.0.1
+ None
+
+ None
+ 1234
+ 10.0.0.2
+ False
+ 100
+ 10.0.0.7
+ 255.255.255.248
+ False
+ 10.0.0.0/29
+ 127.0.0.1
+ False
+ None
+ 2011-08-15 06:19:19.387525
+ nsokolov-desktop
+ None
+ None
+ None
+
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/networks-disassociate-req.json b/doc/api_samples/os-networks/networks-disassociate-req.json
new file mode 100644
index 000000000000..81e17d8095f6
--- /dev/null
+++ b/doc/api_samples/os-networks/networks-disassociate-req.json
@@ -0,0 +1 @@
+{"disassociate": null}
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/networks-disassociate-req.xml b/doc/api_samples/os-networks/networks-disassociate-req.xml
new file mode 100644
index 000000000000..85762fd0dfc9
--- /dev/null
+++ b/doc/api_samples/os-networks/networks-disassociate-req.xml
@@ -0,0 +1 @@
+None
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/networks-list-resp.json b/doc/api_samples/os-networks/networks-list-resp.json
new file mode 100644
index 000000000000..90da7c15d458
--- /dev/null
+++ b/doc/api_samples/os-networks/networks-list-resp.json
@@ -0,0 +1,64 @@
+{
+ "networks": [
+ {
+ "bridge": "br100",
+ "bridge_interface": "eth0",
+ "broadcast": "10.0.0.7",
+ "cidr": "10.0.0.0/29",
+ "cidr_v6": null,
+ "created_at": "2011-08-15 06:19:19.387525",
+ "deleted": false,
+ "deleted_at": null,
+ "dhcp_start": "10.0.0.3",
+ "dns1": null,
+ "dns2": null,
+ "gateway": "10.0.0.1",
+ "gateway_v6": null,
+ "host": "nsokolov-desktop",
+ "id": "20c8acc0-f747-4d71-a389-46d078ebf047",
+ "injected": false,
+ "label": "mynet_0",
+ "multi_host": false,
+ "netmask": "255.255.255.248",
+ "netmask_v6": null,
+ "priority": null,
+ "project_id": "1234",
+ "rxtx_base": null,
+ "updated_at": "2011-08-16 09:26:13.048257",
+ "vlan": 100,
+ "vpn_private_address": "10.0.0.2",
+ "vpn_public_address": "127.0.0.1",
+ "vpn_public_port": 1000
+ },
+ {
+ "bridge": "br101",
+ "bridge_interface": "eth0",
+ "broadcast": "10.0.0.15",
+ "cidr": "10.0.0.10/29",
+ "cidr_v6": null,
+ "created_at": "2011-08-15 06:19:19.885495",
+ "deleted": false,
+ "deleted_at": null,
+ "dhcp_start": "10.0.0.11",
+ "dns1": null,
+ "dns2": null,
+ "gateway": "10.0.0.9",
+ "gateway_v6": null,
+ "host": null,
+ "id": "20c8acc0-f747-4d71-a389-46d078ebf000",
+ "injected": false,
+ "label": "mynet_1",
+ "multi_host": false,
+ "netmask": "255.255.255.248",
+ "netmask_v6": null,
+ "priority": null,
+ "project_id": null,
+ "rxtx_base": null,
+ "updated_at": null,
+ "vlan": 101,
+ "vpn_private_address": "10.0.0.10",
+ "vpn_public_address": null,
+ "vpn_public_port": 1001
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-networks/networks-list-resp.xml b/doc/api_samples/os-networks/networks-list-resp.xml
new file mode 100644
index 000000000000..59620c228b17
--- /dev/null
+++ b/doc/api_samples/os-networks/networks-list-resp.xml
@@ -0,0 +1,63 @@
+
+
+
+ br100
+ 1000
+ 10.0.0.3
+ eth0
+ 2011-08-16 09:26:13.048257
+ 20c8acc0-f747-4d71-a389-46d078ebf047
+ None
+ None
+ 10.0.0.1
+ None
+
+ None
+ 1234
+ 10.0.0.2
+ False
+ 100
+ 10.0.0.7
+ 255.255.255.248
+ False
+ 10.0.0.0/29
+ 127.0.0.1
+ False
+ None
+ 2011-08-15 06:19:19.387525
+ nsokolov-desktop
+ None
+ None
+ None
+
+
+ br101
+ 1001
+ 10.0.0.11
+ eth0
+ None
+ 20c8acc0-f747-4d71-a389-46d078ebf000
+ None
+ None
+ 10.0.0.9
+ None
+
+ None
+ None
+ 10.0.0.10
+ False
+ 101
+ 10.0.0.15
+ 255.255.255.248
+ False
+ 10.0.0.10/29
+ None
+ False
+ None
+ 2011-08-15 06:19:19.885495
+ None
+ None
+ None
+ None
+
+
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/os-networks/network-add-req.json.tpl b/nova/tests/integrated/api_samples/os-networks/network-add-req.json.tpl
new file mode 100644
index 000000000000..6489f6e1b5ad
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/network-add-req.json.tpl
@@ -0,0 +1 @@
+{"id": "1"}
diff --git a/nova/tests/integrated/api_samples/os-networks/network-add-req.xml.tpl b/nova/tests/integrated/api_samples/os-networks/network-add-req.xml.tpl
new file mode 100644
index 000000000000..9e5822a9e851
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/network-add-req.xml.tpl
@@ -0,0 +1 @@
+1
diff --git a/nova/tests/integrated/api_samples/os-networks/network-create-req.json.tpl b/nova/tests/integrated/api_samples/os-networks/network-create-req.json.tpl
new file mode 100644
index 000000000000..5e2be031cbd9
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/network-create-req.json.tpl
@@ -0,0 +1,6 @@
+{
+ "network": {
+ "label": "new net 111",
+ "cidr": "10.20.105.0/24"
+ }
+}
diff --git a/nova/tests/integrated/api_samples/os-networks/network-create-req.xml.tpl b/nova/tests/integrated/api_samples/os-networks/network-create-req.xml.tpl
new file mode 100644
index 000000000000..d5222f9e8fe1
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/network-create-req.xml.tpl
@@ -0,0 +1,4 @@
+
+
+ 10.20.105.0/24
+
diff --git a/nova/tests/integrated/api_samples/os-networks/network-create-resp.json.tpl b/nova/tests/integrated/api_samples/os-networks/network-create-resp.json.tpl
new file mode 100644
index 000000000000..e178ab50cb9b
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/network-create-resp.json.tpl
@@ -0,0 +1,32 @@
+{
+ "network": {
+ "bridge": null,
+ "vpn_public_port": null,
+ "dhcp_start": "%(ip)s",
+ "bridge_interface": null,
+ "updated_at": null,
+ "id": "%(id)s",
+ "cidr_v6": null,
+ "deleted_at": null,
+ "gateway": "%(ip)s",
+ "rxtx_base": null,
+ "label": "new net 111",
+ "priority": null,
+ "project_id": null,
+ "vpn_private_address": null,
+ "deleted": null,
+ "vlan": null,
+ "broadcast": "%(ip)s",
+ "netmask": "%(ip)s",
+ "injected": null,
+ "cidr": "10.20.105.0/24",
+ "vpn_public_address": null,
+ "multi_host": null,
+ "dns2": null,
+ "created_at": null,
+ "host": null,
+ "gateway_v6": null,
+ "netmask_v6": null,
+ "dns1": null
+ }
+}
diff --git a/nova/tests/integrated/api_samples/os-networks/network-create-resp.xml.tpl b/nova/tests/integrated/api_samples/os-networks/network-create-resp.xml.tpl
new file mode 100644
index 000000000000..d709952cda26
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/network-create-resp.xml.tpl
@@ -0,0 +1,30 @@
+
+ None
+ None
+ %(ip)s
+ None
+ None
+ %(id)s
+ None
+ None
+ %(ip)s
+ None
+
+ None
+ None
+ None
+ False
+ None
+ %(ip)s
+ %(ip)s
+ None
+ 10.20.105.0/24
+ None
+ None
+ None
+ None
+ None
+ None
+ None
+ None
+
diff --git a/nova/tests/integrated/api_samples/os-networks/network-show-resp.json.tpl b/nova/tests/integrated/api_samples/os-networks/network-show-resp.json.tpl
new file mode 100644
index 000000000000..5c3630c5d593
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/network-show-resp.json.tpl
@@ -0,0 +1,33 @@
+{
+ "network":
+ {
+ "bridge": "br100",
+ "bridge_interface": "eth0",
+ "broadcast": "%(ip)s",
+ "cidr": "10.0.0.0/29",
+ "cidr_v6": null,
+ "created_at": "%(timestamp)s",
+ "deleted": false,
+ "deleted_at": null,
+ "dhcp_start": "%(ip)s",
+ "dns1": null,
+ "dns2": null,
+ "gateway": "%(ip)s",
+ "gateway_v6": null,
+ "host": "nsokolov-desktop",
+ "id": "%(id)s",
+ "injected": false,
+ "label": "mynet_0",
+ "multi_host": false,
+ "netmask": "%(ip)s",
+ "netmask_v6": null,
+ "priority": null,
+ "project_id": "1234",
+ "rxtx_base": null,
+ "updated_at": "%(timestamp)s",
+ "vlan": 100,
+ "vpn_private_address": "%(ip)s",
+ "vpn_public_address": "%(ip)s",
+ "vpn_public_port": 1000
+ }
+}
diff --git a/nova/tests/integrated/api_samples/os-networks/network-show-resp.xml.tpl b/nova/tests/integrated/api_samples/os-networks/network-show-resp.xml.tpl
new file mode 100644
index 000000000000..7989f47e4bea
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/network-show-resp.xml.tpl
@@ -0,0 +1,31 @@
+
+
+ br100
+ 1000
+ %(ip)s
+ eth0
+ %(timestamp)s
+ %(id)s
+ None
+ None
+ %(ip)s
+ None
+
+ None
+ 1234
+ %(ip)s
+ False
+ 100
+ %(ip)s
+ %(ip)s
+ False
+ 10.0.0.0/29
+ %(ip)s
+ False
+ None
+ %(timestamp)s
+ nsokolov-desktop
+ None
+ None
+ None
+
diff --git a/nova/tests/integrated/api_samples/os-networks/networks-disassociate-req.json.tpl b/nova/tests/integrated/api_samples/os-networks/networks-disassociate-req.json.tpl
new file mode 100644
index 000000000000..df99b889c408
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/networks-disassociate-req.json.tpl
@@ -0,0 +1 @@
+{"disassociate": null}
diff --git a/nova/tests/integrated/api_samples/os-networks/networks-disassociate-req.xml.tpl b/nova/tests/integrated/api_samples/os-networks/networks-disassociate-req.xml.tpl
new file mode 100644
index 000000000000..63c0300904b3
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/networks-disassociate-req.xml.tpl
@@ -0,0 +1 @@
+None
diff --git a/nova/tests/integrated/api_samples/os-networks/networks-list-resp.json.tpl b/nova/tests/integrated/api_samples/os-networks/networks-list-resp.json.tpl
new file mode 100644
index 000000000000..6da3fb2e2b0e
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/networks-list-resp.json.tpl
@@ -0,0 +1,64 @@
+{
+ "networks": [
+ {
+ "bridge": "br100",
+ "bridge_interface": "eth0",
+ "broadcast": "%(ip)s",
+ "cidr": "10.0.0.0/29",
+ "cidr_v6": null,
+ "created_at": "%(timestamp)s",
+ "deleted": false,
+ "deleted_at": null,
+ "dhcp_start": "%(ip)s",
+ "dns1": null,
+ "dns2": null,
+ "gateway": "%(ip)s",
+ "gateway_v6": null,
+ "host": "nsokolov-desktop",
+ "id": "%(id)s",
+ "injected": false,
+ "label": "mynet_0",
+ "multi_host": false,
+ "netmask": "%(ip)s",
+ "netmask_v6": null,
+ "priority": null,
+ "project_id": "1234",
+ "rxtx_base": null,
+ "updated_at": "%(timestamp)s",
+ "vlan": 100,
+ "vpn_private_address": "%(ip)s",
+ "vpn_public_address": "%(ip)s",
+ "vpn_public_port": 1000
+ },
+ {
+ "bridge": "br101",
+ "bridge_interface": "eth0",
+ "broadcast": "%(ip)s",
+ "cidr": "10.0.0.10/29",
+ "cidr_v6": null,
+ "created_at": "%(timestamp)s",
+ "deleted": false,
+ "deleted_at": null,
+ "dhcp_start": "%(ip)s",
+ "dns1": null,
+ "dns2": null,
+ "gateway": "%(ip)s",
+ "gateway_v6": null,
+ "host": null,
+ "id": "%(id)s",
+ "injected": false,
+ "label": "mynet_1",
+ "multi_host": false,
+ "netmask": "%(ip)s",
+ "netmask_v6": null,
+ "priority": null,
+ "project_id": null,
+ "rxtx_base": null,
+ "updated_at": null,
+ "vlan": 101,
+ "vpn_private_address": "%(ip)s",
+ "vpn_public_address": null,
+ "vpn_public_port": 1001
+ }
+ ]
+}
diff --git a/nova/tests/integrated/api_samples/os-networks/networks-list-resp.xml.tpl b/nova/tests/integrated/api_samples/os-networks/networks-list-resp.xml.tpl
new file mode 100644
index 000000000000..c01c08337864
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-networks/networks-list-resp.xml.tpl
@@ -0,0 +1,63 @@
+
+
+
+ br100
+ 1000
+ %(ip)s
+ eth0
+ %(timestamp)s
+ %(id)s
+ None
+ None
+ %(ip)s
+ None
+
+ None
+ 1234
+ %(ip)s
+ False
+ 100
+ %(ip)s
+ %(ip)s
+ False
+ 10.0.0.0/29
+ %(ip)s
+ False
+ None
+ %(timestamp)s
+ nsokolov-desktop
+ None
+ None
+ None
+
+
+ br101
+ 1001
+ %(ip)s
+ eth0
+ None
+ %(id)s
+ None
+ None
+ %(ip)s
+ None
+
+ None
+ None
+ %(ip)s
+ False
+ 101
+ %(ip)s
+ %(ip)s
+ False
+ 10.0.0.10/29
+ None
+ False
+ None
+ %(timestamp)s
+ None
+ None
+ None
+ None
+
+
diff --git a/nova/tests/integrated/test_api_samples.py b/nova/tests/integrated/test_api_samples.py
index f1f86d21b94c..d688d900df73 100644
--- a/nova/tests/integrated/test_api_samples.py
+++ b/nova/tests/integrated/test_api_samples.py
@@ -44,6 +44,7 @@ import nova.quota
from nova.scheduler import driver
from nova import test
from nova.tests.api.openstack.compute.contrib import test_fping
+from nova.tests.api.openstack.compute.contrib import test_networks
from nova.tests.baremetal.db import base as bm_db_base
from nova.tests import fake_network
from nova.tests.image import fake
@@ -381,7 +382,6 @@ class ApiSamplesTrap(ApiSampleTestBase):
do_not_approve_additions.append('os-flavor-access')
do_not_approve_additions.append('os-floating-ip-dns')
do_not_approve_additions.append('os-hypervisors')
- do_not_approve_additions.append('os-networks')
do_not_approve_additions.append('os-services')
do_not_approve_additions.append('os-volumes')
@@ -2423,6 +2423,62 @@ class OsNetworksJsonTests(ApiSampleTestBase):
self.assertEqual(response.status, 202)
+class NetworksJsonTests(ApiSampleTestBase):
+ extension_name = ("nova.api.openstack.compute.contrib"
+ ".os_networks.Os_networks")
+
+ def setUp(self):
+ super(NetworksJsonTests, self).setUp()
+ fake_network_api = test_networks.FakeNetworkAPI()
+ self.stubs.Set(network_api.API, "get_all",
+ fake_network_api.get_all)
+ self.stubs.Set(network_api.API, "get",
+ fake_network_api.get)
+ self.stubs.Set(network_api.API, "associate",
+ fake_network_api.associate)
+ self.stubs.Set(network_api.API, "delete",
+ fake_network_api.delete)
+ self.stubs.Set(network_api.API, "create",
+ fake_network_api.create)
+ self.stubs.Set(network_api.API, "add_network_to_project",
+ fake_network_api.add_network_to_project)
+
+ def test_network_list(self):
+ response = self._do_get('os-networks')
+ self.assertEqual(response.status, 200)
+ subs = self._get_regexes()
+ self._verify_response('networks-list-resp', subs, response)
+
+ def test_network_disassociate(self):
+ uuid = test_networks.FAKE_NETWORKS[0]['uuid']
+ response = self._do_post('os-networks/%s/action' % uuid,
+ 'networks-disassociate-req', {})
+ self.assertEqual(response.status, 202)
+
+ def test_network_show(self):
+ uuid = test_networks.FAKE_NETWORKS[0]['uuid']
+ response = self._do_get('os-networks/%s' % uuid)
+ self.assertEqual(response.status, 200)
+ subs = self._get_regexes()
+ self._verify_response('network-show-resp', subs, response)
+
+ def test_network_create(self):
+ response = self._do_post("os-networks",
+ 'network-create-req', {})
+ self.assertEqual(response.status, 200)
+ subs = self._get_regexes()
+ self._verify_response('network-create-resp', subs, response)
+
+ def test_network_add(self):
+ response = self._do_post("os-networks/add",
+ 'network-add-req', {})
+ self.assertEqual(response.status, 202)
+
+
+class NetworksXmlTests(NetworksJsonTests):
+ ctype = 'xml'
+
+
class NetworksAssociateJsonTests(ApiSampleTestBase):
extension_name = ("nova.api.openstack.compute.contrib"
".networks_associate.Networks_associate")