diff --git a/doc/api_samples/os-cloudpipe/cloud-pipe-create-req.json b/doc/api_samples/os-cloudpipe/cloud-pipe-create-req.json
new file mode 100644
index 000000000000..dd1cf348c69d
--- /dev/null
+++ b/doc/api_samples/os-cloudpipe/cloud-pipe-create-req.json
@@ -0,0 +1,5 @@
+{
+ "cloudpipe": {
+ "project_id": "cloudpipe-059f21e3-c20e-4efc-9e7a-eba2ab3c6f9a"
+ }
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-cloudpipe/cloud-pipe-create-req.xml b/doc/api_samples/os-cloudpipe/cloud-pipe-create-req.xml
new file mode 100644
index 000000000000..e80a9113dca4
--- /dev/null
+++ b/doc/api_samples/os-cloudpipe/cloud-pipe-create-req.xml
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/doc/api_samples/os-cloudpipe/cloud-pipe-create-resp.json b/doc/api_samples/os-cloudpipe/cloud-pipe-create-resp.json
new file mode 100644
index 000000000000..8c555bf99dfb
--- /dev/null
+++ b/doc/api_samples/os-cloudpipe/cloud-pipe-create-resp.json
@@ -0,0 +1,5 @@
+{
+ "cloudpipe": {
+ "instance_id": "72afecab-24b0-437e-b1d9-88a83be701b3"
+ }
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-cloudpipe/cloud-pipe-create-resp.xml b/doc/api_samples/os-cloudpipe/cloud-pipe-create-resp.xml
new file mode 100644
index 000000000000..fafa90a3bea8
--- /dev/null
+++ b/doc/api_samples/os-cloudpipe/cloud-pipe-create-resp.xml
@@ -0,0 +1,4 @@
+
+
+ 1a17f615-343b-430f-976a-457c029eddb7
+
\ No newline at end of file
diff --git a/doc/api_samples/os-cloudpipe/cloud-pipe-get-resp.json b/doc/api_samples/os-cloudpipe/cloud-pipe-get-resp.json
new file mode 100644
index 000000000000..9efac48bbad6
--- /dev/null
+++ b/doc/api_samples/os-cloudpipe/cloud-pipe-get-resp.json
@@ -0,0 +1,15 @@
+{
+ "cloudpipes": [
+ {
+ "cloudpipe": {
+ "created_at": "2012-09-25T18:18:55Z",
+ "instance_id": "72afecab-24b0-437e-b1d9-88a83be701b3",
+ "internal_ip": "192.168.0.3",
+ "project_id": "cloudpipe-059f21e3-c20e-4efc-9e7a-eba2ab3c6f9a",
+ "public_ip": "127.0.0.1",
+ "public_port": 22,
+ "state": "down"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/doc/api_samples/os-cloudpipe/cloud-pipe-get-resp.xml b/doc/api_samples/os-cloudpipe/cloud-pipe-get-resp.xml
new file mode 100644
index 000000000000..6981aa5bd7c1
--- /dev/null
+++ b/doc/api_samples/os-cloudpipe/cloud-pipe-get-resp.xml
@@ -0,0 +1,12 @@
+
+
+
+ 127.0.0.1
+ 2012-09-25T18:18:49Z
+ 22
+ down
+ 1a17f615-343b-430f-976a-457c029eddb7
+ 192.168.0.3
+ cloudpipe-6405f2ca-caf9-493b-a1f6-e55f595d75ab
+
+
\ No newline at end of file
diff --git a/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-req.json.tpl b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-req.json.tpl
new file mode 100644
index 000000000000..c8fc75995a95
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-req.json.tpl
@@ -0,0 +1,5 @@
+{
+ "cloudpipe": {
+ "project_id": "%(project_id)s"
+ }
+}
diff --git a/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-req.xml.tpl b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-req.xml.tpl
new file mode 100644
index 000000000000..b0a60b896c37
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-req.xml.tpl
@@ -0,0 +1,3 @@
+
diff --git a/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-resp.json.tpl b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-resp.json.tpl
new file mode 100644
index 000000000000..6aa2ff60e2b2
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-resp.json.tpl
@@ -0,0 +1,3 @@
+{
+ "instance_id": "%(id)s"
+}
diff --git a/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-resp.xml.tpl b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-resp.xml.tpl
new file mode 100644
index 000000000000..63064cc51ab0
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-create-resp.xml.tpl
@@ -0,0 +1,3 @@
+
+ %(uuid)s
+
diff --git a/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-get-resp.json.tpl b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-get-resp.json.tpl
new file mode 100644
index 000000000000..cec85fc5cc3c
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-get-resp.json.tpl
@@ -0,0 +1,13 @@
+{
+ "cloudpipes": [
+ {
+ "created_at": "%(timestamp)s",
+ "instance_id": "%(uuid)s",
+ "internal_ip": "%(ip)s",
+ "project_id": "%(project_id)s",
+ "public_ip": "%(ip)s",
+ "public_port": 22,
+ "state": "down"
+ }
+ ]
+}
diff --git a/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-get-resp.xml.tpl b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-get-resp.xml.tpl
new file mode 100644
index 000000000000..417ca3305d50
--- /dev/null
+++ b/nova/tests/integrated/api_samples/os-cloudpipe/cloud-pipe-get-resp.xml.tpl
@@ -0,0 +1,12 @@
+
+
+
+ %(ip)s
+ %(timestamp)s
+ 22
+ down
+ %(uuid)s
+ %(ip)s
+ %(project_id)s
+
+
diff --git a/nova/tests/integrated/test_api_samples.py b/nova/tests/integrated/test_api_samples.py
index df239db2a5b7..d89173d99e44 100644
--- a/nova/tests/integrated/test_api_samples.py
+++ b/nova/tests/integrated/test_api_samples.py
@@ -20,8 +20,10 @@ import uuid
from lxml import etree
+from nova.cloudpipe.pipelib import CloudPipe
from nova import context
from nova import flags
+from nova.network.manager import NetworkManager
from nova.openstack.common import importutils
from nova.openstack.common import jsonutils
from nova.openstack.common.log import logging
@@ -987,3 +989,49 @@ class VirtualInterfacesJsonTest(ServersSampleBase):
class VirtualInterfacesXmlTest(VirtualInterfacesJsonTest):
ctype = 'xml'
+
+
+class CloudPipeSampleJsonTest(ApiSampleTestBase):
+ extension_name = "nova.api.openstack.compute.contrib.cloudpipe.Cloudpipe"
+
+ def setUp(self):
+ super(CloudPipeSampleJsonTest, self).setUp()
+
+ def get_user_data(self, project_id):
+ """Stub method to generate user data for cloudpipe tests"""
+ return "VVNFUiBEQVRB\n"
+
+ def network_api_get(self, context, network_uuid):
+ """Stub to get a valid network and its information"""
+ return {'vpn_public_address': '127.0.0.1',
+ 'vpn_public_port': 22}
+
+ self.stubs.Set(CloudPipe, 'get_encoded_zip', get_user_data)
+ self.stubs.Set(NetworkManager, "get_network", network_api_get)
+
+ def test_cloud_pipe_create(self):
+ """Get api samples of cloud pipe extension creation"""
+ FLAGS.vpn_image_id = fake.get_valid_image_id()
+ project = {'project_id': 'cloudpipe-' + str(uuid.uuid4())}
+ response = self._do_post('os-cloudpipe', 'cloud-pipe-create-req',
+ project)
+ self.assertEqual(response.status, 200)
+ subs = self._get_regexes()
+ subs.update(project)
+ subs['image_id'] = FLAGS.vpn_image_id
+ self._verify_response('cloud-pipe-create-resp', subs, response)
+ return project
+
+ def test_cloud_pipe_list(self):
+ """Get api samples of cloud pipe extension get request"""
+ project = self.test_cloud_pipe_create()
+ response = self._do_get('os-cloudpipe')
+ self.assertEqual(response.status, 200)
+ subs = self._get_regexes()
+ subs.update(project)
+ subs['image_id'] = FLAGS.vpn_image_id
+ return self._verify_response('cloud-pipe-get-resp', subs, response)
+
+
+class CloudPipeSampleXmlTest(CloudPipeSampleJsonTest):
+ ctype = "xml"