Add aggregates extension to API samples test.

Change-Id: I8f0f5b022795dc1d766e585cab8fe5f8445a3722
Signed-off-by: Matthew Treinish <treinish@linux.vnet.ibm.com>
This commit is contained in:
Matthew Treinish 2012-09-14 09:52:05 -04:00
parent 878dd9c0e2
commit ce2ba8fae8
55 changed files with 644 additions and 6 deletions

View File

@ -0,0 +1,6 @@
{
"add_host":
{
"host": "581d29b9e3504d8a895caddb13839b15"
}
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<add_host host="7c9e00dbca5e4fb88538b021c0f933a5" />

View File

@ -0,0 +1,9 @@
{
"set_metadata":
{
"metadata":
{
"key": "value"
}
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<set_metadata>
<metadata>
<key>value</key>
</metadata>
</set_metadata>

View File

@ -0,0 +1,7 @@
{
"aggregate":
{
"name": "name",
"availability_zone": "nova"
}
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<aggregate name="name" availability_zone="nova" />

View File

@ -0,0 +1,11 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "2012-10-01T18:50:27.781065",
"deleted": false,
"deleted_at": null,
"id": 1,
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,10 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>2012-10-01 18:50:35.506667</created_at>
<updated_at>None</updated_at>
<deleted_at>None</deleted_at>
<id>1</id>
</aggregate>

View File

@ -0,0 +1,6 @@
{
"remove_host":
{
"host": "581d29b9e3504d8a895caddb13839b15"
}
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<remove_host host="7c9e00dbca5e4fb88538b021c0f933a5" />

View File

@ -0,0 +1,7 @@
{
"aggregate":
{
"name": "newname",
"availability_zone": "nova2"
}
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<aggregate name="newname" availability_zone="nova2" />

View File

@ -0,0 +1,13 @@
{
"aggregate": {
"availability_zone": "nova2",
"created_at": "2012-10-01T18:50:27.781065",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {},
"name": "newname",
"updated_at": "2012-10-01T18:50:27.791392"
}
}

View File

@ -0,0 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>newname</name>
<availability_zone>nova2</availability_zone>
<deleted>False</deleted>
<created_at>2012-10-01 18:50:35.506667</created_at>
<updated_at>2012-10-01 18:50:35.517397</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>

View File

@ -0,0 +1,15 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "2012-10-01T18:50:27.511586",
"deleted": false,
"deleted_at": null,
"hosts": [
"581d29b9e3504d8a895caddb13839b15"
],
"id": 1,
"metadata": {},
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>2012-10-01 18:50:35.236556</created_at>
<updated_at>None</updated_at>
<hosts>
<host>7c9e00dbca5e4fb88538b021c0f933a5</host>
</hosts>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>

View File

@ -0,0 +1,13 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "2012-10-01T18:50:27.048605",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {},
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>2012-10-01 18:50:34.764838</created_at>
<updated_at>None</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>

View File

@ -0,0 +1,15 @@
{
"aggregates": [
{
"availability_zone": "nova",
"created_at": "2012-10-01T18:50:27.252869",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {},
"name": "name",
"updated_at": null
}
]
}

View File

@ -0,0 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregates>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>2012-10-01 18:50:34.970677</created_at>
<updated_at>None</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>
</aggregates>

View File

@ -0,0 +1,15 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "2012-10-01T18:50:26.604176",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {
"key": "value"
},
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>2012-10-01 18:50:34.313003</created_at>
<updated_at>None</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata>
<key>value</key>
</metadata>
</aggregate>

View File

@ -0,0 +1,13 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "2012-10-01T18:50:27.511586",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {},
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>2012-10-01 18:50:35.236556</created_at>
<updated_at>None</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>

View File

@ -0,0 +1,16 @@
{
"server" : {
"name" : "new-server-test",
"imageRef" : "http://openstack.example.com/openstack/images/70a599e0-31e7-49b7-b260-868f441e862b",
"flavorRef" : "http://openstack.example.com/openstack/flavors/1",
"metadata" : {
"My Server Name" : "Apache1"
},
"personality" : [
{
"path" : "/etc/banner.txt",
"contents" : "ICAgICAgDQoiQSBjbG91ZCBkb2VzIG5vdCBrbm93IHdoeSBpdCBtb3ZlcyBpbiBqdXN0IHN1Y2ggYSBkaXJlY3Rpb24gYW5kIGF0IHN1Y2ggYSBzcGVlZC4uLkl0IGZlZWxzIGFuIGltcHVsc2lvbi4uLnRoaXMgaXMgdGhlIHBsYWNlIHRvIGdvIG5vdy4gQnV0IHRoZSBza3kga25vd3MgdGhlIHJlYXNvbnMgYW5kIHRoZSBwYXR0ZXJucyBiZWhpbmQgYWxsIGNsb3VkcywgYW5kIHlvdSB3aWxsIGtub3csIHRvbywgd2hlbiB5b3UgbGlmdCB5b3Vyc2VsZiBoaWdoIGVub3VnaCB0byBzZWUgYmV5b25kIGhvcml6b25zLiINCg0KLVJpY2hhcmQgQmFjaA=="
}
]
}
}

View File

@ -0,0 +1,16 @@
{
"server": {
"adminPass": "kWaKB9zfiMsq",
"id": "d261e7aa-50ea-45bb-827c-61bd94deb012",
"links": [
{
"href": "http://openstack.example.com/v2/openstack/servers/d261e7aa-50ea-45bb-827c-61bd94deb012",
"rel": "self"
},
{
"href": "http://openstack.example.com/openstack/servers/d261e7aa-50ea-45bb-827c-61bd94deb012",
"rel": "bookmark"
}
]
}
}

View File

@ -0,0 +1,6 @@
{
"add_host":
{
"host": "%(host_name)s"
}
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<add_host host="%(host_name)s" />

View File

@ -0,0 +1,9 @@
{
"set_metadata":
{
"metadata":
{
"key": "value"
}
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<set_metadata>
<metadata>
<key>value</key>
</metadata>
</set_metadata>

View File

@ -0,0 +1,7 @@
{
"aggregate":
{
"name": "name",
"availability_zone": "nova"
}
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<aggregate name="name" availability_zone="nova" />

View File

@ -0,0 +1,11 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "%(timestamp)s",
"deleted": false,
"deleted_at": null,
"id": %(aggregate_id)s,
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,10 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>%(timestamp)s</created_at>
<updated_at>None</updated_at>
<deleted_at>None</deleted_at>
<id>%(aggregate_id)s</id>
</aggregate>

View File

@ -0,0 +1,6 @@
{
"remove_host":
{
"host": "%(host_name)s"
}
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<remove_host host="%(host_name)s" />

View File

@ -0,0 +1,7 @@
{
"aggregate":
{
"name": "newname",
"availability_zone": "nova2"
}
}

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<aggregate name="newname" availability_zone="nova2" />

View File

@ -0,0 +1,13 @@
{
"aggregate": {
"availability_zone": "nova2",
"created_at": "%(timestamp)s",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {},
"name": "newname",
"updated_at": "%(timestamp)s"
}
}

View File

@ -0,0 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>newname</name>
<availability_zone>nova2</availability_zone>
<deleted>False</deleted>
<created_at>%(timestamp)s</created_at>
<updated_at>%(timestamp)s</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>

View File

@ -0,0 +1,15 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "%(timestamp)s",
"deleted": false,
"deleted_at": null,
"hosts": [
"%(compute_host)s"
],
"id": 1,
"metadata": {},
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>%(timestamp)s</created_at>
<updated_at>None</updated_at>
<hosts>
<host>%(compute_host)s</host>
</hosts>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>

View File

@ -0,0 +1,13 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "%(timestamp)s",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {},
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>%(timestamp)s</created_at>
<updated_at>None</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>

View File

@ -0,0 +1,15 @@
{
"aggregates": [
{
"availability_zone": "nova",
"created_at": "%(timestamp)s",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {},
"name": "name",
"updated_at": null
}
]
}

View File

@ -0,0 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregates>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>%(timestamp)s</created_at>
<updated_at>None</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>
</aggregates>

View File

@ -0,0 +1,15 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "%(timestamp)s",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {
"key": "value"
},
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,14 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>%(timestamp)s</created_at>
<updated_at>None</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata>
<key>value</key>
</metadata>
</aggregate>

View File

@ -0,0 +1,13 @@
{
"aggregate": {
"availability_zone": "nova",
"created_at": "%(timestamp)s",
"deleted": false,
"deleted_at": null,
"hosts": [],
"id": 1,
"metadata": {},
"name": "name",
"updated_at": null
}
}

View File

@ -0,0 +1,12 @@
<?xml version='1.0' encoding='UTF-8'?>
<aggregate>
<name>name</name>
<availability_zone>nova</availability_zone>
<deleted>False</deleted>
<created_at>%(timestamp)s</created_at>
<updated_at>None</updated_at>
<hosts/>
<deleted_at>None</deleted_at>
<id>1</id>
<metadata/>
</aggregate>

View File

@ -0,0 +1,16 @@
{
"server" : {
"name" : "new-server-test",
"imageRef" : "%(host)s/openstack/images/%(image_id)s",
"flavorRef" : "%(host)s/openstack/flavors/1",
"metadata" : {
"My Server Name" : "Apache1"
},
"personality" : [
{
"path" : "/etc/banner.txt",
"contents" : "ICAgICAgDQoiQSBjbG91ZCBkb2VzIG5vdCBrbm93IHdoeSBpdCBtb3ZlcyBpbiBqdXN0IHN1Y2ggYSBkaXJlY3Rpb24gYW5kIGF0IHN1Y2ggYSBzcGVlZC4uLkl0IGZlZWxzIGFuIGltcHVsc2lvbi4uLnRoaXMgaXMgdGhlIHBsYWNlIHRvIGdvIG5vdy4gQnV0IHRoZSBza3kga25vd3MgdGhlIHJlYXNvbnMgYW5kIHRoZSBwYXR0ZXJucyBiZWhpbmQgYWxsIGNsb3VkcywgYW5kIHlvdSB3aWxsIGtub3csIHRvbywgd2hlbiB5b3UgbGlmdCB5b3Vyc2VsZiBoaWdoIGVub3VnaCB0byBzZWUgYmV5b25kIGhvcml6b25zLiINCg0KLVJpY2hhcmQgQmFjaA=="
}
]
}
}

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<server xmlns="http://docs.openstack.org/compute/api/v1.1" imageRef="%(host)s/openstack/images/%(image_id)s" flavorRef="%(host)s/openstack/flavors/1" name="new-server-test">
<metadata>
<meta key="My Server Name">Apache1</meta>
</metadata>
<personality>
<file path="/etc/banner.txt">
ICAgICAgDQoiQSBjbG91ZCBkb2VzIG5vdCBrbm93IHdoeSBp
dCBtb3ZlcyBpbiBqdXN0IHN1Y2ggYSBkaXJlY3Rpb24gYW5k
IGF0IHN1Y2ggYSBzcGVlZC4uLkl0IGZlZWxzIGFuIGltcHVs
c2lvbi4uLnRoaXMgaXMgdGhlIHBsYWNlIHRvIGdvIG5vdy4g
QnV0IHRoZSBza3kga25vd3MgdGhlIHJlYXNvbnMgYW5kIHRo
ZSBwYXR0ZXJucyBiZWhpbmQgYWxsIGNsb3VkcywgYW5kIHlv
dSB3aWxsIGtub3csIHRvbywgd2hlbiB5b3UgbGlmdCB5b3Vy
c2VsZiBoaWdoIGVub3VnaCB0byBzZWUgYmV5b25kIGhvcml6
b25zLiINCg0KLVJpY2hhcmQgQmFjaA==
</file>
</personality>
</server>

View File

@ -0,0 +1,16 @@
{
"server": {
"adminPass": "%(password)s",
"id": "%(id)s",
"links": [
{
"href": "%(host)s/v2/openstack/servers/%(uuid)s",
"rel": "self"
},
{
"href": "%(host)s/openstack/servers/%(uuid)s",
"rel": "bookmark"
}
]
}
}

View File

@ -0,0 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<server xmlns:atom="http://www.w3.org/2005/Atom" xmlns="http://docs.openstack.org/compute/api/v1.1" id="%(id)s" adminPass="%(password)s">
<metadata/>
<atom:link href="%(host)s/v2/openstack/servers/%(uuid)s" rel="self"/>
<atom:link href="%(host)s/openstack/servers/%(uuid)s" rel="bookmark"/>
</server>

View File

@ -71,6 +71,8 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase):
if not data:
return {}
if self.ctype == 'json':
# NOTE(vish): allow non-quoted replacements to survive json
data = re.sub(r'([^"])%\((.+)\)s([^"])', r'\1"%(int:\2)s"\3', data)
return jsonutils.loads(data)
else:
def to_dict(node):
@ -163,13 +165,22 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase):
# NOTE(vish): escape stuff for regex
for char in '[]<>?':
expected = expected.replace(char, '\\%s' % char)
# NOTE(vish): special handling of subs that are not quoted. We are
# expecting an int but we had to pass in a string
# so the json would parse properly.
if expected.startswith("%(int:"):
result = str(result)
expected = expected.replace('int:', '')
expected = expected % subs
match = re.match(expected, result)
if not match:
raise NoMatch(_('Values do not match:\n'
'%(expected)s\n%(result)s') % locals())
if match.groups():
matched_value = match.groups()[0]
try:
matched_value = match.group('id')
except IndexError:
if match.groups():
matched_value = match.groups()[0]
else:
if isinstance(expected, basestring):
# NOTE(danms): Ignore whitespace in this comparison
@ -201,13 +212,15 @@ class ApiSampleTestBase(integrated_helpers._IntegratedTestBase):
else:
text = r'[^<]*'
return {
'timestamp': '[0-9]{4}-[0,1][0-9]-[0-3][0-9]T'
'[0-9]{2}:[0-9]{2}:[0-9]{2}'
'(Z|(\+|-)[0-9]{2}:[0-9]{2})',
# NOTE(treinish): Could result in a false positive, but it
# shouldn't be an issue for this case.
'timestamp': '\d{4}-[0,1]\d-[0-3]\d[ ,T]'
'\d{2}:\d{2}:\d{2}'
'(Z|(\+|-)\d{2}:\d{2}|\.\d{6})',
'password': '[0-9a-zA-Z]{1,12}',
'ip': '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}',
'ip6': '([0-9a-zA-Z]{1,4}:){1,7}:?[0-9a-zA-Z]',
'id': '([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}'
'id': '(?P<id>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}'
'-[0-9a-f]{4}-[0-9a-f]{12})',
'uuid': '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}'
'-[0-9a-f]{4}-[0-9a-f]{12}',
@ -1060,3 +1073,75 @@ class CloudPipeSampleJsonTest(ApiSampleTestBase):
class CloudPipeSampleXmlTest(CloudPipeSampleJsonTest):
ctype = "xml"
class AggregatesSampleJsonTest(ServersSampleBase):
extension_name = "nova.api.openstack.compute.contrib" + \
".aggregates.Aggregates"
def test_aggregate_create(self):
subs = {
"aggregate_id": '(?P<id>\d+)'
}
response = self._do_post('os-aggregates', 'aggregate-post-req', subs)
self.assertEqual(response.status, 200)
subs.update(self._get_regexes())
return self._verify_response('aggregate-post-resp', subs, response)
def test_list_aggregates(self):
self.test_aggregate_create()
response = self._do_get('os-aggregates')
subs = self._get_regexes()
return self._verify_response('aggregates-list-get-resp',
subs, response)
def test_aggregate_get(self):
agg_id = self.test_aggregate_create()
response = self._do_get('os-aggregates/%s' % agg_id)
subs = self._get_regexes()
return self._verify_response('aggregates-get-resp', subs, response)
def test_add_metadata(self):
agg_id = self.test_aggregate_create()
response = self._do_post('os-aggregates/%s/action' % agg_id,
'aggregate-metadata-post-req',
{'action': 'set_metadata'})
subs = self._get_regexes()
return self._verify_response('aggregates-metadata-post-resp',
subs, response)
def test_add_host(self):
aggregate_id = self.test_aggregate_create()
subs = {
"action": "add_host",
"host_name": self.compute.host,
}
response = self._do_post('os-aggregates/%s/action' % aggregate_id,
'aggregate-add-host-post-req', subs)
subs.update(self._get_regexes())
return self._verify_response('aggregates-add-host-post-resp',
subs, response)
def test_remove_host(self):
self.test_add_host()
subs = {
"action": "add_host",
"host_name": self.compute.host,
}
response = self._do_post('os-aggregates/1/action',
'aggregate-remove-host-post-req', subs)
subs.update(self._get_regexes())
return self._verify_response('aggregates-remove-host-post-resp',
subs, response)
def test_update_aggregate(self):
aggregate_id = self.test_aggregate_create()
response = self._do_put('os-aggregates/%s' % aggregate_id,
'aggregate-update-post-req', {})
subs = self._get_regexes()
return self._verify_response('aggregate-update-post-resp',
subs, response)
class AggregatesSampleXmlTest(AggregatesSampleJsonTest):
ctype = 'xml'