diff --git a/doc/api_samples/os-agents/agent-post-req.json b/doc/api_samples/os-agents/agent-post-req.json
index 217993b17f..1913498547 100644
--- a/doc/api_samples/os-agents/agent-post-req.json
+++ b/doc/api_samples/os-agents/agent-post-req.json
@@ -5,6 +5,6 @@
"architecture": "x86",
"version": "8.0",
"md5hash": "add6bb58e139be103324d04d82d8f545",
- "url": "xxxxxxxxxxxx"
+ "url": "http://example.com/path/to/resource"
}
-}
\ No newline at end of file
+}
diff --git a/doc/api_samples/os-agents/agent-post-req.xml b/doc/api_samples/os-agents/agent-post-req.xml
index be93e97ce4..b7b7d036ba 100644
--- a/doc/api_samples/os-agents/agent-post-req.xml
+++ b/doc/api_samples/os-agents/agent-post-req.xml
@@ -5,5 +5,5 @@
x86
8.0
add6bb58e139be103324d04d82d8f545
- xxxxxxxxxxxx
-
\ No newline at end of file
+ http://example.com/path/to/resource
+
diff --git a/doc/api_samples/os-agents/agent-post-resp.json b/doc/api_samples/os-agents/agent-post-resp.json
index f6c760cc67..24ddede90b 100644
--- a/doc/api_samples/os-agents/agent-post-resp.json
+++ b/doc/api_samples/os-agents/agent-post-resp.json
@@ -5,7 +5,7 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
- "url": "xxxxxxxxxxxx",
+ "url": "http://example.com/path/to/resource",
"version": "8.0"
}
-}
\ No newline at end of file
+}
diff --git a/doc/api_samples/os-agents/agent-post-resp.xml b/doc/api_samples/os-agents/agent-post-resp.xml
index 79f62b7fb9..abfe15f909 100644
--- a/doc/api_samples/os-agents/agent-post-resp.xml
+++ b/doc/api_samples/os-agents/agent-post-resp.xml
@@ -1,10 +1,10 @@
- xxxxxxxxxxxx
+ http://example.com/path/to/resource
hypervisor
add6bb58e139be103324d04d82d8f545
8.0
x86
os
1
-
\ No newline at end of file
+
diff --git a/doc/api_samples/os-agents/agent-update-put-req.json b/doc/api_samples/os-agents/agent-update-put-req.json
index e4eaf53525..f7398504d6 100644
--- a/doc/api_samples/os-agents/agent-update-put-req.json
+++ b/doc/api_samples/os-agents/agent-update-put-req.json
@@ -1,7 +1,7 @@
{
"para": {
- "url": "xxx://xxxx/xxx/xxx",
+ "url": "http://example.com/path/to/resource",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"version": "7.0"
}
-}
\ No newline at end of file
+}
diff --git a/doc/api_samples/os-agents/agent-update-put-req.xml b/doc/api_samples/os-agents/agent-update-put-req.xml
index f759880c17..9a25cefdda 100644
--- a/doc/api_samples/os-agents/agent-update-put-req.xml
+++ b/doc/api_samples/os-agents/agent-update-put-req.xml
@@ -1,6 +1,6 @@
7.0
- xxx://xxxx/xxx/xxx
+ http://example.com/path/to/resource
add6bb58e139be103324d04d82d8f545
-
\ No newline at end of file
+
diff --git a/doc/api_samples/os-agents/agent-update-put-resp.json b/doc/api_samples/os-agents/agent-update-put-resp.json
index 6b67222c8c..2919d21388 100644
--- a/doc/api_samples/os-agents/agent-update-put-resp.json
+++ b/doc/api_samples/os-agents/agent-update-put-resp.json
@@ -2,7 +2,7 @@
"agent": {
"agent_id": "1",
"md5hash": "add6bb58e139be103324d04d82d8f545",
- "url": "xxx://xxxx/xxx/xxx",
+ "url": "http://example.com/path/to/resource",
"version": "7.0"
}
-}
\ No newline at end of file
+}
diff --git a/doc/api_samples/os-agents/agent-update-put-resp.xml b/doc/api_samples/os-agents/agent-update-put-resp.xml
index badf2750ea..ce62db3868 100644
--- a/doc/api_samples/os-agents/agent-update-put-resp.xml
+++ b/doc/api_samples/os-agents/agent-update-put-resp.xml
@@ -1,7 +1,7 @@
- xxx://xxxx/xxx/xxx
+ http://example.com/path/to/resource
7.0
1
add6bb58e139be103324d04d82d8f545
-
\ No newline at end of file
+
diff --git a/doc/api_samples/os-agents/agents-get-resp.json b/doc/api_samples/os-agents/agents-get-resp.json
index 73ba45c240..92e14e1dc5 100644
--- a/doc/api_samples/os-agents/agents-get-resp.json
+++ b/doc/api_samples/os-agents/agents-get-resp.json
@@ -6,8 +6,8 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
- "url": "xxxxxxxxxxxx",
+ "url": "http://example.com/path/to/resource",
"version": "8.0"
}
]
-}
\ No newline at end of file
+}
diff --git a/doc/api_samples/os-agents/agents-get-resp.xml b/doc/api_samples/os-agents/agents-get-resp.xml
index 4194f62c96..d804245305 100644
--- a/doc/api_samples/os-agents/agents-get-resp.xml
+++ b/doc/api_samples/os-agents/agents-get-resp.xml
@@ -1,4 +1,4 @@
-
-
\ No newline at end of file
+
+
diff --git a/doc/v3/api_samples/os-agents/agent-post-req.json b/doc/v3/api_samples/os-agents/agent-post-req.json
index 217993b17f..1913498547 100644
--- a/doc/v3/api_samples/os-agents/agent-post-req.json
+++ b/doc/v3/api_samples/os-agents/agent-post-req.json
@@ -5,6 +5,6 @@
"architecture": "x86",
"version": "8.0",
"md5hash": "add6bb58e139be103324d04d82d8f545",
- "url": "xxxxxxxxxxxx"
+ "url": "http://example.com/path/to/resource"
}
-}
\ No newline at end of file
+}
diff --git a/doc/v3/api_samples/os-agents/agent-post-resp.json b/doc/v3/api_samples/os-agents/agent-post-resp.json
index f6c760cc67..24ddede90b 100644
--- a/doc/v3/api_samples/os-agents/agent-post-resp.json
+++ b/doc/v3/api_samples/os-agents/agent-post-resp.json
@@ -5,7 +5,7 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
- "url": "xxxxxxxxxxxx",
+ "url": "http://example.com/path/to/resource",
"version": "8.0"
}
-}
\ No newline at end of file
+}
diff --git a/doc/v3/api_samples/os-agents/agent-update-put-req.json b/doc/v3/api_samples/os-agents/agent-update-put-req.json
index e166abf9ee..89cbcaba39 100644
--- a/doc/v3/api_samples/os-agents/agent-update-put-req.json
+++ b/doc/v3/api_samples/os-agents/agent-update-put-req.json
@@ -1,6 +1,6 @@
{
"agent": {
- "url": "xxx://xxxx/xxx/xxx",
+ "url": "http://example.com/path/to/resource",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"version": "7.0"
}
diff --git a/doc/v3/api_samples/os-agents/agent-update-put-resp.json b/doc/v3/api_samples/os-agents/agent-update-put-resp.json
index 866994e4c9..2964c0f894 100644
--- a/doc/v3/api_samples/os-agents/agent-update-put-resp.json
+++ b/doc/v3/api_samples/os-agents/agent-update-put-resp.json
@@ -2,7 +2,7 @@
"agent": {
"agent_id": 1,
"md5hash": "add6bb58e139be103324d04d82d8f545",
- "url": "xxx://xxxx/xxx/xxx",
+ "url": "http://example.com/path/to/resource",
"version": "7.0"
}
-}
\ No newline at end of file
+}
diff --git a/doc/v3/api_samples/os-agents/agents-get-resp.json b/doc/v3/api_samples/os-agents/agents-get-resp.json
index 73ba45c240..92e14e1dc5 100644
--- a/doc/v3/api_samples/os-agents/agents-get-resp.json
+++ b/doc/v3/api_samples/os-agents/agents-get-resp.json
@@ -6,8 +6,8 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
- "url": "xxxxxxxxxxxx",
+ "url": "http://example.com/path/to/resource",
"version": "8.0"
}
]
-}
\ No newline at end of file
+}
diff --git a/nova/api/validation/validators.py b/nova/api/validation/validators.py
index ce74923756..0974fa177d 100644
--- a/nova/api/validation/validators.py
+++ b/nova/api/validation/validators.py
@@ -17,6 +17,7 @@ Internal implementation of request Body validating middleware.
"""
import jsonschema
+import rfc3986
import six
from nova import exception
@@ -40,6 +41,12 @@ def _validate_uuid_format(instance):
return uuidutils.is_uuid_like(instance)
+@jsonschema.FormatChecker.cls_checks('uri')
+def _validate_uri(instance):
+ return rfc3986.is_valid_uri(instance, require_scheme=True,
+ require_authority=True)
+
+
class _SchemaValidator(object):
"""A validator class
diff --git a/nova/api/validator.py b/nova/api/validator.py
index 2e8462f0d2..cce621849d 100644
--- a/nova/api/validator.py
+++ b/nova/api/validator.py
@@ -14,8 +14,8 @@
# under the License.
import base64
-import re
+import rfc3986
import six
from nova.openstack.common import log as logging
@@ -24,21 +24,6 @@ from nova.openstack.common import log as logging
LOG = logging.getLogger(__name__)
-def _get_path_validator_regex():
- # rfc3986 path validator regex from
- # http://jmrware.com/articles/2009/uri_regexp/URI_regex.html
- pchar = "([A-Za-z0-9\-._~!$&'()*+,;=:@]|%[0-9A-Fa-f]{2})"
- path = "((/{pchar}*)*|"
- path += "/({pchar}+(/{pchar}*)*)?|"
- path += "{pchar}+(/{pchar}*)*|"
- path += "{pchar}+(/{pchar}*)*|)"
- path = path.format(pchar=pchar)
- return re.compile(path)
-
-
-VALIDATE_PATH_RE = _get_path_validator_regex()
-
-
def validate_str(max_length=None):
def _do(val):
@@ -69,7 +54,9 @@ def validate_url_path(val):
if not validate_str()(val):
return False
- return VALIDATE_PATH_RE.match(val).end() == len(val)
+ uri = rfc3986.URIReference(None, None, val, None, None)
+
+ return uri.path_is_valid() and val.startswith('/')
def validate_image_path(val):
diff --git a/nova/tests/api/openstack/compute/contrib/test_agents.py b/nova/tests/api/openstack/compute/contrib/test_agents.py
index 7373efeb27..e287a4d2dd 100644
--- a/nova/tests/api/openstack/compute/contrib/test_agents.py
+++ b/nova/tests/api/openstack/compute/contrib/test_agents.py
@@ -24,25 +24,25 @@ from nova import test
fake_agents_list = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx1',
+ 'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'id': 2},
{'hypervisor': 'xen', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx2',
+ 'url': 'http://example.com/path/to/resource2',
'md5hash': 'add6bb58e139be103324d04d82d8f547',
'id': 3},
{'hypervisor': 'xen', 'os': 'win',
'architecture': 'power',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx3',
+ 'url': 'http://example.com/path/to/resource3',
'md5hash': 'add6bb58e139be103324d04d82d8f548',
'id': 4},
]
@@ -106,13 +106,13 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
response = {'agent': {'hypervisor': 'kvm',
'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1}}
res_dict = self.controller.create(req, body)
@@ -151,7 +151,7 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
body['agent'][key] = 'x' * 256
self.assertRaises(webob.exc.HTTPBadRequest,
@@ -185,25 +185,25 @@ class AgentsTest(test.NoDBTestCase):
agents_list = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx1',
+ 'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'agent_id': 2},
{'hypervisor': 'xen', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx2',
+ 'url': 'http://example.com/path/to/resource2',
'md5hash': 'add6bb58e139be103324d04d82d8f547',
'agent_id': 3},
{'hypervisor': 'xen', 'os': 'win',
'architecture': 'power',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx3',
+ 'url': 'http://example.com/path/to/resource3',
'md5hash': 'add6bb58e139be103324d04d82d8f548',
'agent_id': 4},
]
@@ -215,13 +215,13 @@ class AgentsTest(test.NoDBTestCase):
response = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx1',
+ 'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'agent_id': 2},
]
@@ -230,11 +230,11 @@ class AgentsTest(test.NoDBTestCase):
def test_agents_update(self):
req = FakeRequest()
body = {'para': {'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
response = {'agent': {'agent_id': 1,
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
res_dict = self.controller.update(req, 1, body)
self.assertEqual(res_dict, response)
@@ -258,7 +258,7 @@ class AgentsTest(test.NoDBTestCase):
def _test_agents_update_with_invalid_length(self, key):
req = FakeRequest()
body = {'para': {'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
body['para'][key] = 'x' * 256
self.assertRaises(webob.exc.HTTPBadRequest,
diff --git a/nova/tests/api/openstack/compute/plugins/v3/test_agents.py b/nova/tests/api/openstack/compute/plugins/v3/test_agents.py
index e7a07fed2d..a4b140214d 100644
--- a/nova/tests/api/openstack/compute/plugins/v3/test_agents.py
+++ b/nova/tests/api/openstack/compute/plugins/v3/test_agents.py
@@ -23,25 +23,25 @@ from nova import test
fake_agents_list = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx1',
+ 'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'id': 2},
{'hypervisor': 'xen', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx2',
+ 'url': 'http://example.com/path/to/resource2',
'md5hash': 'add6bb58e139be103324d04d82d8f547',
'id': 3},
{'hypervisor': 'xen', 'os': 'win',
'architecture': 'power',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx3',
+ 'url': 'http://example.com/path/to/resource3',
'md5hash': 'add6bb58e139be103324d04d82d8f548',
'id': 4},
]
@@ -109,13 +109,13 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
response = {'agent': {'hypervisor': 'kvm',
'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1}}
res_dict = self.controller.create(req, body=body)
@@ -130,7 +130,7 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exc.HTTPConflict, self.controller.create, req,
body=body)
@@ -141,7 +141,7 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx'}}
+ 'url': 'http://example.com/path/to/resource'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -160,7 +160,7 @@ class AgentsTest(test.NoDBTestCase):
body = {'agent': {'hypervisor': 'kvm',
'os': 'win',
'architecture': 'x86',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -170,7 +170,7 @@ class AgentsTest(test.NoDBTestCase):
body = {'agent': {'hypervisor': 'kvm',
'os': 'win',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -180,7 +180,7 @@ class AgentsTest(test.NoDBTestCase):
body = {'agent': {'hypervisor': 'kvm',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -190,7 +190,7 @@ class AgentsTest(test.NoDBTestCase):
body = {'agent': {'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
self.assertRaises(exception.ValidationError, self.controller.create,
req, body=body)
@@ -213,7 +213,7 @@ class AgentsTest(test.NoDBTestCase):
'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
body['agent'][key] = 'x' * 256
self.assertRaises(exception.ValidationError, self.controller.create,
@@ -247,25 +247,25 @@ class AgentsTest(test.NoDBTestCase):
agents_list = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx1',
+ 'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'agent_id': 2},
{'hypervisor': 'xen', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx2',
+ 'url': 'http://example.com/path/to/resource2',
'md5hash': 'add6bb58e139be103324d04d82d8f547',
'agent_id': 3},
{'hypervisor': 'xen', 'os': 'win',
'architecture': 'power',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx3',
+ 'url': 'http://example.com/path/to/resource3',
'md5hash': 'add6bb58e139be103324d04d82d8f548',
'agent_id': 4},
]
@@ -277,13 +277,13 @@ class AgentsTest(test.NoDBTestCase):
response = [{'hypervisor': 'kvm', 'os': 'win',
'architecture': 'x86',
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545',
'agent_id': 1},
{'hypervisor': 'kvm', 'os': 'linux',
'architecture': 'x86',
'version': '16.0',
- 'url': 'xxx://xxxx/xxx/xxx1',
+ 'url': 'http://example.com/path/to/resource1',
'md5hash': 'add6bb58e139be103324d04d82d8f546',
'agent_id': 2},
]
@@ -292,11 +292,11 @@ class AgentsTest(test.NoDBTestCase):
def test_agents_update(self):
req = FakeRequest()
body = {'agent': {'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
response = {'agent': {'agent_id': 1,
'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
res_dict = self.controller.update(req, 1, body=body)
self.assertEqual(res_dict, response)
@@ -304,7 +304,7 @@ class AgentsTest(test.NoDBTestCase):
def test_agents_update_without_md5hash(self):
req = FakeRequest()
body = {'agent': {'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx'}}
+ 'url': 'http://example.com/path/to/resource'}}
self.assertRaises(exception.ValidationError, self.controller.update,
req, 1, body=body)
@@ -335,7 +335,7 @@ class AgentsTest(test.NoDBTestCase):
def _test_agents_update_with_invalid_length(self, key):
req = FakeRequest()
body = {'agent': {'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}}
body['agent'][key] = 'x' * 256
self.assertRaises(exception.ValidationError, self.controller.update,
diff --git a/nova/tests/integrated/test_api_samples.py b/nova/tests/integrated/test_api_samples.py
index 4707a74889..f1be700c22 100644
--- a/nova/tests/integrated/test_api_samples.py
+++ b/nova/tests/integrated/test_api_samples.py
@@ -1378,7 +1378,7 @@ class AgentsJsonTest(ApiSampleTestBaseV2):
def setUp(self):
super(AgentsJsonTest, self).setUp()
- fake_agents_list = [{'url': 'xxxxxxxxxxxx',
+ fake_agents_list = [{'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -1419,7 +1419,7 @@ class AgentsJsonTest(ApiSampleTestBaseV2):
def test_agent_create(self):
# Creates a new agent build.
- project = {'url': 'xxxxxxxxxxxx',
+ project = {'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -1435,7 +1435,7 @@ class AgentsJsonTest(ApiSampleTestBaseV2):
def test_agent_list(self):
# Return a list of all agent builds.
response = self._do_get('os-agents')
- project = {'url': 'xxxxxxxxxxxx',
+ project = {'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -1449,7 +1449,7 @@ class AgentsJsonTest(ApiSampleTestBaseV2):
# Update an existing agent build.
agent_id = 1
subs = {'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}
response = self._do_put('os-agents/%s' % agent_id,
'agent-update-put-req', subs)
diff --git a/nova/tests/integrated/v3/api_samples/os-agents/agent-post-resp.json.tpl b/nova/tests/integrated/v3/api_samples/os-agents/agent-post-resp.json.tpl
index f6c760cc67..24ddede90b 100644
--- a/nova/tests/integrated/v3/api_samples/os-agents/agent-post-resp.json.tpl
+++ b/nova/tests/integrated/v3/api_samples/os-agents/agent-post-resp.json.tpl
@@ -5,7 +5,7 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
- "url": "xxxxxxxxxxxx",
+ "url": "http://example.com/path/to/resource",
"version": "8.0"
}
-}
\ No newline at end of file
+}
diff --git a/nova/tests/integrated/v3/api_samples/os-agents/agent-update-put-resp.json.tpl b/nova/tests/integrated/v3/api_samples/os-agents/agent-update-put-resp.json.tpl
index 866994e4c9..2964c0f894 100644
--- a/nova/tests/integrated/v3/api_samples/os-agents/agent-update-put-resp.json.tpl
+++ b/nova/tests/integrated/v3/api_samples/os-agents/agent-update-put-resp.json.tpl
@@ -2,7 +2,7 @@
"agent": {
"agent_id": 1,
"md5hash": "add6bb58e139be103324d04d82d8f545",
- "url": "xxx://xxxx/xxx/xxx",
+ "url": "http://example.com/path/to/resource",
"version": "7.0"
}
-}
\ No newline at end of file
+}
diff --git a/nova/tests/integrated/v3/api_samples/os-agents/agents-get-resp.json.tpl b/nova/tests/integrated/v3/api_samples/os-agents/agents-get-resp.json.tpl
index 73ba45c240..92e14e1dc5 100644
--- a/nova/tests/integrated/v3/api_samples/os-agents/agents-get-resp.json.tpl
+++ b/nova/tests/integrated/v3/api_samples/os-agents/agents-get-resp.json.tpl
@@ -6,8 +6,8 @@
"hypervisor": "hypervisor",
"md5hash": "add6bb58e139be103324d04d82d8f545",
"os": "os",
- "url": "xxxxxxxxxxxx",
+ "url": "http://example.com/path/to/resource",
"version": "8.0"
}
]
-}
\ No newline at end of file
+}
diff --git a/nova/tests/integrated/v3/test_agents.py b/nova/tests/integrated/v3/test_agents.py
index 99a53bcf51..bdb3b4e220 100644
--- a/nova/tests/integrated/v3/test_agents.py
+++ b/nova/tests/integrated/v3/test_agents.py
@@ -24,7 +24,7 @@ class AgentsJsonTest(api_sample_base.ApiSampleTestBaseV3):
def setUp(self):
super(AgentsJsonTest, self).setUp()
- fake_agents_list = [{'url': 'xxxxxxxxxxxx',
+ fake_agents_list = [{'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -65,7 +65,7 @@ class AgentsJsonTest(api_sample_base.ApiSampleTestBaseV3):
def test_agent_create(self):
# Creates a new agent build.
- project = {'url': 'xxxxxxxxxxxx',
+ project = {'url': 'http://example.com/path/to/resource',
'hypervisor': 'hypervisor',
'architecture': 'x86',
'os': 'os',
@@ -85,7 +85,7 @@ class AgentsJsonTest(api_sample_base.ApiSampleTestBaseV3):
# Update an existing agent build.
agent_id = 1
subs = {'version': '7.0',
- 'url': 'xxx://xxxx/xxx/xxx',
+ 'url': 'http://example.com/path/to/resource',
'md5hash': 'add6bb58e139be103324d04d82d8f545'}
response = self._do_put('os-agents/%s' % agent_id,
'agent-update-put-req', subs)
diff --git a/nova/tests/test_api_validation.py b/nova/tests/test_api_validation.py
index e055817489..a30a5fe92d 100644
--- a/nova/tests/test_api_validation.py
+++ b/nova/tests/test_api_validation.py
@@ -692,6 +692,64 @@ class UuidTestCase(APIValidationTestCase):
expected_detail=detail)
+class UriTestCase(APIValidationTestCase):
+
+ def setUp(self):
+ super(UriTestCase, self).setUp()
+ schema = {
+ 'type': 'object',
+ 'properties': {
+ 'foo': {
+ 'type': 'string',
+ 'format': 'uri',
+ },
+ },
+ }
+
+ @validation.schema(request_body_schema=schema)
+ def post(body):
+ return 'Validation succeeded.'
+
+ self.post = post
+
+ def test_validate_uri(self):
+ self.assertEqual('Validation succeeded.',
+ self.post(
+ body={'foo': 'http://localhost:8774/v2/servers'}
+ ))
+ self.assertEqual('Validation succeeded.',
+ self.post(
+ body={'foo': 'http://[::1]:8774/v2/servers'}
+ ))
+
+ def test_validate_uri_fails(self):
+ base_detail = ("Invalid input for field/attribute foo. Value: {0}. "
+ "'{0}' is not a 'uri'")
+ invalid_uri = 'http://localhost:8774/v2/servers##'
+ self.check_validation_error(self.post,
+ body={'foo': invalid_uri},
+ expected_detail=base_detail.format(
+ invalid_uri))
+
+ invalid_uri = 'http://[fdf8:01]:8774/v2/servers'
+ self.check_validation_error(self.post,
+ body={'foo': invalid_uri},
+ expected_detail=base_detail.format(
+ invalid_uri))
+
+ invalid_uri = '1'
+ self.check_validation_error(self.post,
+ body={'foo': invalid_uri},
+ expected_detail=base_detail.format(
+ invalid_uri))
+
+ invalid_uri = 'abc'
+ self.check_validation_error(self.post,
+ body={'foo': invalid_uri},
+ expected_detail=base_detail.format(
+ invalid_uri))
+
+
class Ipv4TestCase(APIValidationTestCase):
def setUp(self):
diff --git a/requirements.txt b/requirements.txt
index 7fb504cc45..9cf68daee2 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -37,3 +37,4 @@ pycadf>=0.5.1
oslo.messaging>=1.4.0.0a3
oslo.i18n>=0.1.0 # Apache-2.0
lockfile>=0.8
+rfc3986>=0.2.0 # Apache-2.0