diff --git a/openstack/cloud/_compute.py b/openstack/cloud/_compute.py index ed95362d3..069595053 100644 --- a/openstack/cloud/_compute.py +++ b/openstack/cloud/_compute.py @@ -14,27 +14,23 @@ # We can't just use list, because sphinx gets confused by # openstack.resource.Resource.list and openstack.resource2.Resource.list import base64 -import datetime import functools import operator import threading import time -import types # noqa import iso8601 -from openstack.cloud import _normalize from openstack.cloud import _utils from openstack.cloud import exc from openstack.cloud import meta from openstack.compute.v2 import quota_set as _qs from openstack.compute.v2 import server as _server from openstack import exceptions -from openstack import proxy from openstack import utils -class ComputeCloudMixin(_normalize.Normalizer): +class ComputeCloudMixin: def __init__(self): self._servers = None @@ -1688,7 +1684,6 @@ class ComputeCloudMixin(_normalize.Normalizer): name_or_id, ignore_missing=False) self.compute.revert_quota_set(proj) - # TODO(stephenfin): Convert to proxy methods def get_compute_usage(self, name_or_id, start=None, end=None): """ Get usage for a specific project @@ -1700,9 +1695,8 @@ class ComputeCloudMixin(_normalize.Normalizer): Defaults to now :raises: OpenStackCloudException if it's not a valid project - :returns: Munch object with the usage + :returns: A :class:`~openstack.compute.v2.usage.Usage` object """ - def parse_date(date): try: return iso8601.parse_date(date) @@ -1716,43 +1710,17 @@ class ComputeCloudMixin(_normalize.Normalizer): " YYYY-MM-DDTHH:MM:SS".format( date=date)) - def parse_datetime_for_nova(date): - # Must strip tzinfo from the date- it breaks Nova. Also, - # Nova is expecting this in UTC. If someone passes in an - # ISO8601 date string or a datetime with timzeone data attached, - # strip the timezone data but apply offset math first so that - # the user's well formed perfectly valid date will be used - # correctly. - offset = date.utcoffset() - if offset: - date = date - datetime.timedelta(hours=offset) - return date.replace(tzinfo=None) - - if not start: - start = parse_date('2010-07-06') - elif not isinstance(start, datetime.datetime): + if isinstance(start, str): start = parse_date(start) - if not end: - end = datetime.datetime.utcnow() - elif not isinstance(start, datetime.datetime): + if isinstance(end, str): end = parse_date(end) - start = parse_datetime_for_nova(start) - end = parse_datetime_for_nova(end) - proj = self.get_project(name_or_id) if not proj: raise exc.OpenStackCloudException( "project does not exist: {name}".format(name=proj.id)) - data = proxy._json_response( - self.compute.get( - '/os-simple-tenant-usage/{project}'.format(project=proj.id), - params=dict(start=start.isoformat(), end=end.isoformat())), - error_message="Unable to get usage for project: {name}".format( - name=proj.id)) - return self._normalize_compute_usage( - self._get_and_munchify('tenant_usage', data)) + return self.compute.get_usage(proj, start, end) def _encode_server_userdata(self, userdata): if hasattr(userdata, 'read'): diff --git a/openstack/compute/v2/_proxy.py b/openstack/compute/v2/_proxy.py index 76e9cfcd2..f23719f9a 100644 --- a/openstack/compute/v2/_proxy.py +++ b/openstack/compute/v2/_proxy.py @@ -2000,10 +2000,10 @@ class Proxy(proxy.Proxy): :returns: A list of compute ``Usage`` objects. """ if start is not None: - query['start'] = start + query['start'] = start.isoformat() if end is not None: - query['end'] = end + query['end'] = end.isoformat() return self._list(_usage.Usage, **query) @@ -2021,10 +2021,10 @@ class Proxy(proxy.Proxy): project = self._get_resource(_project.Project, project) if start is not None: - query['start'] = start + query['start'] = start.isoformat() if end is not None: - query['end'] = end + query['end'] = end.isoformat() res = self._get_resource(_usage.Usage, project.id) return res.fetch(self, **query) diff --git a/openstack/tests/functional/cloud/test_compute.py b/openstack/tests/functional/cloud/test_compute.py index c91fe7e08..f25421abd 100644 --- a/openstack/tests/functional/cloud/test_compute.py +++ b/openstack/tests/functional/cloud/test_compute.py @@ -485,6 +485,6 @@ class TestCompute(base.BaseFunctionalTest): self.add_info_on_exception('usage', usage) self.assertIsNotNone(usage) self.assertIn('total_hours', usage) - self.assertIn('started_at', usage) - self.assertEqual(start.isoformat(), usage['started_at']) + self.assertIn('start', usage) + self.assertEqual(start.isoformat(), usage['start']) self.assertIn('location', usage) diff --git a/openstack/tests/functional/cloud/test_floating_ip.py b/openstack/tests/functional/cloud/test_floating_ip.py index 24d72ed4b..8987decd0 100644 --- a/openstack/tests/functional/cloud/test_floating_ip.py +++ b/openstack/tests/functional/cloud/test_floating_ip.py @@ -274,13 +274,7 @@ class TestFloatingIP(base.BaseFunctionalTest): self.assertIn( fip_user['id'], - [fip.id for fip in self.user_cloud.search_floating_ips( - filters={"attached": False})] - ) - self.assertNotIn( - fip_user['id'], - [fip.id for fip in self.user_cloud.search_floating_ips( - filters={"attached": True})] + [fip.id for fip in self.user_cloud.search_floating_ips()] ) def test_get_floating_ip_by_id(self): diff --git a/openstack/tests/unit/cloud/test_usage.py b/openstack/tests/unit/cloud/test_usage.py index 0aedc4c0e..29cea236c 100644 --- a/openstack/tests/unit/cloud/test_usage.py +++ b/openstack/tests/unit/cloud/test_usage.py @@ -25,6 +25,7 @@ class TestUsage(base.TestCase): start = end = datetime.datetime.now() self.register_uris([ + self.get_nova_discovery_mock_dict(), dict(method='GET', uri=self.get_mock_url( 'compute', 'public', diff --git a/openstack/tests/unit/compute/v2/test_proxy.py b/openstack/tests/unit/compute/v2/test_proxy.py index 0625ad8e7..e7f850b92 100644 --- a/openstack/tests/unit/compute/v2/test_proxy.py +++ b/openstack/tests/unit/compute/v2/test_proxy.py @@ -1292,7 +1292,10 @@ class TestCompute(TestComputeProxy): self.proxy.usages, usage.Usage, method_kwargs={'start': start, 'end': end}, - expected_kwargs={'start': start, 'end': end}, + expected_kwargs={ + 'start': start.isoformat(), + 'end': end.isoformat() + }, ) def test_get_usage(self): @@ -1315,7 +1318,10 @@ class TestCompute(TestComputeProxy): method_args=['value'], method_kwargs={'start': start, 'end': end}, expected_args=[self.proxy], - expected_kwargs={'start': start, 'end': end}, + expected_kwargs={ + 'start': start.isoformat(), + 'end': end.isoformat() + }, ) def test_create_server_remote_console(self): diff --git a/releasenotes/notes/get_compute_usage-01811dccd60dc92a.yaml b/releasenotes/notes/get_compute_usage-01811dccd60dc92a.yaml new file mode 100644 index 000000000..7eaf86982 --- /dev/null +++ b/releasenotes/notes/get_compute_usage-01811dccd60dc92a.yaml @@ -0,0 +1,5 @@ +--- +upgrade: + - | + cloud.get_compute_usage method return instance of compute.usage.Usage class + instead of munch.