diff --git a/releasenotes/notes/network-show-version-18e1707a4df0a3d3.yaml b/releasenotes/notes/network-show-version-18e1707a4df0a3d3.yaml new file mode 100644 index 0000000000..36a9710664 --- /dev/null +++ b/releasenotes/notes/network-show-version-18e1707a4df0a3d3.yaml @@ -0,0 +1,7 @@ +--- +features: +- | + Add ``show_version`` function to the ``NetworkVersionsClient`` client. This + allows the possibility of getting details for Networking API. + + .. API reference: https://developer.openstack.org/api-ref/network/v2/index.html#show-api-v2-details diff --git a/tempest/api/network/test_versions.py b/tempest/api/network/test_versions.py index 2f01e50408..020cb5cca2 100644 --- a/tempest/api/network/test_versions.py +++ b/tempest/api/network/test_versions.py @@ -29,7 +29,7 @@ class NetworksApiDiscovery(base.BaseNetworkTest): """ result = self.network_versions_client.list_versions() - expected_versions = ('v2.0') + expected_versions = ('v2.0',) expected_resources = ('id', 'links', 'status') received_list = result.values() @@ -38,3 +38,14 @@ class NetworksApiDiscovery(base.BaseNetworkTest): for resource in expected_resources: self.assertIn(resource, version) self.assertIn(version['id'], expected_versions) + + @decorators.attr(type='smoke') + @decorators.idempotent_id('e64b7216-3178-4263-967c-d389290988bf') + def test_show_api_v2_details(self): + """Test that GET /v2.0/ returns expected resources.""" + current_version = 'v2.0' + expected_resources = ('subnet', 'network', 'port') + result = self.network_versions_client.show_version(current_version) + actual_resources = [r['name'] for r in result['resources']] + for resource in expected_resources: + self.assertIn(resource, actual_resources) diff --git a/tempest/lib/services/network/versions_client.py b/tempest/lib/services/network/versions_client.py index f87fe87e28..807f41671b 100644 --- a/tempest/lib/services/network/versions_client.py +++ b/tempest/lib/services/network/versions_client.py @@ -12,32 +12,36 @@ # License for the specific language governing permissions and limitations # under the License. -import time - from oslo_serialization import jsonutils as json +from tempest.lib.common import rest_client from tempest.lib.services.network import base class NetworkVersionsClient(base.BaseNetworkClient): def list_versions(self): - """Do a GET / to fetch available API version information.""" + """Do a GET / to fetch available API version information. - version_url = self._get_base_version_url() + For more information, please refer to the official API reference: + https://developer.openstack.org/api-ref/network/v2/index.html#list-api-versions + """ - # Note: we do a raw_request here because we want to use + # Note: we do a self.get('/') here because we want to use # an unversioned URL, not "v2/$project_id/". - # Since raw_request doesn't log anything, we do that too. - start = time.time() - self._log_request_start('GET', version_url) - response, body = self.raw_request(version_url, 'GET') - self._error_checker(response, body) - end = time.time() - self._log_request('GET', version_url, response, - secs=(end - start), resp_body=body) - - self.response_checker('GET', response, body) - self.expected_success(200, response.status) + resp, body = self.get('/') body = json.loads(body) - return body + self.expected_success(200, resp.status) + return rest_client.ResponseBody(resp, body) + + def show_version(self, version): + """Do a GET / to fetch available resources. + + For more information, please refer to the official API reference: + https://developer.openstack.org/api-ref/network/v2/index.html#show-api-v2-details + """ + + resp, body = self.get(version + '/') + body = json.loads(body) + self.expected_success(200, resp.status) + return rest_client.ResponseBody(resp, body) diff --git a/tempest/tests/lib/services/network/test_versions_client.py b/tempest/tests/lib/services/network/test_versions_client.py index 026dc6de27..188fc31a1a 100644 --- a/tempest/tests/lib/services/network/test_versions_client.py +++ b/tempest/tests/lib/services/network/test_versions_client.py @@ -12,63 +12,92 @@ # License for the specific language governing permissions and limitations # under the License. -import copy - from tempest.lib.services.network import versions_client from tempest.tests.lib import fake_auth_provider from tempest.tests.lib.services import base class TestNetworkVersionsClient(base.BaseServiceTest): - - FAKE_INIT_VERSION = { - "version": { - "id": "v2.0", - "links": [ - { - "href": "http://openstack.example.com/v2.0/", - "rel": "self" - }, - { - "href": "http://docs.openstack.org/", - "rel": "describedby", - "type": "text/html" - } - ], - "status": "CURRENT" - } - } + VERSION = "v2.0" FAKE_VERSIONS_INFO = { - "versions": [FAKE_INIT_VERSION["version"]] - } - - FAKE_VERSION_INFO = copy.deepcopy(FAKE_INIT_VERSION) - - FAKE_VERSION_INFO["version"]["media-types"] = [ - { - "base": "application/json", - "type": "application/vnd.openstack.network+json;version=2.0" - } + "versions": [ + { + "id": "v2.0", + "links": [ + { + "href": "http://openstack.example.com/%s/" % VERSION, + "rel": "self" + } + ], + "status": "CURRENT" + } ] + } + + FAKE_VERSION_DETAILS = { + "resources": [ + { + "collection": "subnets", + "links": [ + { + "href": "http://openstack.example.com:9696/" + "%s/subnets" % VERSION, + "rel": "self" + } + ], + "name": "subnet" + }, + { + "collection": "networks", + "links": [ + { + "href": "http://openstack.example.com:9696/" + "%s/networks" % VERSION, + "rel": "self" + } + ], + "name": "network" + }, + { + "collection": "ports", + "links": [ + { + "href": "http://openstack.example.com:9696/" + "%s/ports" % VERSION, + "rel": "self" + } + ], + "name": "port" + } + ] + } def setUp(self): super(TestNetworkVersionsClient, self).setUp() fake_auth = fake_auth_provider.FakeAuthProvider() - self.versions_client = ( - versions_client.NetworkVersionsClient - (fake_auth, 'compute', 'regionOne')) + self.versions_client = versions_client.NetworkVersionsClient( + fake_auth, 'compute', 'regionOne') - def _test_versions_client(self, bytes_body=False): + def _test_versions_client(self, func, body, bytes_body=False, **kwargs): self.check_service_client_function( - self.versions_client.list_versions, - 'tempest.lib.common.rest_client.RestClient.raw_request', - self.FAKE_VERSIONS_INFO, - bytes_body, - 200) + func, 'tempest.lib.common.rest_client.RestClient.raw_request', + body, bytes_body, 200, **kwargs) def test_list_versions_client_with_str_body(self): - self._test_versions_client() + self._test_versions_client(self.versions_client.list_versions, + self.FAKE_VERSIONS_INFO) def test_list_versions_client_with_bytes_body(self): - self._test_versions_client(bytes_body=True) + self._test_versions_client(self.versions_client.list_versions, + self.FAKE_VERSIONS_INFO, bytes_body=True) + + def test_show_version_client_with_str_body(self): + self._test_versions_client(self.versions_client.show_version, + self.FAKE_VERSION_DETAILS, + version=self.VERSION) + + def test_show_version_client_with_bytes_body(self): + self._test_versions_client(self.versions_client.show_version, + self.FAKE_VERSION_DETAILS, bytes_body=True, + version=self.VERSION)