Merge "Show 'locked' information in server details"
This commit is contained in:
@@ -22,7 +22,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"status": "CURRENT",
|
"status": "CURRENT",
|
||||||
"version": "2.8",
|
"version": "2.9",
|
||||||
"min_version": "2.1",
|
"min_version": "2.1",
|
||||||
"updated": "2013-07-23T11:33:21Z"
|
"updated": "2013-07-23T11:33:21Z"
|
||||||
}
|
}
|
||||||
|
|||||||
58
doc/v3/api_samples/servers/v2.9/server-get-resp.json
Normal file
58
doc/v3/api_samples/servers/v2.9/server-get-resp.json
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"server": {
|
||||||
|
"accessIPv4": "1.2.3.4",
|
||||||
|
"accessIPv6": "80fe::",
|
||||||
|
"addresses": {
|
||||||
|
"private": [
|
||||||
|
{
|
||||||
|
"addr": "192.168.0.3",
|
||||||
|
"OS-EXT-IPS-MAC:mac_addr": "aa:bb:cc:dd:ee:ff",
|
||||||
|
"OS-EXT-IPS:type": "fixed",
|
||||||
|
"version": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"created": "2013-09-03T04:01:32Z",
|
||||||
|
"flavor": {
|
||||||
|
"id": "1",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/openstack/flavors/1",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hostId": "92154fab69d5883ba2c8622b7e65f745dd33257221c07af363c51b29",
|
||||||
|
"id": "0e44cc9c-e052-415d-afbf-469b0d384170",
|
||||||
|
"image": {
|
||||||
|
"id": "70a599e0-31e7-49b7-b260-868f441e862b",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/openstack/images/70a599e0-31e7-49b7-b260-868f441e862b",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key_name": null,
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/v2/openstack/servers/0e44cc9c-e052-415d-afbf-469b0d384170",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/openstack/servers/0e44cc9c-e052-415d-afbf-469b0d384170",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"My Server Name": "Apache1"
|
||||||
|
},
|
||||||
|
"name": "new-server-test",
|
||||||
|
"progress": 0,
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"tenant_id": "openstack",
|
||||||
|
"updated": "2013-09-03T04:01:33Z",
|
||||||
|
"user_id": "fake",
|
||||||
|
"locked": false
|
||||||
|
}
|
||||||
|
}
|
||||||
12
doc/v3/api_samples/servers/v2.9/server-post-req.json
Normal file
12
doc/v3/api_samples/servers/v2.9/server-post-req.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"server" : {
|
||||||
|
"accessIPv4": "1.2.3.4",
|
||||||
|
"accessIPv6": "80fe::",
|
||||||
|
"name" : "new-server-test",
|
||||||
|
"imageRef" : "http://glance.openstack.example.com/images/70a599e0-31e7-49b7-b260-868f441e862b",
|
||||||
|
"flavorRef" : "http://openstack.example.com/flavors/1",
|
||||||
|
"metadata" : {
|
||||||
|
"My Server Name" : "Apache1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
16
doc/v3/api_samples/servers/v2.9/server-post-resp.json
Normal file
16
doc/v3/api_samples/servers/v2.9/server-post-resp.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"server": {
|
||||||
|
"adminPass": "6NpUwoz2QDRN",
|
||||||
|
"id": "f5dc173b-6804-445a-a6d8-c705dad5b5eb",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/v2/openstack/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/openstack/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
60
doc/v3/api_samples/servers/v2.9/servers-details-resp.json
Normal file
60
doc/v3/api_samples/servers/v2.9/servers-details-resp.json
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
{
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"accessIPv4": "1.2.3.4",
|
||||||
|
"accessIPv6": "80fe::",
|
||||||
|
"addresses": {
|
||||||
|
"private": [
|
||||||
|
{
|
||||||
|
"addr": "192.168.0.3",
|
||||||
|
"OS-EXT-IPS-MAC:mac_addr": "aa:bb:cc:dd:ee:ff",
|
||||||
|
"OS-EXT-IPS:type": "fixed",
|
||||||
|
"version": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"created": "2013-09-03T04:01:32Z",
|
||||||
|
"flavor": {
|
||||||
|
"id": "1",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/openstack/flavors/1",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hostId": "bcf92836fc9ed4203a75cb0337afc7f917d2be504164b995c2334b25",
|
||||||
|
"id": "f5dc173b-6804-445a-a6d8-c705dad5b5eb",
|
||||||
|
"image": {
|
||||||
|
"id": "70a599e0-31e7-49b7-b260-868f441e862b",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/openstack/images/70a599e0-31e7-49b7-b260-868f441e862b",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key_name": null,
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/v2/openstack/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/openstack/servers/f5dc173b-6804-445a-a6d8-c705dad5b5eb",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"My Server Name": "Apache1"
|
||||||
|
},
|
||||||
|
"name": "new-server-test",
|
||||||
|
"progress": 0,
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"tenant_id": "openstack",
|
||||||
|
"updated": "2013-09-03T04:01:32Z",
|
||||||
|
"user_id": "fake",
|
||||||
|
"locked": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
18
doc/v3/api_samples/servers/v2.9/servers-list-resp.json
Normal file
18
doc/v3/api_samples/servers/v2.9/servers-list-resp.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"id": "22c91117-08de-4894-9aa9-6ef382400985",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/v2/openstack/servers/22c91117-08de-4894-9aa9-6ef382400985",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/openstack/servers/22c91117-08de-4894-9aa9-6ef382400985",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "new-server-test"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -47,6 +47,7 @@ REST_API_VERSION_HISTORY = """REST API Version History:
|
|||||||
* 2.6 - Consolidate the APIs for getting remote consoles
|
* 2.6 - Consolidate the APIs for getting remote consoles
|
||||||
* 2.7 - Check flavor type before add tenant access.
|
* 2.7 - Check flavor type before add tenant access.
|
||||||
* 2.8 - Add new protocol for VM console (mks)
|
* 2.8 - Add new protocol for VM console (mks)
|
||||||
|
* 2.9 - Exposes lock information in server details.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# The minimum and maximum versions of the API supported
|
# The minimum and maximum versions of the API supported
|
||||||
@@ -55,7 +56,7 @@ REST_API_VERSION_HISTORY = """REST API Version History:
|
|||||||
# Note(cyeoh): This only applies for the v2.1 API once microversions
|
# Note(cyeoh): This only applies for the v2.1 API once microversions
|
||||||
# support is fully merged. It does not affect the V2 API.
|
# support is fully merged. It does not affect the V2 API.
|
||||||
_MIN_API_VERSION = "2.1"
|
_MIN_API_VERSION = "2.1"
|
||||||
_MAX_API_VERSION = "2.8"
|
_MAX_API_VERSION = "2.9"
|
||||||
DEFAULT_API_VERSION = _MIN_API_VERSION
|
DEFAULT_API_VERSION = _MIN_API_VERSION
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import hashlib
|
|||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
from oslo_utils import timeutils
|
from oslo_utils import timeutils
|
||||||
|
|
||||||
|
from nova.api.openstack import api_version_request
|
||||||
from nova.api.openstack import common
|
from nova.api.openstack import common
|
||||||
from nova.api.openstack.compute.views import addresses as views_addresses
|
from nova.api.openstack.compute.views import addresses as views_addresses
|
||||||
from nova.api.openstack.compute.views import flavors as views_flavors
|
from nova.api.openstack.compute.views import flavors as views_flavors
|
||||||
@@ -280,4 +281,9 @@ class ViewBuilderV3(ViewBuilder):
|
|||||||
if server["server"]["status"] in self._progress_statuses:
|
if server["server"]["status"] in self._progress_statuses:
|
||||||
server["server"]["progress"] = instance.get("progress", 0)
|
server["server"]["progress"] = instance.get("progress", 0)
|
||||||
|
|
||||||
|
if (request.api_version_request >=
|
||||||
|
api_version_request.APIVersionRequest("2.9")):
|
||||||
|
server["server"]["locked"] = (True if instance["locked_by"]
|
||||||
|
else False)
|
||||||
|
|
||||||
return server
|
return server
|
||||||
|
|||||||
@@ -100,3 +100,9 @@ user documentation.
|
|||||||
2.8
|
2.8
|
||||||
---
|
---
|
||||||
Add 'mks' protocol and 'webmks' type for remote consoles.
|
Add 'mks' protocol and 'webmks' type for remote consoles.
|
||||||
|
|
||||||
|
2.9
|
||||||
|
---
|
||||||
|
|
||||||
|
Show instance lock information in new response attribute 'locked'
|
||||||
|
in server details. Returned value will be True or False.
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"status": "CURRENT",
|
"status": "CURRENT",
|
||||||
"version": "2.8",
|
"version": "2.9",
|
||||||
"min_version": "2.1",
|
"min_version": "2.1",
|
||||||
"updated": "2013-07-23T11:33:21Z"
|
"updated": "2013-07-23T11:33:21Z"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"server": {
|
||||||
|
"accessIPv4": "%(access_ip_v4)s",
|
||||||
|
"accessIPv6": "%(access_ip_v6)s",
|
||||||
|
"addresses": {
|
||||||
|
"private": [
|
||||||
|
{
|
||||||
|
"addr": "%(ip)s",
|
||||||
|
"OS-EXT-IPS-MAC:mac_addr": "aa:bb:cc:dd:ee:ff",
|
||||||
|
"OS-EXT-IPS:type": "fixed",
|
||||||
|
"version": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"created": "%(isotime)s",
|
||||||
|
"flavor": {
|
||||||
|
"id": "1",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "%(host)s/openstack/flavors/1",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hostId": "%(hostid)s",
|
||||||
|
"id": "%(id)s",
|
||||||
|
"image": {
|
||||||
|
"id": "%(uuid)s",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "%(host)s/openstack/images/%(uuid)s",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key_name": null,
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "%(host)s/v2/openstack/servers/%(uuid)s",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "%(host)s/openstack/servers/%(uuid)s",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"My Server Name": "Apache1"
|
||||||
|
},
|
||||||
|
"name": "new-server-test",
|
||||||
|
"progress": 0,
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"tenant_id": "openstack",
|
||||||
|
"updated": "%(isotime)s",
|
||||||
|
"user_id": "fake",
|
||||||
|
"locked": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"server" : {
|
||||||
|
"accessIPv4": "%(access_ip_v4)s",
|
||||||
|
"accessIPv6": "%(access_ip_v6)s",
|
||||||
|
"name" : "new-server-test",
|
||||||
|
"imageRef" : "%(glance_host)s/images/%(image_id)s",
|
||||||
|
"flavorRef" : "%(host)s/flavors/1",
|
||||||
|
"metadata" : {
|
||||||
|
"My Server Name" : "Apache1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"server": {
|
||||||
|
"adminPass": "%(password)s",
|
||||||
|
"id": "%(id)s",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/v2/openstack/servers/%(uuid)s",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "http://openstack.example.com/openstack/servers/%(uuid)s",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
{
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"accessIPv4": "%(access_ip_v4)s",
|
||||||
|
"accessIPv6": "%(access_ip_v6)s",
|
||||||
|
"addresses": {
|
||||||
|
"private": [
|
||||||
|
{
|
||||||
|
"addr": "%(ip)s",
|
||||||
|
"OS-EXT-IPS-MAC:mac_addr": "aa:bb:cc:dd:ee:ff",
|
||||||
|
"OS-EXT-IPS:type": "fixed",
|
||||||
|
"version": 4
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"created": "%(isotime)s",
|
||||||
|
"flavor": {
|
||||||
|
"id": "1",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "%(host)s/openstack/flavors/1",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hostId": "%(hostid)s",
|
||||||
|
"id": "%(id)s",
|
||||||
|
"image": {
|
||||||
|
"id": "%(uuid)s",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "%(host)s/openstack/images/%(uuid)s",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"key_name": null,
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "%(host)s/v2/openstack/servers/%(uuid)s",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "%(host)s/openstack/servers/%(id)s",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"My Server Name": "Apache1"
|
||||||
|
},
|
||||||
|
"name": "new-server-test",
|
||||||
|
"progress": 0,
|
||||||
|
"status": "ACTIVE",
|
||||||
|
"tenant_id": "openstack",
|
||||||
|
"updated": "%(isotime)s",
|
||||||
|
"user_id": "fake",
|
||||||
|
"locked": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"servers": [
|
||||||
|
{
|
||||||
|
"id": "%(id)s",
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "%(host)s/v2/openstack/servers/%(id)s",
|
||||||
|
"rel": "self"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "%(host)s/openstack/servers/%(id)s",
|
||||||
|
"rel": "bookmark"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "new-server-test"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -66,6 +66,7 @@ class ServersSampleJsonTest(ServersSampleBase):
|
|||||||
sample_dir = 'servers'
|
sample_dir = 'servers'
|
||||||
extra_extensions_to_load = ["os-access-ips"]
|
extra_extensions_to_load = ["os-access-ips"]
|
||||||
_api_version = 'v2'
|
_api_version = 'v2'
|
||||||
|
request_api_version = None
|
||||||
|
|
||||||
def _get_flags(self):
|
def _get_flags(self):
|
||||||
f = super(ServersSampleBase, self)._get_flags()
|
f = super(ServersSampleBase, self)._get_flags()
|
||||||
@@ -84,7 +85,8 @@ class ServersSampleJsonTest(ServersSampleBase):
|
|||||||
|
|
||||||
def test_servers_get(self):
|
def test_servers_get(self):
|
||||||
uuid = self.test_servers_post()
|
uuid = self.test_servers_post()
|
||||||
response = self._do_get('servers/%s' % uuid)
|
response = self._do_get('servers/%s' % uuid,
|
||||||
|
api_version=self.request_api_version)
|
||||||
subs = self._get_regexes()
|
subs = self._get_regexes()
|
||||||
subs['hostid'] = '[a-f0-9]+'
|
subs['hostid'] = '[a-f0-9]+'
|
||||||
subs['id'] = uuid
|
subs['id'] = uuid
|
||||||
@@ -96,14 +98,16 @@ class ServersSampleJsonTest(ServersSampleBase):
|
|||||||
|
|
||||||
def test_servers_list(self):
|
def test_servers_list(self):
|
||||||
uuid = self._post_server()
|
uuid = self._post_server()
|
||||||
response = self._do_get('servers')
|
response = self._do_get('servers',
|
||||||
|
api_version=self.request_api_version)
|
||||||
subs = self._get_regexes()
|
subs = self._get_regexes()
|
||||||
subs['id'] = uuid
|
subs['id'] = uuid
|
||||||
self._verify_response('servers-list-resp', subs, response, 200)
|
self._verify_response('servers-list-resp', subs, response, 200)
|
||||||
|
|
||||||
def test_servers_details(self):
|
def test_servers_details(self):
|
||||||
uuid = self._post_server()
|
uuid = self._post_server()
|
||||||
response = self._do_get('servers/detail')
|
response = self._do_get('servers/detail',
|
||||||
|
api_version=self.request_api_version)
|
||||||
subs = self._get_regexes()
|
subs = self._get_regexes()
|
||||||
subs['hostid'] = '[a-f0-9]+'
|
subs['hostid'] = '[a-f0-9]+'
|
||||||
subs['id'] = uuid
|
subs['id'] = uuid
|
||||||
@@ -114,6 +118,14 @@ class ServersSampleJsonTest(ServersSampleBase):
|
|||||||
self._verify_response('servers-details-resp', subs, response, 200)
|
self._verify_response('servers-details-resp', subs, response, 200)
|
||||||
|
|
||||||
|
|
||||||
|
class ServersSampleJson29Test(ServersSampleJsonTest):
|
||||||
|
request_api_version = '2.9'
|
||||||
|
# NOTE(gmann): microversion tests do not need to run for v2 API
|
||||||
|
# so defining scenarios only for v2.9 which will run the original tests
|
||||||
|
# by appending '(v2_9)' in test_id.
|
||||||
|
scenarios = [('v2_9', {})]
|
||||||
|
|
||||||
|
|
||||||
class ServerSortKeysJsonTests(ServersSampleBase):
|
class ServerSortKeysJsonTests(ServersSampleBase):
|
||||||
sample_dir = 'servers-sort'
|
sample_dir = 'servers-sort'
|
||||||
extra_extensions_to_load = ["os-access-ips"]
|
extra_extensions_to_load = ["os-access-ips"]
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ from nova.api.openstack.compute.schemas.v3 import disk_config as \
|
|||||||
from nova.api.openstack.compute.schemas.v3 import servers as servers_schema
|
from nova.api.openstack.compute.schemas.v3 import servers as servers_schema
|
||||||
from nova.api.openstack.compute import views
|
from nova.api.openstack.compute import views
|
||||||
from nova.api.openstack import extensions
|
from nova.api.openstack import extensions
|
||||||
|
from nova.api.openstack import wsgi as os_wsgi
|
||||||
from nova.compute import api as compute_api
|
from nova.compute import api as compute_api
|
||||||
from nova.compute import flavors
|
from nova.compute import flavors
|
||||||
from nova.compute import task_states
|
from nova.compute import task_states
|
||||||
@@ -121,6 +122,19 @@ def fake_instance_get_by_uuid_not_found(context, uuid,
|
|||||||
raise exception.InstanceNotFound(instance_id=uuid)
|
raise exception.InstanceNotFound(instance_id=uuid)
|
||||||
|
|
||||||
|
|
||||||
|
def fake_instance_get_all_with_locked(context, list_locked, **kwargs):
|
||||||
|
db_list = []
|
||||||
|
s_id = 0
|
||||||
|
for locked in list_locked:
|
||||||
|
uuid = fakes.get_fake_uuid(locked)
|
||||||
|
s_id = s_id + 1
|
||||||
|
kwargs['locked_by'] = None if locked == 'not_locked' else locked
|
||||||
|
server = fakes.stub_instance(id=s_id, uuid=uuid, **kwargs)
|
||||||
|
db_list.append(server)
|
||||||
|
return instance_obj._make_instance_list(
|
||||||
|
context, objects.InstanceList(), db_list, FIELDS)
|
||||||
|
|
||||||
|
|
||||||
class MockSetAdminPassword(object):
|
class MockSetAdminPassword(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.instance_id = None
|
self.instance_id = None
|
||||||
@@ -200,11 +214,17 @@ class ControllerTest(test.TestCase):
|
|||||||
|
|
||||||
|
|
||||||
class ServersControllerTest(ControllerTest):
|
class ServersControllerTest(ControllerTest):
|
||||||
|
wsgi_api_version = os_wsgi.DEFAULT_API_VERSION
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(ServersControllerTest, self).setUp()
|
super(ServersControllerTest, self).setUp()
|
||||||
CONF.set_override('host', 'localhost', group='glance')
|
CONF.set_override('host', 'localhost', group='glance')
|
||||||
|
|
||||||
|
def req(self, url, use_admin_context=False):
|
||||||
|
return fakes.HTTPRequest.blank(url,
|
||||||
|
use_admin_context=use_admin_context,
|
||||||
|
version=self.wsgi_api_version)
|
||||||
|
|
||||||
def test_requested_networks_prefix(self):
|
def test_requested_networks_prefix(self):
|
||||||
uuid = 'br-00000000-0000-0000-0000-000000000000'
|
uuid = 'br-00000000-0000-0000-0000-000000000000'
|
||||||
requested_networks = [{'uuid': uuid}]
|
requested_networks = [{'uuid': uuid}]
|
||||||
@@ -290,7 +310,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.assertEqual([(None, None, port, None)], res.as_tuples())
|
self.assertEqual([(None, None, port, None)], res.as_tuples())
|
||||||
|
|
||||||
def test_get_server_by_uuid(self):
|
def test_get_server_by_uuid(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/%s' % FAKE_UUID)
|
req = self.req('/servers/%s' % FAKE_UUID)
|
||||||
res_dict = self.controller.show(req, FAKE_UUID)
|
res_dict = self.controller.show(req, FAKE_UUID)
|
||||||
self.assertEqual(res_dict['server']['id'], FAKE_UUID)
|
self.assertEqual(res_dict['server']['id'], FAKE_UUID)
|
||||||
|
|
||||||
@@ -305,7 +325,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get', fake_get)
|
self.stubs.Set(compute_api.API, 'get', fake_get)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/%s' % FAKE_UUID)
|
req = self.req('/servers/%s' % FAKE_UUID)
|
||||||
self.controller.show(req, FAKE_UUID)
|
self.controller.show(req, FAKE_UUID)
|
||||||
|
|
||||||
self.assertIn('pci_devices', self.expected_attrs)
|
self.assertIn('pci_devices', self.expected_attrs)
|
||||||
@@ -323,7 +343,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.stubs.Set(compute_api.API, 'get',
|
self.stubs.Set(compute_api.API, 'get',
|
||||||
return_instance_with_host)
|
return_instance_with_host)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/%s' % FAKE_UUID)
|
req = self.req('/servers/%s' % FAKE_UUID)
|
||||||
with mock.patch.object(compute_api.API, 'get') as mock_get:
|
with mock.patch.object(compute_api.API, 'get') as mock_get:
|
||||||
mock_get.side_effect = return_instance_with_host
|
mock_get.side_effect = return_instance_with_host
|
||||||
server1 = self.controller.show(req, FAKE_UUID)
|
server1 = self.controller.show(req, FAKE_UUID)
|
||||||
@@ -379,7 +399,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
"links": [
|
"links": [
|
||||||
{
|
{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": "http://localhost/v3/servers/%s" % uuid,
|
"href": "http://localhost/v2/servers/%s" % uuid,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"rel": "bookmark",
|
"rel": "bookmark",
|
||||||
@@ -395,7 +415,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
flavor_bookmark = "http://localhost/flavors/2"
|
flavor_bookmark = "http://localhost/flavors/2"
|
||||||
|
|
||||||
uuid = FAKE_UUID
|
uuid = FAKE_UUID
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/%s' % uuid)
|
req = self.req('/servers/%s' % uuid)
|
||||||
res_dict = self.controller.show(req, uuid)
|
res_dict = self.controller.show(req, uuid)
|
||||||
|
|
||||||
expected_server = self._get_server_data_dict(uuid,
|
expected_server = self._get_server_data_dict(uuid,
|
||||||
@@ -418,7 +438,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
lambda api, *a, **k: new_return_server(*a, **k))
|
lambda api, *a, **k: new_return_server(*a, **k))
|
||||||
|
|
||||||
uuid = FAKE_UUID
|
uuid = FAKE_UUID
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/%s' % uuid)
|
req = self.req('/servers/%s' % uuid)
|
||||||
res_dict = self.controller.show(req, uuid)
|
res_dict = self.controller.show(req, uuid)
|
||||||
expected_server = self._get_server_data_dict(uuid,
|
expected_server = self._get_server_data_dict(uuid,
|
||||||
image_bookmark,
|
image_bookmark,
|
||||||
@@ -438,7 +458,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
lambda api, *a, **k: new_return_server(*a, **k))
|
lambda api, *a, **k: new_return_server(*a, **k))
|
||||||
|
|
||||||
uuid = FAKE_UUID
|
uuid = FAKE_UUID
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/%s' % uuid)
|
req = self.req('/servers/%s' % uuid)
|
||||||
res_dict = self.controller.show(req, uuid)
|
res_dict = self.controller.show(req, uuid)
|
||||||
expected_server = self._get_server_data_dict(uuid,
|
expected_server = self._get_server_data_dict(uuid,
|
||||||
image_bookmark,
|
image_bookmark,
|
||||||
@@ -479,7 +499,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.stubs.Set(compute_api.API, 'get',
|
self.stubs.Set(compute_api.API, 'get',
|
||||||
lambda api, *a, **k: return_server(*a, **k))
|
lambda api, *a, **k: return_server(*a, **k))
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/%s/ips' % FAKE_UUID)
|
req = self.req('/servers/%s/ips' % FAKE_UUID)
|
||||||
res_dict = self.ips_controller.index(req, FAKE_UUID)
|
res_dict = self.ips_controller.index(req, FAKE_UUID)
|
||||||
|
|
||||||
expected = {
|
expected = {
|
||||||
@@ -505,7 +525,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
def test_get_server_addresses_nonexistent_network(self):
|
def test_get_server_addresses_nonexistent_network(self):
|
||||||
url = '/v3/servers/%s/ips/network_0' % FAKE_UUID
|
url = '/v3/servers/%s/ips/network_0' % FAKE_UUID
|
||||||
req = fakes.HTTPRequestV3.blank(url)
|
req = self.req(url)
|
||||||
self.assertRaises(webob.exc.HTTPNotFound, self.ips_controller.show,
|
self.assertRaises(webob.exc.HTTPNotFound, self.ips_controller.show,
|
||||||
req, FAKE_UUID, 'network_0')
|
req, FAKE_UUID, 'network_0')
|
||||||
|
|
||||||
@@ -516,7 +536,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.stubs.Set(compute_api.API, 'get', fake_instance_get)
|
self.stubs.Set(compute_api.API, 'get', fake_instance_get)
|
||||||
|
|
||||||
server_id = str(uuid.uuid4())
|
server_id = str(uuid.uuid4())
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/%s/ips' % server_id)
|
req = self.req('/servers/%s/ips' % server_id)
|
||||||
self.assertRaises(webob.exc.HTTPNotFound,
|
self.assertRaises(webob.exc.HTTPNotFound,
|
||||||
self.ips_controller.index, req, server_id)
|
self.ips_controller.index, req, server_id)
|
||||||
|
|
||||||
@@ -524,14 +544,14 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.stubs.Set(compute_api.API, 'get_all',
|
self.stubs.Set(compute_api.API, 'get_all',
|
||||||
return_servers_empty)
|
return_servers_empty)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers')
|
req = self.req('/servers')
|
||||||
res_dict = self.controller.index(req)
|
res_dict = self.controller.index(req)
|
||||||
|
|
||||||
num_servers = len(res_dict['servers'])
|
num_servers = len(res_dict['servers'])
|
||||||
self.assertEqual(0, num_servers)
|
self.assertEqual(0, num_servers)
|
||||||
|
|
||||||
def test_get_server_list_with_reservation_id(self):
|
def test_get_server_list_with_reservation_id(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?reservation_id=foo')
|
req = self.req('/servers?reservation_id=foo')
|
||||||
res_dict = self.controller.index(req)
|
res_dict = self.controller.index(req)
|
||||||
|
|
||||||
i = 0
|
i = 0
|
||||||
@@ -540,7 +560,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
def test_get_server_list_with_reservation_id_empty(self):
|
def test_get_server_list_with_reservation_id_empty(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/detail?'
|
req = self.req('/servers/detail?'
|
||||||
'reservation_id=foo')
|
'reservation_id=foo')
|
||||||
res_dict = self.controller.detail(req)
|
res_dict = self.controller.detail(req)
|
||||||
|
|
||||||
@@ -550,7 +570,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
def test_get_server_list_with_reservation_id_details(self):
|
def test_get_server_list_with_reservation_id_details(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/detail?'
|
req = self.req('/servers/detail?'
|
||||||
'reservation_id=foo')
|
'reservation_id=foo')
|
||||||
res_dict = self.controller.detail(req)
|
res_dict = self.controller.detail(req)
|
||||||
|
|
||||||
@@ -560,7 +580,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
i += 1
|
i += 1
|
||||||
|
|
||||||
def test_get_server_list(self):
|
def test_get_server_list(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers')
|
req = self.req('/servers')
|
||||||
res_dict = self.controller.index(req)
|
res_dict = self.controller.index(req)
|
||||||
|
|
||||||
self.assertEqual(len(res_dict['servers']), 5)
|
self.assertEqual(len(res_dict['servers']), 5)
|
||||||
@@ -572,7 +592,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
expected_links = [
|
expected_links = [
|
||||||
{
|
{
|
||||||
"rel": "self",
|
"rel": "self",
|
||||||
"href": "http://localhost/v3/servers/%s" % s['id'],
|
"href": "http://localhost/v2/servers/%s" % s['id'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"rel": "bookmark",
|
"rel": "bookmark",
|
||||||
@@ -583,7 +603,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.assertEqual(s['links'], expected_links)
|
self.assertEqual(s['links'], expected_links)
|
||||||
|
|
||||||
def test_get_servers_with_limit(self):
|
def test_get_servers_with_limit(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?limit=3')
|
req = self.req('/servers?limit=3')
|
||||||
res_dict = self.controller.index(req)
|
res_dict = self.controller.index(req)
|
||||||
|
|
||||||
servers = res_dict['servers']
|
servers = res_dict['servers']
|
||||||
@@ -593,14 +613,14 @@ class ServersControllerTest(ControllerTest):
|
|||||||
servers_links = res_dict['servers_links']
|
servers_links = res_dict['servers_links']
|
||||||
self.assertEqual(servers_links[0]['rel'], 'next')
|
self.assertEqual(servers_links[0]['rel'], 'next')
|
||||||
href_parts = urlparse.urlparse(servers_links[0]['href'])
|
href_parts = urlparse.urlparse(servers_links[0]['href'])
|
||||||
self.assertEqual('/v3/servers', href_parts.path)
|
self.assertEqual('/v2/servers', href_parts.path)
|
||||||
params = urlparse.parse_qs(href_parts.query)
|
params = urlparse.parse_qs(href_parts.query)
|
||||||
expected_params = {'limit': ['3'],
|
expected_params = {'limit': ['3'],
|
||||||
'marker': [fakes.get_fake_uuid(2)]}
|
'marker': [fakes.get_fake_uuid(2)]}
|
||||||
self.assertThat(params, matchers.DictMatches(expected_params))
|
self.assertThat(params, matchers.DictMatches(expected_params))
|
||||||
|
|
||||||
def test_get_servers_with_limit_bad_value(self):
|
def test_get_servers_with_limit_bad_value(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?limit=aaa')
|
req = self.req('/servers?limit=aaa')
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.index, req)
|
self.controller.index, req)
|
||||||
|
|
||||||
@@ -608,14 +628,14 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.stubs.Set(compute_api.API, 'get_all',
|
self.stubs.Set(compute_api.API, 'get_all',
|
||||||
return_servers_empty)
|
return_servers_empty)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/detail')
|
req = self.req('/servers/detail')
|
||||||
res_dict = self.controller.detail(req)
|
res_dict = self.controller.detail(req)
|
||||||
|
|
||||||
num_servers = len(res_dict['servers'])
|
num_servers = len(res_dict['servers'])
|
||||||
self.assertEqual(0, num_servers)
|
self.assertEqual(0, num_servers)
|
||||||
|
|
||||||
def test_get_server_details_with_limit(self):
|
def test_get_server_details_with_limit(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/detail?limit=3')
|
req = self.req('/servers/detail?limit=3')
|
||||||
res = self.controller.detail(req)
|
res = self.controller.detail(req)
|
||||||
|
|
||||||
servers = res['servers']
|
servers = res['servers']
|
||||||
@@ -626,18 +646,18 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.assertEqual(servers_links[0]['rel'], 'next')
|
self.assertEqual(servers_links[0]['rel'], 'next')
|
||||||
|
|
||||||
href_parts = urlparse.urlparse(servers_links[0]['href'])
|
href_parts = urlparse.urlparse(servers_links[0]['href'])
|
||||||
self.assertEqual('/v3/servers/detail', href_parts.path)
|
self.assertEqual('/v2/servers/detail', href_parts.path)
|
||||||
params = urlparse.parse_qs(href_parts.query)
|
params = urlparse.parse_qs(href_parts.query)
|
||||||
expected = {'limit': ['3'], 'marker': [fakes.get_fake_uuid(2)]}
|
expected = {'limit': ['3'], 'marker': [fakes.get_fake_uuid(2)]}
|
||||||
self.assertThat(params, matchers.DictMatches(expected))
|
self.assertThat(params, matchers.DictMatches(expected))
|
||||||
|
|
||||||
def test_get_server_details_with_limit_bad_value(self):
|
def test_get_server_details_with_limit_bad_value(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/detail?limit=aaa')
|
req = self.req('/servers/detail?limit=aaa')
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.detail, req)
|
self.controller.detail, req)
|
||||||
|
|
||||||
def test_get_server_details_with_limit_and_other_params(self):
|
def test_get_server_details_with_limit_and_other_params(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/detail'
|
req = self.req('/servers/detail'
|
||||||
'?limit=3&blah=2:t'
|
'?limit=3&blah=2:t'
|
||||||
'&sort_key=id1&sort_dir=asc')
|
'&sort_key=id1&sort_dir=asc')
|
||||||
res = self.controller.detail(req)
|
res = self.controller.detail(req)
|
||||||
@@ -650,7 +670,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.assertEqual(servers_links[0]['rel'], 'next')
|
self.assertEqual(servers_links[0]['rel'], 'next')
|
||||||
|
|
||||||
href_parts = urlparse.urlparse(servers_links[0]['href'])
|
href_parts = urlparse.urlparse(servers_links[0]['href'])
|
||||||
self.assertEqual('/v3/servers/detail', href_parts.path)
|
self.assertEqual('/v2/servers/detail', href_parts.path)
|
||||||
params = urlparse.parse_qs(href_parts.query)
|
params = urlparse.parse_qs(href_parts.query)
|
||||||
expected = {'limit': ['3'], 'blah': ['2:t'],
|
expected = {'limit': ['3'], 'blah': ['2:t'],
|
||||||
'sort_key': ['id1'], 'sort_dir': ['asc'],
|
'sort_key': ['id1'], 'sort_dir': ['asc'],
|
||||||
@@ -658,29 +678,29 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.assertThat(params, matchers.DictMatches(expected))
|
self.assertThat(params, matchers.DictMatches(expected))
|
||||||
|
|
||||||
def test_get_servers_with_too_big_limit(self):
|
def test_get_servers_with_too_big_limit(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?limit=30')
|
req = self.req('/servers?limit=30')
|
||||||
res_dict = self.controller.index(req)
|
res_dict = self.controller.index(req)
|
||||||
self.assertNotIn('servers_links', res_dict)
|
self.assertNotIn('servers_links', res_dict)
|
||||||
|
|
||||||
def test_get_servers_with_bad_limit(self):
|
def test_get_servers_with_bad_limit(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?limit=asdf')
|
req = self.req('/servers?limit=asdf')
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.index, req)
|
self.controller.index, req)
|
||||||
|
|
||||||
def test_get_servers_with_marker(self):
|
def test_get_servers_with_marker(self):
|
||||||
url = '/v3/servers?marker=%s' % fakes.get_fake_uuid(2)
|
url = '/v3/servers?marker=%s' % fakes.get_fake_uuid(2)
|
||||||
req = fakes.HTTPRequestV3.blank(url)
|
req = self.req(url)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
self.assertEqual([s['name'] for s in servers], ["server4", "server5"])
|
self.assertEqual([s['name'] for s in servers], ["server4", "server5"])
|
||||||
|
|
||||||
def test_get_servers_with_limit_and_marker(self):
|
def test_get_servers_with_limit_and_marker(self):
|
||||||
url = '/v3/servers?limit=2&marker=%s' % fakes.get_fake_uuid(1)
|
url = '/v3/servers?limit=2&marker=%s' % fakes.get_fake_uuid(1)
|
||||||
req = fakes.HTTPRequestV3.blank(url)
|
req = self.req(url)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
self.assertEqual([s['name'] for s in servers], ['server3', 'server4'])
|
self.assertEqual([s['name'] for s in servers], ['server3', 'server4'])
|
||||||
|
|
||||||
def test_get_servers_with_bad_marker(self):
|
def test_get_servers_with_bad_marker(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?limit=2&marker=asdf')
|
req = self.req('/servers?limit=2&marker=asdf')
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.index, req)
|
self.controller.index, req)
|
||||||
|
|
||||||
@@ -696,7 +716,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?unknownoption=whee')
|
req = self.req('/servers?unknownoption=whee')
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -717,7 +737,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?image=12345')
|
req = self.req('/servers?image=12345')
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -729,7 +749,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.assertEqual(search_opts['project_id'], 'fake')
|
self.assertEqual(search_opts['project_id'], 'fake')
|
||||||
return [fakes.stub_instance_obj(100)]
|
return [fakes.stub_instance_obj(100)]
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?tenant_id=newfake')
|
req = self.req('/servers?tenant_id=newfake')
|
||||||
with mock.patch.object(compute_api.API, 'get_all') as mock_get:
|
with mock.patch.object(compute_api.API, 'get_all') as mock_get:
|
||||||
mock_get.side_effect = fake_get_all
|
mock_get.side_effect = fake_get_all
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
@@ -740,7 +760,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.assertNotIn('project_id', search_opts)
|
self.assertNotIn('project_id', search_opts)
|
||||||
return [fakes.stub_instance_obj(100)]
|
return [fakes.stub_instance_obj(100)]
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?all_tenants',
|
req = self.req('/servers?all_tenants',
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
with mock.patch.object(compute_api.API, 'get_all') as mock_get:
|
with mock.patch.object(compute_api.API, 'get_all') as mock_get:
|
||||||
mock_get.side_effect = fake_get_all
|
mock_get.side_effect = fake_get_all
|
||||||
@@ -754,7 +774,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?all_tenants=1',
|
req = self.req('/servers?all_tenants=1',
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -766,7 +786,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?all_tenants=0',
|
req = self.req('/servers?all_tenants=0',
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -778,7 +798,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?all_tenants=false',
|
req = self.req('/servers?all_tenants=false',
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -790,7 +810,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?all_tenants=xxx',
|
req = self.req('/servers?all_tenants=xxx',
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest,
|
self.assertRaises(webob.exc.HTTPBadRequest,
|
||||||
self.controller.index, req)
|
self.controller.index, req)
|
||||||
@@ -803,7 +823,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers',
|
req = self.req('/servers',
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -825,7 +845,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
}
|
}
|
||||||
policy.set_rules(rules)
|
policy.set_rules(rules)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?all_tenants=1')
|
req = self.req('/servers?all_tenants=1')
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
|
|
||||||
@@ -844,7 +864,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
policy.set_rules(rules)
|
policy.set_rules(rules)
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?all_tenants=1')
|
req = self.req('/servers?all_tenants=1')
|
||||||
self.assertRaises(exception.PolicyNotAuthorized,
|
self.assertRaises(exception.PolicyNotAuthorized,
|
||||||
self.controller.index, req)
|
self.controller.index, req)
|
||||||
|
|
||||||
@@ -863,14 +883,14 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?flavor=12345')
|
req = self.req('/servers?flavor=12345')
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
self.assertEqual(servers[0]['id'], server_uuid)
|
self.assertEqual(servers[0]['id'], server_uuid)
|
||||||
|
|
||||||
def test_get_servers_with_bad_flavor(self):
|
def test_get_servers_with_bad_flavor(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?flavor=abcde')
|
req = self.req('/servers?flavor=abcde')
|
||||||
with mock.patch.object(compute_api.API, 'get_all') as mock_get:
|
with mock.patch.object(compute_api.API, 'get_all') as mock_get:
|
||||||
mock_get.return_value = objects.InstanceList(objects=[])
|
mock_get.return_value = objects.InstanceList(objects=[])
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
@@ -878,7 +898,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.assertEqual(len(servers), 0)
|
self.assertEqual(len(servers), 0)
|
||||||
|
|
||||||
def test_get_server_details_with_bad_flavor(self):
|
def test_get_server_details_with_bad_flavor(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?flavor=abcde')
|
req = self.req('/servers?flavor=abcde')
|
||||||
with mock.patch.object(compute_api.API, 'get_all') as mock_get:
|
with mock.patch.object(compute_api.API, 'get_all') as mock_get:
|
||||||
mock_get.return_value = objects.InstanceList(objects=[])
|
mock_get.return_value = objects.InstanceList(objects=[])
|
||||||
servers = self.controller.detail(req)['servers']
|
servers = self.controller.detail(req)['servers']
|
||||||
@@ -899,7 +919,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?status=active')
|
req = self.req('/servers?status=active')
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -924,7 +944,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?status=reboot')
|
req = self.req('/servers?status=reboot')
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -946,7 +966,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?status=resize')
|
req = self.req('/servers?status=resize')
|
||||||
|
|
||||||
servers = self.controller.detail(req)['servers']
|
servers = self.controller.detail(req)['servers']
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -954,13 +974,13 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
def test_get_servers_invalid_status(self):
|
def test_get_servers_invalid_status(self):
|
||||||
# Test getting servers by invalid status.
|
# Test getting servers by invalid status.
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?status=baloney',
|
req = self.req('/servers?status=baloney',
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
self.assertEqual(len(servers), 0)
|
self.assertEqual(len(servers), 0)
|
||||||
|
|
||||||
def test_get_servers_deleted_status_as_user(self):
|
def test_get_servers_deleted_status_as_user(self):
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?status=deleted',
|
req = self.req('/servers?status=deleted',
|
||||||
use_admin_context=False)
|
use_admin_context=False)
|
||||||
self.assertRaises(webob.exc.HTTPForbidden,
|
self.assertRaises(webob.exc.HTTPForbidden,
|
||||||
self.controller.detail, req)
|
self.controller.detail, req)
|
||||||
@@ -979,7 +999,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?status=deleted',
|
req = self.req('/servers?status=deleted',
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
servers = self.controller.detail(req)['servers']
|
servers = self.controller.detail(req)['servers']
|
||||||
@@ -995,7 +1015,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
vm_state='deleted')])
|
vm_state='deleted')])
|
||||||
mock_get_all.return_value = db_list
|
mock_get_all.return_value = db_list
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?deleted=true',
|
req = self.req('/servers?deleted=true',
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
|
|
||||||
servers = self.controller.detail(req)['servers']
|
servers = self.controller.detail(req)['servers']
|
||||||
@@ -1049,7 +1069,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?name=whee.*')
|
req = self.req('/servers?name=whee.*')
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -1082,7 +1102,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
params = 'changes-since=2011-01-24T17:08:01Z'
|
params = 'changes-since=2011-01-24T17:08:01Z'
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?%s' % params)
|
req = self.req('/servers?%s' % params)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -1090,7 +1110,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
def test_get_servers_allows_changes_since_bad_value(self):
|
def test_get_servers_allows_changes_since_bad_value(self):
|
||||||
params = 'changes-since=asdf'
|
params = 'changes-since=asdf'
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?%s' % params)
|
req = self.req('/servers?%s' % params)
|
||||||
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.index, req)
|
self.assertRaises(webob.exc.HTTPBadRequest, self.controller.index, req)
|
||||||
|
|
||||||
def test_get_servers_admin_filters_as_user(self):
|
def test_get_servers_admin_filters_as_user(self):
|
||||||
@@ -1147,7 +1167,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
query_str = "name=foo&ip=10.*&status=active&unknown_option=meow"
|
query_str = "name=foo&ip=10.*&status=active&unknown_option=meow"
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?%s' % query_str,
|
req = self.req('/servers?%s' % query_str,
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
@@ -1170,7 +1190,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?ip=10\..*')
|
req = self.req('/servers?ip=10\..*')
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
self.assertEqual(len(servers), 1)
|
self.assertEqual(len(servers), 1)
|
||||||
@@ -1193,7 +1213,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?ip6=ffff.*',
|
req = self.req('/servers?ip6=ffff.*',
|
||||||
use_admin_context=True)
|
use_admin_context=True)
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
@@ -1217,7 +1237,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers?ip6=ffff.*')
|
req = self.req('/servers?ip6=ffff.*')
|
||||||
req.api_version_request = api_version_request.APIVersionRequest('2.5')
|
req.api_version_request = api_version_request.APIVersionRequest('2.5')
|
||||||
servers = self.controller.index(req)['servers']
|
servers = self.controller.index(req)['servers']
|
||||||
|
|
||||||
@@ -1243,7 +1263,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/detail')
|
req = self.req('/servers/detail')
|
||||||
res_dict = self.controller.detail(req)
|
res_dict = self.controller.detail(req)
|
||||||
|
|
||||||
for i, s in enumerate(res_dict['servers']):
|
for i, s in enumerate(res_dict['servers']):
|
||||||
@@ -1274,7 +1294,7 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', return_servers_with_host)
|
self.stubs.Set(compute_api.API, 'get_all', return_servers_with_host)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers/detail')
|
req = self.req('/servers/detail')
|
||||||
res_dict = self.controller.detail(req)
|
res_dict = self.controller.detail(req)
|
||||||
|
|
||||||
server_list = res_dict['servers']
|
server_list = res_dict['servers']
|
||||||
@@ -1298,11 +1318,92 @@ class ServersControllerTest(ControllerTest):
|
|||||||
|
|
||||||
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
self.stubs.Set(compute_api.API, 'get_all', fake_get_all)
|
||||||
|
|
||||||
req = fakes.HTTPRequestV3.blank('/servers', use_admin_context=True)
|
req = self.req('/servers', use_admin_context=True)
|
||||||
self.assertIn('servers', self.controller.index(req))
|
self.assertIn('servers', self.controller.index(req))
|
||||||
self.assertIn('pci_devices', self.expected_attrs)
|
self.assertIn('pci_devices', self.expected_attrs)
|
||||||
|
|
||||||
|
|
||||||
|
class ServersControllerTestV29(ServersControllerTest):
|
||||||
|
wsgi_api_version = '2.9'
|
||||||
|
|
||||||
|
def _get_server_data_dict(self, uuid, image_bookmark, flavor_bookmark,
|
||||||
|
status="ACTIVE", progress=100):
|
||||||
|
server_dict = super(ServersControllerTestV29,
|
||||||
|
self)._get_server_data_dict(uuid,
|
||||||
|
image_bookmark,
|
||||||
|
flavor_bookmark,
|
||||||
|
status,
|
||||||
|
progress)
|
||||||
|
server_dict['server']['locked'] = False
|
||||||
|
return server_dict
|
||||||
|
|
||||||
|
@mock.patch.object(compute_api.API, 'get')
|
||||||
|
def _test_get_server_with_lock(self, locked_by, get_mock):
|
||||||
|
image_bookmark = "http://localhost/images/10"
|
||||||
|
flavor_bookmark = "http://localhost/flavors/2"
|
||||||
|
uuid = FAKE_UUID
|
||||||
|
get_mock.side_effect = fakes.fake_compute_get(id=2,
|
||||||
|
locked_by=locked_by,
|
||||||
|
uuid=uuid)
|
||||||
|
|
||||||
|
req = self.req('/servers/%s' % uuid)
|
||||||
|
res_dict = self.controller.show(req, uuid)
|
||||||
|
|
||||||
|
expected_server = self._get_server_data_dict(uuid,
|
||||||
|
image_bookmark,
|
||||||
|
flavor_bookmark,
|
||||||
|
status="BUILD",
|
||||||
|
progress=0)
|
||||||
|
expected_server['server']['locked'] = True if locked_by else False
|
||||||
|
self.assertThat(res_dict, matchers.DictMatches(expected_server))
|
||||||
|
return res_dict
|
||||||
|
|
||||||
|
def test_get_server_with_locked_by_admin(self):
|
||||||
|
res_dict = self._test_get_server_with_lock('admin')
|
||||||
|
self.assertTrue(res_dict['server']['locked'])
|
||||||
|
|
||||||
|
def test_get_server_with_locked_by_owner(self):
|
||||||
|
res_dict = self._test_get_server_with_lock('owner')
|
||||||
|
self.assertTrue(res_dict['server']['locked'])
|
||||||
|
|
||||||
|
def test_get_server_not_locked(self):
|
||||||
|
res_dict = self._test_get_server_with_lock(None)
|
||||||
|
self.assertFalse(res_dict['server']['locked'])
|
||||||
|
|
||||||
|
@mock.patch.object(compute_api.API, 'get_all')
|
||||||
|
def _test_list_server_detail_with_lock(self,
|
||||||
|
s1_locked,
|
||||||
|
s2_locked,
|
||||||
|
get_all_mock):
|
||||||
|
get_all_mock.return_value = fake_instance_get_all_with_locked(
|
||||||
|
context, [s1_locked, s2_locked])
|
||||||
|
req = self.req('/servers/detail')
|
||||||
|
servers_list = self.controller.detail(req)
|
||||||
|
# Check that each returned server has the same 'locked' value
|
||||||
|
# and 'id' as they were created.
|
||||||
|
for locked in [s1_locked, s2_locked]:
|
||||||
|
server = next(server for server in servers_list['servers']
|
||||||
|
if (server['id'] == fakes.get_fake_uuid(locked)))
|
||||||
|
expected = False if locked == 'not_locked' else True
|
||||||
|
self.assertEqual(expected, server['locked'])
|
||||||
|
|
||||||
|
def test_list_server_detail_with_locked_s1_admin_s2_owner(self):
|
||||||
|
self._test_list_server_detail_with_lock('admin', 'owner')
|
||||||
|
|
||||||
|
def test_list_server_detail_with_locked_s1_owner_s2_admin(self):
|
||||||
|
self._test_list_server_detail_with_lock('owner', 'admin')
|
||||||
|
|
||||||
|
def test_list_server_detail_with_locked_s1_admin_s2_admin(self):
|
||||||
|
self._test_list_server_detail_with_lock('admin', 'admin')
|
||||||
|
|
||||||
|
def test_list_server_detail_with_locked_s1_admin_s2_not_locked(self):
|
||||||
|
self._test_list_server_detail_with_lock('admin', 'not_locked')
|
||||||
|
|
||||||
|
def test_list_server_detail_with_locked_s1_s2_not_locked(self):
|
||||||
|
self._test_list_server_detail_with_lock('not_locked',
|
||||||
|
'not_locked')
|
||||||
|
|
||||||
|
|
||||||
class ServersControllerDeleteTest(ControllerTest):
|
class ServersControllerDeleteTest(ControllerTest):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ EXP_VERSIONS = {
|
|||||||
"v2.1": {
|
"v2.1": {
|
||||||
"id": "v2.1",
|
"id": "v2.1",
|
||||||
"status": "CURRENT",
|
"status": "CURRENT",
|
||||||
"version": "2.8",
|
"version": "2.9",
|
||||||
"min_version": "2.1",
|
"min_version": "2.1",
|
||||||
"updated": "2013-07-23T11:33:21Z",
|
"updated": "2013-07-23T11:33:21Z",
|
||||||
"links": [
|
"links": [
|
||||||
@@ -114,7 +114,7 @@ class VersionsTestV20(test.NoDBTestCase):
|
|||||||
{
|
{
|
||||||
"id": "v2.1",
|
"id": "v2.1",
|
||||||
"status": "CURRENT",
|
"status": "CURRENT",
|
||||||
"version": "2.8",
|
"version": "2.9",
|
||||||
"min_version": "2.1",
|
"min_version": "2.1",
|
||||||
"updated": "2013-07-23T11:33:21Z",
|
"updated": "2013-07-23T11:33:21Z",
|
||||||
"links": [
|
"links": [
|
||||||
|
|||||||
Reference in New Issue
Block a user