diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4d9d0d5dd..9b64b1e89 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -23,7 +23,7 @@ use Github pull requests for this purpose. ### Running tests We use [`tox`](https://tox.readthedocs.io/) for running our tests. To run tests before sending out a pull request, just -[install tox](https://http://tox.readthedocs.io/en/latest/install.html) and run +[install tox](https://tox.readthedocs.io/en/latest/install.html) and run ```shell $ tox diff --git a/datalab/stackdriver/monitoring/__init__.py b/datalab/stackdriver/monitoring/__init__.py index 824073932..40b275146 100644 --- a/datalab/stackdriver/monitoring/__init__.py +++ b/datalab/stackdriver/monitoring/__init__.py @@ -14,12 +14,15 @@ from __future__ import absolute_import -from google.cloud.monitoring import Aligner, Reducer +from google.cloud.monitoring import enums from ._group import Groups from ._metric import MetricDescriptors from ._query import Query from ._query_metadata import QueryMetadata from ._resource import ResourceDescriptors +Aligner = enums.Aggregation.Aligner +Reducer = enums.Aggregation.Reducer + __all__ = ['Aligner', 'Reducer', 'Groups', 'MetricDescriptors', 'Query', 'QueryMetadata', 'ResourceDescriptors'] diff --git a/datalab/stackdriver/monitoring/_group.py b/datalab/stackdriver/monitoring/_group.py index 2ce4d9a1f..7d2465e2c 100644 --- a/datalab/stackdriver/monitoring/_group.py +++ b/datalab/stackdriver/monitoring/_group.py @@ -21,7 +21,7 @@ import pandas -import datalab.context +import google.datalab from . import _utils @@ -32,17 +32,14 @@ class Groups(object): _DISPLAY_HEADERS = ('Group ID', 'Group name', 'Parent ID', 'Parent name', 'Is cluster', 'Filter') - def __init__(self, project_id=None, context=None): + def __init__(self, context=None): """Initializes the Groups for a Stackdriver project. Args: - project_id: An optional project ID or number to override the one provided - by the context. context: An optional Context object to use instead of the global default. """ - self._context = context or datalab.context.Context.default() - self._project_id = project_id or self._context.project_id - self._client = _utils.make_client(project_id, context) + self._context = context or google.datalab.Context.default() + self._client = _utils.make_client(self._context) self._group_dict = None def list(self, pattern='*'): @@ -58,7 +55,7 @@ def list(self, pattern='*'): """ if self._group_dict is None: self._group_dict = collections.OrderedDict( - (group.id, group) for group in self._client.list_groups()) + (group.name, group) for group in self._client.list_groups()) return [group for group in self._group_dict.values() if fnmatch.fnmatch(group.display_name, pattern)] @@ -79,10 +76,10 @@ def as_dataframe(self, pattern='*', max_rows=None): for i, group in enumerate(self.list(pattern)): if max_rows is not None and i >= max_rows: break - parent = self._group_dict.get(group.parent_id) + parent = self._group_dict.get(group.parent_name) parent_display_name = '' if parent is None else parent.display_name data.append([ - group.id, group.display_name, group.parent_id, + group.name, group.display_name, group.parent_name, parent_display_name, group.is_cluster, group.filter]) return pandas.DataFrame(data, columns=self._DISPLAY_HEADERS) diff --git a/datalab/stackdriver/monitoring/_metric.py b/datalab/stackdriver/monitoring/_metric.py index faa3b70d4..eb73bcbe0 100644 --- a/datalab/stackdriver/monitoring/_metric.py +++ b/datalab/stackdriver/monitoring/_metric.py @@ -15,6 +15,8 @@ from __future__ import absolute_import from builtins import object +from google.cloud.monitoring_v3 import enums + import fnmatch import pandas @@ -27,8 +29,7 @@ class MetricDescriptors(object): _DISPLAY_HEADERS = ('Metric type', 'Display name', 'Kind', 'Value', 'Unit', 'Labels') - def __init__(self, filter_string=None, type_prefix=None, - project_id=None, context=None): + def __init__(self, filter_string=None, type_prefix=None, context=None): """Initializes the MetricDescriptors based on the specified filters. Args: @@ -36,11 +37,9 @@ def __init__(self, filter_string=None, type_prefix=None, descriptors to be returned. type_prefix: An optional prefix constraining the selected metric types. This adds ``metric.type = starts_with("")`` to the filter. - project_id: An optional project ID or number to override the one provided - by the context. context: An optional Context object to use instead of the global default. """ - self._client = _utils.make_client(project_id, context) + self._client = _utils.make_client(context) self._filter_string = filter_string self._type_prefix = type_prefix self._descriptors = None @@ -81,7 +80,9 @@ def as_dataframe(self, pattern='*', max_rows=None): break labels = ', '. join([l.key for l in metric.labels]) data.append([ - metric.type, metric.display_name, metric.metric_kind, - metric.value_type, metric.unit, labels]) + metric.type, metric.display_name, + enums.MetricDescriptor.MetricKind(metric.metric_kind).name, + enums.MetricDescriptor.ValueType(metric.value_type).name, + metric.unit, labels]) return pandas.DataFrame(data, columns=self._DISPLAY_HEADERS) diff --git a/datalab/stackdriver/monitoring/_query.py b/datalab/stackdriver/monitoring/_query.py index 16f4b88be..077f79d60 100644 --- a/datalab/stackdriver/monitoring/_query.py +++ b/datalab/stackdriver/monitoring/_query.py @@ -14,19 +14,18 @@ from __future__ import absolute_import -import google.cloud.monitoring +import google.cloud.monitoring_v3.query from . import _query_metadata from . import _utils -class Query(google.cloud.monitoring.Query): +class Query(google.cloud.monitoring_v3.query.Query): """Query object for retrieving metric data.""" def __init__(self, - metric_type=google.cloud.monitoring.Query.DEFAULT_METRIC_TYPE, - end_time=None, days=0, hours=0, minutes=0, - project_id=None, context=None): + metric_type=google.cloud.monitoring_v3.query.Query.DEFAULT_METRIC_TYPE, + end_time=None, days=0, hours=0, minutes=0, context=None): """Initializes the core query parameters. The start time (exclusive) is determined by combining the @@ -34,13 +33,13 @@ def __init__(self, the resulting duration from the end time. It is also allowed to omit the end time and duration here, - in which case :meth:`~google.cloud.monitoring.query.Query.select_interval` + in which case :meth:`~google.cloud.monitoring_v3.query.Query.select_interval` must be called before the query is executed. Args: metric_type: The metric type name. The default value is :data:`Query.DEFAULT_METRIC_TYPE - `, but + `, but please note that this default value is provided only for demonstration purposes and is subject to change. end_time: The end time (inclusive) of the time interval for which @@ -49,18 +48,18 @@ def __init__(self, days: The number of days in the time interval. hours: The number of hours in the time interval. minutes: The number of minutes in the time interval. - project_id: An optional project ID or number to override the one provided - by the context. context: An optional Context object to use instead of the global default. Raises: ValueError: ``end_time`` was specified but ``days``, ``hours``, and ``minutes`` are all zero. If you really want to specify a point in time, use - :meth:`~google.cloud.monitoring.query.Query.select_interval`. + :meth:`~google.cloud.monitoring_v3.query.Query.select_interval`. """ - client = _utils.make_client(project_id, context) - super(Query, self).__init__(client, metric_type, + client = _utils.make_client(context) + super(Query, self).__init__(client.metrics_client, + project=client.project, + metric_type=metric_type, end_time=end_time, days=days, hours=hours, minutes=minutes) diff --git a/datalab/stackdriver/monitoring/_query_metadata.py b/datalab/stackdriver/monitoring/_query_metadata.py index 2cfe99fbe..535813f45 100644 --- a/datalab/stackdriver/monitoring/_query_metadata.py +++ b/datalab/stackdriver/monitoring/_query_metadata.py @@ -17,7 +17,8 @@ from __future__ import unicode_literals from builtins import object -import google.cloud.monitoring +from google.cloud.monitoring_v3 import _dataframe +from google.protobuf.json_format import MessageToDict import pandas @@ -64,8 +65,9 @@ def as_dataframe(self, max_rows=None): """ max_rows = len(self._timeseries_list) if max_rows is None else max_rows headers = [{ - 'resource': ts.resource._asdict(), 'metric': ts.metric._asdict()} - for ts in self._timeseries_list[:max_rows]] + 'resource': MessageToDict(ts.resource), + 'metric': MessageToDict(ts.metric) + } for ts in self._timeseries_list[:max_rows]] if not headers: return pandas.DataFrame() @@ -78,7 +80,7 @@ def as_dataframe(self, max_rows=None): for col in dataframe.columns]) # Re-order the columns. - resource_keys = google.cloud.monitoring._dataframe._sorted_resource_labels( + resource_keys = _dataframe._sorted_resource_labels( dataframe['resource.labels'].columns) sorted_columns = [('resource.type', '')] sorted_columns += [('resource.labels', key) for key in resource_keys] diff --git a/datalab/stackdriver/monitoring/_resource.py b/datalab/stackdriver/monitoring/_resource.py index a8868c969..373d26551 100644 --- a/datalab/stackdriver/monitoring/_resource.py +++ b/datalab/stackdriver/monitoring/_resource.py @@ -26,17 +26,15 @@ class ResourceDescriptors(object): _DISPLAY_HEADERS = ('Resource type', 'Display name', 'Labels') - def __init__(self, filter_string=None, project_id=None, context=None): + def __init__(self, filter_string=None, context=None): """Initializes the ResourceDescriptors based on the specified filters. Args: filter_string: An optional filter expression describing the resource descriptors to be returned. - project_id: An optional project ID or number to override the one provided - by the context. context: An optional Context object to use instead of the global default. """ - self._client = _utils.make_client(project_id, context) + self._client = _utils.make_client(context) self._filter_string = filter_string self._descriptors = None diff --git a/datalab/stackdriver/monitoring/_utils.py b/datalab/stackdriver/monitoring/_utils.py index 7218467d1..d348e9398 100644 --- a/datalab/stackdriver/monitoring/_utils.py +++ b/datalab/stackdriver/monitoring/_utils.py @@ -14,17 +14,54 @@ from __future__ import absolute_import -import google.cloud.monitoring +from google.api_core.gapic_v1.client_info import ClientInfo +from google.cloud.monitoring_v3 import MetricServiceClient +from google.cloud.monitoring_v3 import GroupServiceClient -import datalab.context +import google.datalab -def make_client(project_id=None, context=None): - context = context or datalab.context.Context.default() - project_id = project_id or context.project_id - client = google.cloud.monitoring.Client( - project=project_id, +# _MonitoringClient holds instances of individual google.cloud.monitoring +# clients and translates each call from the old signature, since the prior +# client has been updated and has split into multiple client classes. +class _MonitoringClient(object): + def __init__(self, context): + self.project = context.project_id + client_info = ClientInfo(user_agent='pydatalab/v0') + self.metrics_client = MetricServiceClient( credentials=context.credentials, - ) - client._connection.USER_AGENT = 'pydatalab/v0' + client_info=client_info + ) + self.group_client = GroupServiceClient( + credentials=context.credentials, + client_info=client_info + ) + + def list_metric_descriptors(self, filter_string=None, type_prefix=None): + filters = [] + if filter_string is not None: + filters.append(filter_string) + + if type_prefix is not None: + filters.append('metric.type = starts_with("{prefix}")'.format( + prefix=type_prefix)) + + metric_filter = ' AND '.join(filters) + metrics = self.metrics_client.list_metric_descriptors( + self.project, filter_=metric_filter) + return metrics + + def list_resource_descriptors(self, filter_string=None): + resources = self.metrics_client.list_monitored_resource_descriptors( + self.project, filter_=filter_string) + return resources + + def list_groups(self): + groups = self.group_client.list_groups(self.project) + return groups + + +def make_client(context=None): + context = context or google.datalab.Context.default() + client = _MonitoringClient(context) return client diff --git a/google/datalab/stackdriver/monitoring/__init__.py b/google/datalab/stackdriver/monitoring/__init__.py index 824073932..40b275146 100644 --- a/google/datalab/stackdriver/monitoring/__init__.py +++ b/google/datalab/stackdriver/monitoring/__init__.py @@ -14,12 +14,15 @@ from __future__ import absolute_import -from google.cloud.monitoring import Aligner, Reducer +from google.cloud.monitoring import enums from ._group import Groups from ._metric import MetricDescriptors from ._query import Query from ._query_metadata import QueryMetadata from ._resource import ResourceDescriptors +Aligner = enums.Aggregation.Aligner +Reducer = enums.Aggregation.Reducer + __all__ = ['Aligner', 'Reducer', 'Groups', 'MetricDescriptors', 'Query', 'QueryMetadata', 'ResourceDescriptors'] diff --git a/google/datalab/stackdriver/monitoring/_group.py b/google/datalab/stackdriver/monitoring/_group.py index 70494c4d3..7d2465e2c 100644 --- a/google/datalab/stackdriver/monitoring/_group.py +++ b/google/datalab/stackdriver/monitoring/_group.py @@ -55,7 +55,7 @@ def list(self, pattern='*'): """ if self._group_dict is None: self._group_dict = collections.OrderedDict( - (group.id, group) for group in self._client.list_groups()) + (group.name, group) for group in self._client.list_groups()) return [group for group in self._group_dict.values() if fnmatch.fnmatch(group.display_name, pattern)] @@ -76,10 +76,10 @@ def as_dataframe(self, pattern='*', max_rows=None): for i, group in enumerate(self.list(pattern)): if max_rows is not None and i >= max_rows: break - parent = self._group_dict.get(group.parent_id) + parent = self._group_dict.get(group.parent_name) parent_display_name = '' if parent is None else parent.display_name data.append([ - group.id, group.display_name, group.parent_id, + group.name, group.display_name, group.parent_name, parent_display_name, group.is_cluster, group.filter]) return pandas.DataFrame(data, columns=self._DISPLAY_HEADERS) diff --git a/google/datalab/stackdriver/monitoring/_metric.py b/google/datalab/stackdriver/monitoring/_metric.py index b46c0cab2..eb73bcbe0 100644 --- a/google/datalab/stackdriver/monitoring/_metric.py +++ b/google/datalab/stackdriver/monitoring/_metric.py @@ -15,6 +15,8 @@ from __future__ import absolute_import from builtins import object +from google.cloud.monitoring_v3 import enums + import fnmatch import pandas @@ -78,7 +80,9 @@ def as_dataframe(self, pattern='*', max_rows=None): break labels = ', '. join([l.key for l in metric.labels]) data.append([ - metric.type, metric.display_name, metric.metric_kind, - metric.value_type, metric.unit, labels]) + metric.type, metric.display_name, + enums.MetricDescriptor.MetricKind(metric.metric_kind).name, + enums.MetricDescriptor.ValueType(metric.value_type).name, + metric.unit, labels]) return pandas.DataFrame(data, columns=self._DISPLAY_HEADERS) diff --git a/google/datalab/stackdriver/monitoring/_query.py b/google/datalab/stackdriver/monitoring/_query.py index 8faa4b539..077f79d60 100644 --- a/google/datalab/stackdriver/monitoring/_query.py +++ b/google/datalab/stackdriver/monitoring/_query.py @@ -14,17 +14,17 @@ from __future__ import absolute_import -import google.cloud.monitoring +import google.cloud.monitoring_v3.query from . import _query_metadata from . import _utils -class Query(google.cloud.monitoring.Query): +class Query(google.cloud.monitoring_v3.query.Query): """Query object for retrieving metric data.""" def __init__(self, - metric_type=google.cloud.monitoring.Query.DEFAULT_METRIC_TYPE, + metric_type=google.cloud.monitoring_v3.query.Query.DEFAULT_METRIC_TYPE, end_time=None, days=0, hours=0, minutes=0, context=None): """Initializes the core query parameters. @@ -33,13 +33,13 @@ def __init__(self, the resulting duration from the end time. It is also allowed to omit the end time and duration here, - in which case :meth:`~google.cloud.monitoring.query.Query.select_interval` + in which case :meth:`~google.cloud.monitoring_v3.query.Query.select_interval` must be called before the query is executed. Args: metric_type: The metric type name. The default value is :data:`Query.DEFAULT_METRIC_TYPE - `, but + `, but please note that this default value is provided only for demonstration purposes and is subject to change. end_time: The end time (inclusive) of the time interval for which @@ -54,10 +54,12 @@ def __init__(self, ValueError: ``end_time`` was specified but ``days``, ``hours``, and ``minutes`` are all zero. If you really want to specify a point in time, use - :meth:`~google.cloud.monitoring.query.Query.select_interval`. + :meth:`~google.cloud.monitoring_v3.query.Query.select_interval`. """ client = _utils.make_client(context) - super(Query, self).__init__(client, metric_type, + super(Query, self).__init__(client.metrics_client, + project=client.project, + metric_type=metric_type, end_time=end_time, days=days, hours=hours, minutes=minutes) diff --git a/google/datalab/stackdriver/monitoring/_query_metadata.py b/google/datalab/stackdriver/monitoring/_query_metadata.py index 2cfe99fbe..535813f45 100644 --- a/google/datalab/stackdriver/monitoring/_query_metadata.py +++ b/google/datalab/stackdriver/monitoring/_query_metadata.py @@ -17,7 +17,8 @@ from __future__ import unicode_literals from builtins import object -import google.cloud.monitoring +from google.cloud.monitoring_v3 import _dataframe +from google.protobuf.json_format import MessageToDict import pandas @@ -64,8 +65,9 @@ def as_dataframe(self, max_rows=None): """ max_rows = len(self._timeseries_list) if max_rows is None else max_rows headers = [{ - 'resource': ts.resource._asdict(), 'metric': ts.metric._asdict()} - for ts in self._timeseries_list[:max_rows]] + 'resource': MessageToDict(ts.resource), + 'metric': MessageToDict(ts.metric) + } for ts in self._timeseries_list[:max_rows]] if not headers: return pandas.DataFrame() @@ -78,7 +80,7 @@ def as_dataframe(self, max_rows=None): for col in dataframe.columns]) # Re-order the columns. - resource_keys = google.cloud.monitoring._dataframe._sorted_resource_labels( + resource_keys = _dataframe._sorted_resource_labels( dataframe['resource.labels'].columns) sorted_columns = [('resource.type', '')] sorted_columns += [('resource.labels', key) for key in resource_keys] diff --git a/google/datalab/stackdriver/monitoring/_utils.py b/google/datalab/stackdriver/monitoring/_utils.py index a416396a5..d348e9398 100644 --- a/google/datalab/stackdriver/monitoring/_utils.py +++ b/google/datalab/stackdriver/monitoring/_utils.py @@ -14,16 +14,54 @@ from __future__ import absolute_import -import google.cloud.monitoring +from google.api_core.gapic_v1.client_info import ClientInfo +from google.cloud.monitoring_v3 import MetricServiceClient +from google.cloud.monitoring_v3 import GroupServiceClient import google.datalab +# _MonitoringClient holds instances of individual google.cloud.monitoring +# clients and translates each call from the old signature, since the prior +# client has been updated and has split into multiple client classes. +class _MonitoringClient(object): + def __init__(self, context): + self.project = context.project_id + client_info = ClientInfo(user_agent='pydatalab/v0') + self.metrics_client = MetricServiceClient( + credentials=context.credentials, + client_info=client_info + ) + self.group_client = GroupServiceClient( + credentials=context.credentials, + client_info=client_info + ) + + def list_metric_descriptors(self, filter_string=None, type_prefix=None): + filters = [] + if filter_string is not None: + filters.append(filter_string) + + if type_prefix is not None: + filters.append('metric.type = starts_with("{prefix}")'.format( + prefix=type_prefix)) + + metric_filter = ' AND '.join(filters) + metrics = self.metrics_client.list_metric_descriptors( + self.project, filter_=metric_filter) + return metrics + + def list_resource_descriptors(self, filter_string=None): + resources = self.metrics_client.list_monitored_resource_descriptors( + self.project, filter_=filter_string) + return resources + + def list_groups(self): + groups = self.group_client.list_groups(self.project) + return groups + + def make_client(context=None): context = context or google.datalab.Context.default() - client = google.cloud.monitoring.Client( - project=context.project_id, - credentials=context.credentials, - ) - client._connection.USER_AGENT = 'pydatalab/v0' + client = _MonitoringClient(context) return client diff --git a/legacy_tests/stackdriver/monitoring/group_tests.py b/legacy_tests/stackdriver/monitoring/group_tests.py index 62a8291e5..a9d74798a 100644 --- a/legacy_tests/stackdriver/monitoring/group_tests.py +++ b/legacy_tests/stackdriver/monitoring/group_tests.py @@ -11,16 +11,20 @@ # the License. from __future__ import absolute_import + import mock import unittest +import google.cloud.monitoring_v3 + import google.auth -import datalab.context -import datalab.stackdriver.monitoring as gcm +import google.datalab +import google.datalab.stackdriver.monitoring as gcm +DEFAULT_PROJECT = 'test' PROJECT = 'my-project' GROUP_IDS = ['GROUP-205', 'GROUP-101'] -PARENT_IDS = [None, GROUP_IDS[0]] +PARENT_IDS = ['', GROUP_IDS[0]] DISPLAY_NAMES = ['All Instances', 'GCE Instances'] PARENT_DISPLAY_NAMES = ['', DISPLAY_NAMES[0]] FILTER_STRINGS = ['resource.type = ends_with("instance")', @@ -31,48 +35,51 @@ class TestCases(unittest.TestCase): def setUp(self): - self.context = self._create_context() + self.context = self._create_context(DEFAULT_PROJECT) self.groups = gcm.Groups(context=self.context) - @mock.patch('datalab.context._context.Context.default') - def test_constructor(self, mock_context_default): + @mock.patch('google.datalab.Context.default') + def test_constructor_minimal(self, mock_context_default): mock_context_default.return_value = self.context groups = gcm.Groups() self.assertIs(groups._context, self.context) - self.assertIs(groups._project_id, self.context.project_id) self.assertIsNone(groups._group_dict) - expected_client = gcm._utils.make_client(context=self.context) - self.assertEqual(groups._client.project, expected_client.project) - self.assertEqual(groups._client._connection.credentials, - expected_client._connection.credentials) + self.assertEqual(groups._client.project, DEFAULT_PROJECT) + + def test_constructor_maximal(self): + context = self._create_context(PROJECT) + groups = gcm.Groups(context) + self.assertIs(groups._context, context) + self.assertIsNone(groups._group_dict) + self.assertEqual(groups._client.project, PROJECT) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_list(self, mock_api_list_groups): mock_api_list_groups.return_value = self._list_groups_get_result( context=self.context) group_list = self.groups.list() - mock_api_list_groups.assert_called_once_with() + mock_api_list_groups.assert_called_once_with(DEFAULT_PROJECT) self.assertEqual(len(group_list), 2) - self.assertEqual(group_list[0].id, GROUP_IDS[0]) - self.assertEqual(group_list[1].id, GROUP_IDS[1]) + self.assertEqual(group_list[0].name, GROUP_IDS[0]) + self.assertEqual(group_list[1].name, GROUP_IDS[1]) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_list_w_pattern_match(self, mock_api_list_groups): mock_api_list_groups.return_value = self._list_groups_get_result( context=self.context) group_list = self.groups.list(pattern='GCE*') - mock_api_list_groups.assert_called_once_with() + mock_api_list_groups.assert_called_once_with(DEFAULT_PROJECT) self.assertEqual(len(group_list), 1) - self.assertEqual(group_list[0].id, GROUP_IDS[1]) + self.assertEqual(group_list[0].name, GROUP_IDS[1]) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_list_caching(self, mock_gcloud_list_groups): mock_gcloud_list_groups.return_value = self._list_groups_get_result( context=self.context) @@ -80,15 +87,15 @@ def test_list_caching(self, mock_gcloud_list_groups): actual_list1 = self.groups.list() actual_list2 = self.groups.list() - mock_gcloud_list_groups.assert_called_once_with() + mock_gcloud_list_groups.assert_called_once_with(DEFAULT_PROJECT) self.assertEqual(actual_list1, actual_list2) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_as_dataframe(self, mock_gcloud_list_groups): mock_gcloud_list_groups.return_value = self._list_groups_get_result( context=self.context) dataframe = self.groups.as_dataframe() - mock_gcloud_list_groups.assert_called_once_with() + mock_gcloud_list_groups.assert_called_once_with(DEFAULT_PROJECT) expected_headers = list(gcm.Groups._DISPLAY_HEADERS) self.assertEqual(dataframe.columns.tolist(), expected_headers) @@ -102,12 +109,12 @@ def test_as_dataframe(self, mock_gcloud_list_groups): PARENT_DISPLAY_NAMES, IS_CLUSTERS, FILTER_STRINGS)] self.assertEqual(dataframe.values.tolist(), expected_values) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_as_dataframe_w_all_args(self, mock_gcloud_list_groups): mock_gcloud_list_groups.return_value = self._list_groups_get_result( context=self.context) dataframe = self.groups.as_dataframe(pattern='*Instance*', max_rows=1) - mock_gcloud_list_groups.assert_called_once_with() + mock_gcloud_list_groups.assert_called_once_with(DEFAULT_PROJECT) expected_headers = list(gcm.Groups._DISPLAY_HEADERS) self.assertEqual(dataframe.columns.tolist(), expected_headers) @@ -115,19 +122,19 @@ def test_as_dataframe_w_all_args(self, mock_gcloud_list_groups): self.assertEqual(dataframe.iloc[0, 0], GROUP_IDS[0]) @staticmethod - def _create_context(project_id='test'): + def _create_context(project_id): creds = mock.Mock(spec=google.auth.credentials.Credentials) - return datalab.context.Context(project_id, creds) + return google.datalab.Context(project_id, creds) @staticmethod def _list_groups_get_result(context): - client = gcm._utils.make_client(context=context) groups = [] for group_id, parent_id, display_name, filter_string, is_cluster in \ zip(GROUP_IDS, PARENT_IDS, DISPLAY_NAMES, FILTER_STRINGS, IS_CLUSTERS): - group = client.group(group_id=group_id, display_name=display_name, - parent_id=parent_id, filter_string=filter_string, - is_cluster=is_cluster) + group = google.cloud.monitoring_v3.types.Group( + name=group_id, display_name=display_name, + parent_name=parent_id, filter=filter_string, + is_cluster=is_cluster) groups.append(group) return groups diff --git a/legacy_tests/stackdriver/monitoring/metric_tests.py b/legacy_tests/stackdriver/monitoring/metric_tests.py index f9838007f..d47f2b546 100644 --- a/legacy_tests/stackdriver/monitoring/metric_tests.py +++ b/legacy_tests/stackdriver/monitoring/metric_tests.py @@ -11,15 +11,17 @@ # the License. from __future__ import absolute_import + import mock import unittest -import google.cloud.monitoring +import google.cloud.monitoring_v3 import google.auth -import datalab.context -import datalab.stackdriver.monitoring as gcm +import google.datalab +import google.datalab.stackdriver.monitoring as gcm +DEFAULT_PROJECT = 'test' PROJECT = 'my-project' METRIC_TYPES = ['compute.googleapis.com/instances/cpu/utilization', 'compute.googleapis.com/instances/cpu/usage_time'] @@ -38,19 +40,16 @@ class TestCases(unittest.TestCase): def setUp(self): - self.context = self._create_context() + self.context = self._create_context(DEFAULT_PROJECT) self.descriptors = gcm.MetricDescriptors(context=self.context) - @mock.patch('datalab.context._context.Context.default') + @mock.patch('google.datalab.Context.default') def test_constructor_minimal(self, mock_context_default): mock_context_default.return_value = self.context descriptors = gcm.MetricDescriptors() - expected_client = gcm._utils.make_client(context=self.context) - self.assertEqual(descriptors._client.project, expected_client.project) - self.assertEqual(descriptors._client._connection.credentials, - expected_client._connection.credentials) + self.assertEqual(descriptors._client.project, DEFAULT_PROJECT) self.assertIsNone(descriptors._filter_string) self.assertIsNone(descriptors._type_prefix) @@ -60,19 +59,15 @@ def test_constructor_maximal(self): context = self._create_context(PROJECT) descriptors = gcm.MetricDescriptors( filter_string=FILTER_STRING, type_prefix=TYPE_PREFIX, - project_id=PROJECT, context=context) + context=context) - expected_client = gcm._utils.make_client( - context=context, project_id=PROJECT) - self.assertEqual(descriptors._client.project, expected_client.project) - self.assertEqual(descriptors._client._connection.credentials, - expected_client._connection.credentials) + self.assertEqual(descriptors._client.project, PROJECT) self.assertEqual(descriptors._filter_string, FILTER_STRING) self.assertEqual(descriptors._type_prefix, TYPE_PREFIX) self.assertIsNone(descriptors._descriptors) - @mock.patch('google.cloud.monitoring.Client.list_metric_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_metric_descriptors') def test_list(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -80,12 +75,12 @@ def test_list(self, mock_gcloud_list_descriptors): metric_descriptor_list = self.descriptors.list() mock_gcloud_list_descriptors.assert_called_once_with( - filter_string=None, type_prefix=None) + DEFAULT_PROJECT, filter_='') self.assertEqual(len(metric_descriptor_list), 2) self.assertEqual(metric_descriptor_list[0].type, METRIC_TYPES[0]) self.assertEqual(metric_descriptor_list[1].type, METRIC_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_metric_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_metric_descriptors') def test_list_w_api_filter(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -95,13 +90,16 @@ def test_list_w_api_filter(self, mock_gcloud_list_descriptors): context=self.context) metric_descriptor_list = descriptors.list() + expected_filter = '{} AND metric.type = starts_with("{}")'.format( + FILTER_STRING, TYPE_PREFIX) + mock_gcloud_list_descriptors.assert_called_once_with( - filter_string=FILTER_STRING, type_prefix=TYPE_PREFIX) + DEFAULT_PROJECT, filter_=expected_filter) self.assertEqual(len(metric_descriptor_list), 2) self.assertEqual(metric_descriptor_list[0].type, METRIC_TYPES[0]) self.assertEqual(metric_descriptor_list[1].type, METRIC_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_metric_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_metric_descriptors') def test_list_w_pattern_match(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -109,11 +107,11 @@ def test_list_w_pattern_match(self, mock_gcloud_list_descriptors): metric_descriptor_list = self.descriptors.list(pattern='*usage_time') mock_gcloud_list_descriptors.assert_called_once_with( - filter_string=None, type_prefix=None) + DEFAULT_PROJECT, filter_='') self.assertEqual(len(metric_descriptor_list), 1) self.assertEqual(metric_descriptor_list[0].type, METRIC_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_metric_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_metric_descriptors') def test_list_caching(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -122,10 +120,10 @@ def test_list_caching(self, mock_gcloud_list_descriptors): actual_list2 = self.descriptors.list() mock_gcloud_list_descriptors.assert_called_once_with( - filter_string=None, type_prefix=None) + DEFAULT_PROJECT, filter_='') self.assertEqual(actual_list1, actual_list2) - @mock.patch('datalab.stackdriver.monitoring.MetricDescriptors.list') + @mock.patch('google.datalab.stackdriver.monitoring.MetricDescriptors.list') def test_as_dataframe(self, mock_datalab_list_descriptors): mock_datalab_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -146,7 +144,7 @@ def test_as_dataframe(self, mock_datalab_list_descriptors): for metric_type, display_name in zip(METRIC_TYPES, DISPLAY_NAMES)] self.assertEqual(dataframe.values.tolist(), expected_values) - @mock.patch('datalab.stackdriver.monitoring.MetricDescriptors.list') + @mock.patch('google.datalab.stackdriver.monitoring.MetricDescriptors.list') def test_as_dataframe_w_all_args(self, mock_datalab_list_descriptors): mock_datalab_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -159,18 +157,17 @@ def test_as_dataframe_w_all_args(self, mock_datalab_list_descriptors): self.assertEqual(dataframe.iloc[0, 0], METRIC_TYPES[0]) @staticmethod - def _create_context(project_id='test'): + def _create_context(project_id): creds = mock.Mock(spec=google.auth.credentials.Credentials) - return datalab.context.Context(project_id, creds) + return google.datalab.Context(project_id, creds) @staticmethod def _list_metrics_get_result(context): - client = gcm._utils.make_client(context=context) - all_labels = [google.cloud.monitoring.LabelDescriptor(**labels) + all_labels = [google.cloud.monitoring_v3.types.LabelDescriptor(**labels) for labels in LABELS] descriptors = [ - client.metric_descriptor( - metric_type, metric_kind=METRIC_KIND, value_type=VALUE_TYPE, + google.cloud.monitoring_v3.types.MetricDescriptor( + type=metric_type, metric_kind=METRIC_KIND, value_type=VALUE_TYPE, unit=UNIT, display_name=display_name, labels=all_labels, ) for metric_type, display_name in zip(METRIC_TYPES, DISPLAY_NAMES)] diff --git a/legacy_tests/stackdriver/monitoring/query_metadata_tests.py b/legacy_tests/stackdriver/monitoring/query_metadata_tests.py index 4e61613c5..b1561e1f4 100644 --- a/legacy_tests/stackdriver/monitoring/query_metadata_tests.py +++ b/legacy_tests/stackdriver/monitoring/query_metadata_tests.py @@ -14,13 +14,13 @@ import mock import unittest -from google.cloud.monitoring import Resource -from google.cloud.monitoring import Metric -from google.cloud.monitoring import TimeSeries +from google.cloud.monitoring_v3.types import Metric +from google.cloud.monitoring_v3.types import MonitoredResource +from google.cloud.monitoring_v3.types import TimeSeries import google.auth -import datalab.context -import datalab.stackdriver.monitoring as gcm +import google.datalab +import google.datalab.stackdriver.monitoring as gcm PROJECT = 'my-project' @@ -36,10 +36,10 @@ class TestCases(unittest.TestCase): def setUp(self): creds = mock.Mock(spec=google.auth.credentials.Credentials) - context = datalab.context.Context(PROJECT, creds) + context = google.datalab.Context(PROJECT, creds) self.query = gcm.Query(METRIC_TYPE, context=context) - @mock.patch('datalab.stackdriver.monitoring.Query.iter') + @mock.patch('google.datalab.stackdriver.monitoring.Query.iter') def test_constructor(self, mock_query_iter): time_series_iterable = list(self._query_iter_get_result()) mock_query_iter.return_value = self._query_iter_get_result() @@ -51,7 +51,7 @@ def test_constructor(self, mock_query_iter): self.assertEqual(query_metadata.resource_types, set([RESOURCE_TYPE])) self.assertEqual(query_metadata._timeseries_list, time_series_iterable) - @mock.patch('datalab.stackdriver.monitoring.Query.iter') + @mock.patch('google.datalab.stackdriver.monitoring.Query.iter') def test_iteration(self, mock_query_iter): time_series_iterable = list(self._query_iter_get_result()) mock_query_iter.return_value = self._query_iter_get_result() @@ -62,7 +62,7 @@ def test_iteration(self, mock_query_iter): self.assertEqual(len(response), len(time_series_iterable)) self.assertEqual(response, time_series_iterable) - @mock.patch('datalab.stackdriver.monitoring.Query.iter') + @mock.patch('google.datalab.stackdriver.monitoring.Query.iter') def test_as_dataframe(self, mock_query_iter): mock_query_iter.return_value = self._query_iter_get_result() @@ -92,7 +92,7 @@ def test_as_dataframe(self, mock_query_iter): self.assertEqual(dataframe.index.tolist(), list(range(NUM_INSTANCES))) self.assertEqual(dataframe.index.names, [None]) - @mock.patch('datalab.stackdriver.monitoring.Query.iter') + @mock.patch('google.datalab.stackdriver.monitoring.Query.iter') def test_as_dataframe_w_max_rows(self, mock_query_iter): mock_query_iter.return_value = self._query_iter_get_result() @@ -121,7 +121,7 @@ def test_as_dataframe_w_max_rows(self, mock_query_iter): self.assertEqual(dataframe.index.tolist(), list(range(MAX_ROWS))) self.assertEqual(dataframe.index.names, [None]) - @mock.patch('datalab.stackdriver.monitoring.Query.iter') + @mock.patch('google.datalab.stackdriver.monitoring.Query.iter') def test_as_dataframe_w_no_data(self, mock_query_iter): query_metadata = gcm.QueryMetadata(self.query) dataframe = query_metadata.as_dataframe() @@ -142,7 +142,7 @@ def _query_iter_get_result(): for metric_labels, resource_labels in zip(METRIC_LABELS, RESOURCE_LABELS): yield TimeSeries( metric=Metric(type=METRIC_TYPE, labels=metric_labels), - resource=Resource(type=RESOURCE_TYPE, labels=resource_labels), + resource=MonitoredResource(type=RESOURCE_TYPE, labels=resource_labels), metric_kind='GAUGE', value_type='DOUBLE', points=[], diff --git a/legacy_tests/stackdriver/monitoring/query_tests.py b/legacy_tests/stackdriver/monitoring/query_tests.py index 56b6837fc..acb5bd6af 100644 --- a/legacy_tests/stackdriver/monitoring/query_tests.py +++ b/legacy_tests/stackdriver/monitoring/query_tests.py @@ -15,15 +15,14 @@ import mock import unittest -from google.cloud.monitoring import Query as BaseQuery +from google.cloud.monitoring_v3.query import Query as BaseQuery import google.auth -import datalab.context -import datalab.stackdriver.monitoring as gcm +import google.datalab +import google.datalab.stackdriver.monitoring as gcm PROJECT = 'my-project' - METRIC_TYPE = 'compute.googleapis.com/instance/cpu/utilization' RESOURCE_TYPE = 'gce_instance' INSTANCE_NAMES = ['instance-1', 'instance-2'] @@ -33,26 +32,24 @@ class TestCases(unittest.TestCase): - @mock.patch('datalab.context._context.Context.default') + def setUp(self): + creds = mock.Mock(spec=google.auth.credentials.Credentials) + self.context = google.datalab.Context(PROJECT, creds) + + @mock.patch('google.datalab.Context.default') def test_constructor_minimal(self, mock_context_default): - default_context = self._create_context() - mock_context_default.return_value = default_context + mock_context_default.return_value = self.context query = gcm.Query() - expected_client = gcm._utils.make_client(context=default_context) - self.assertEqual(query._client.project, expected_client.project) - self.assertEqual(query._client._connection.credentials, - expected_client._connection.credentials) - self.assertEqual(query._filter.metric_type, BaseQuery.DEFAULT_METRIC_TYPE) self.assertIsNone(query._start_time) self.assertIsNone(query._end_time) - self.assertIsNone(query._per_series_aligner) - self.assertIsNone(query._alignment_period_seconds) - self.assertIsNone(query._cross_series_reducer) + self.assertEqual(query._per_series_aligner, 0) + self.assertEqual(query._alignment_period_seconds, 0) + self.assertEqual(query._cross_series_reducer, 0) self.assertEqual(query._group_by_fields, ()) def test_constructor_maximal(self): @@ -61,37 +58,25 @@ def test_constructor_maximal(self): DAYS, HOURS, MINUTES = 1, 2, 3 T0 = T1 - datetime.timedelta(days=DAYS, hours=HOURS, minutes=MINUTES) - context = self._create_context(PROJECT) query = gcm.Query(UPTIME_METRIC, end_time=T1, days=DAYS, hours=HOURS, minutes=MINUTES, - project_id=PROJECT, context=context) - - expected_client = gcm._utils.make_client( - context=context, project_id=PROJECT) - self.assertEqual(query._client.project, expected_client.project) - self.assertEqual(query._client._connection.credentials, - expected_client._connection.credentials) + context=self.context) self.assertEqual(query._filter.metric_type, UPTIME_METRIC) self.assertEqual(query._start_time, T0) self.assertEqual(query._end_time, T1) - self.assertIsNone(query._per_series_aligner) - self.assertIsNone(query._alignment_period_seconds) - self.assertIsNone(query._cross_series_reducer) + self.assertEqual(query._per_series_aligner, 0) + self.assertEqual(query._alignment_period_seconds, 0) + self.assertEqual(query._cross_series_reducer, 0) self.assertEqual(query._group_by_fields, ()) - @mock.patch('datalab.stackdriver.monitoring.Query.iter') + @mock.patch('google.datalab.stackdriver.monitoring.Query.iter') def test_metadata(self, mock_query_iter): - query = gcm.Query(METRIC_TYPE, hours=1, context=self._create_context()) + query = gcm.Query(METRIC_TYPE, hours=1, context=self.context) query_metadata = query.metadata() mock_query_iter.assert_called_once_with(headers_only=True) self.assertIsInstance(query_metadata, gcm.QueryMetadata) self.assertEqual(query_metadata.metric_type, METRIC_TYPE) - - @staticmethod - def _create_context(project_id='test'): - creds = mock.Mock(spec=google.auth.credentials.Credentials) - return datalab.context.Context(project_id, creds) diff --git a/legacy_tests/stackdriver/monitoring/resource_tests.py b/legacy_tests/stackdriver/monitoring/resource_tests.py index 383634bc9..473463d52 100644 --- a/legacy_tests/stackdriver/monitoring/resource_tests.py +++ b/legacy_tests/stackdriver/monitoring/resource_tests.py @@ -14,12 +14,13 @@ import mock import unittest -import google.cloud.monitoring +import google.cloud.monitoring_v3 import google.auth -import datalab.context -import datalab.stackdriver.monitoring as gcm +import google.datalab +import google.datalab.stackdriver.monitoring as gcm +DEFAULT_PROJECT = 'test' PROJECT = 'my-project' RESOURCE_TYPES = ['gce_instance', 'aws_ec2_instance'] DISPLAY_NAMES = ['GCE VM Instance', 'Amazon EC2 Instance'] @@ -34,49 +35,39 @@ class TestCases(unittest.TestCase): def setUp(self): - self.context = self._create_context() + self.context = self._create_context(DEFAULT_PROJECT) self.descriptors = gcm.ResourceDescriptors(context=self.context) - @mock.patch('datalab.context._context.Context.default') + @mock.patch('google.datalab.Context.default') def test_constructor_minimal(self, mock_context_default): mock_context_default.return_value = self.context - descriptors = gcm.ResourceDescriptors() - - expected_client = gcm._utils.make_client(context=self.context) - self.assertEqual(descriptors._client.project, expected_client.project) - self.assertEqual(descriptors._client._connection.credentials, - expected_client._connection.credentials) - + self.assertEqual(descriptors._client.project, DEFAULT_PROJECT) self.assertIsNone(descriptors._filter_string) self.assertIsNone(descriptors._descriptors) def test_constructor_maximal(self): context = self._create_context(PROJECT) descriptors = gcm.ResourceDescriptors( - filter_string=FILTER_STRING, project_id=PROJECT, context=context) - - expected_client = gcm._utils.make_client( - context=context, project_id=PROJECT) - self.assertEqual(descriptors._client.project, expected_client.project) - self.assertEqual(descriptors._client._connection.credentials, - expected_client._connection.credentials) + filter_string=FILTER_STRING, context=context) + self.assertEqual(descriptors._client.project, PROJECT) self.assertEqual(descriptors._filter_string, FILTER_STRING) self.assertIsNone(descriptors._descriptors) - @mock.patch('google.cloud.monitoring.Client.list_resource_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_list(self, mock_api_list_descriptors): mock_api_list_descriptors.return_value = self._list_resources_get_result() resource_descriptor_list = self.descriptors.list() - mock_api_list_descriptors.assert_called_once_with(filter_string=None) + mock_api_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) self.assertEqual(len(resource_descriptor_list), 2) self.assertEqual(resource_descriptor_list[0].type, RESOURCE_TYPES[0]) self.assertEqual(resource_descriptor_list[1].type, RESOURCE_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_resource_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_list_w_api_filter(self, mock_api_list_descriptors): mock_api_list_descriptors.return_value = self._list_resources_get_result() @@ -85,22 +76,23 @@ def test_list_w_api_filter(self, mock_api_list_descriptors): resource_descriptor_list = descriptors.list() mock_api_list_descriptors.assert_called_once_with( - filter_string=FILTER_STRING) + DEFAULT_PROJECT, filter_=FILTER_STRING) self.assertEqual(len(resource_descriptor_list), 2) self.assertEqual(resource_descriptor_list[0].type, RESOURCE_TYPES[0]) self.assertEqual(resource_descriptor_list[1].type, RESOURCE_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_resource_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_list_w_pattern_match(self, mock_api_list_descriptors): mock_api_list_descriptors.return_value = self._list_resources_get_result() resource_descriptor_list = self.descriptors.list(pattern='*ec2*') - mock_api_list_descriptors.assert_called_once_with(filter_string=None) + mock_api_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) self.assertEqual(len(resource_descriptor_list), 1) self.assertEqual(resource_descriptor_list[0].type, RESOURCE_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_resource_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_list_caching(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = ( self._list_resources_get_result()) @@ -108,15 +100,17 @@ def test_list_caching(self, mock_gcloud_list_descriptors): actual_list1 = self.descriptors.list() actual_list2 = self.descriptors.list() - mock_gcloud_list_descriptors.assert_called_once_with(filter_string=None) + mock_gcloud_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) self.assertEqual(actual_list1, actual_list2) - @mock.patch('datalab.stackdriver.monitoring.ResourceDescriptors.list') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_as_dataframe(self, mock_datalab_list_descriptors): mock_datalab_list_descriptors.return_value = ( self._list_resources_get_result()) dataframe = self.descriptors.as_dataframe() - mock_datalab_list_descriptors.assert_called_once_with('*') + mock_datalab_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) expected_headers = list(gcm.ResourceDescriptors._DISPLAY_HEADERS) self.assertEqual(dataframe.columns.tolist(), expected_headers) @@ -131,12 +125,13 @@ def test_as_dataframe(self, mock_datalab_list_descriptors): for resource_type, display_name in zip(RESOURCE_TYPES, DISPLAY_NAMES)] self.assertEqual(dataframe.values.tolist(), expected_values) - @mock.patch('datalab.stackdriver.monitoring.ResourceDescriptors.list') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_as_dataframe_w_all_args(self, mock_datalab_list_descriptors): mock_datalab_list_descriptors.return_value = ( self._list_resources_get_result()) dataframe = self.descriptors.as_dataframe(pattern='*instance*', max_rows=1) - mock_datalab_list_descriptors.assert_called_once_with('*instance*') + mock_datalab_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) expected_headers = list(gcm.ResourceDescriptors._DISPLAY_HEADERS) self.assertEqual(dataframe.columns.tolist(), expected_headers) @@ -144,17 +139,17 @@ def test_as_dataframe_w_all_args(self, mock_datalab_list_descriptors): self.assertEqual(dataframe.iloc[0, 0], RESOURCE_TYPES[0]) @staticmethod - def _create_context(project_id='test'): + def _create_context(project_id): creds = mock.Mock(spec=google.auth.credentials.Credentials) - return datalab.context.Context(project_id, creds) + return google.datalab.Context(project_id, creds) @staticmethod def _list_resources_get_result(): - all_labels = [google.cloud.monitoring.LabelDescriptor(**labels) + all_labels = [google.cloud.monitoring_v3.types.LabelDescriptor(**labels) for labels in LABELS] descriptors = [ - google.cloud.monitoring.ResourceDescriptor( - name=None, type_=resource_type, display_name=display_name, + google.cloud.monitoring_v3.types.MonitoredResourceDescriptor( + name=None, type=resource_type, display_name=display_name, description=None, labels=all_labels, ) for resource_type, display_name in zip(RESOURCE_TYPES, DISPLAY_NAMES)] diff --git a/legacy_tests/stackdriver/monitoring/utils_tests.py b/legacy_tests/stackdriver/monitoring/utils_tests.py index edc8c4319..2146c5b14 100644 --- a/legacy_tests/stackdriver/monitoring/utils_tests.py +++ b/legacy_tests/stackdriver/monitoring/utils_tests.py @@ -15,33 +15,27 @@ import unittest import google.auth -import datalab.context -import datalab.stackdriver.monitoring as gcm +import google.datalab +import google.datalab.stackdriver.monitoring as gcm class TestCases(unittest.TestCase): def test_make_client(self): - project_id = 'project_id' context = self._create_context() - client = gcm._utils.make_client(project_id, context) + client = gcm._utils.make_client(context) - self.assertEqual(client.project, project_id) - self.assertEqual(client._connection.credentials, context.credentials) - self.assertEqual(client._connection.USER_AGENT, 'pydatalab/v0') + self.assertEqual(client.project, context.project_id) - @mock.patch('datalab.context._context.Context.default') + @mock.patch('google.datalab.Context.default') def test_make_client_w_defaults(self, mock_context_default): default_context = self._create_context() mock_context_default.return_value = default_context client = gcm._utils.make_client() self.assertEqual(client.project, default_context.project_id) - self.assertEqual( - client._connection.credentials, default_context.credentials) - self.assertEqual(client._connection.USER_AGENT, 'pydatalab/v0') @staticmethod - def _create_context(project_id='test'): + def _create_context(): creds = mock.Mock(spec=google.auth.credentials.Credentials) - return datalab.context.Context(project_id, creds) + return google.datalab.Context('test_project', creds) diff --git a/setup.py b/setup.py index d4721a43e..ee3bb8904 100644 --- a/setup.py +++ b/setup.py @@ -93,7 +93,8 @@ 'configparser>=3.5.0', 'mock>=2.0.0', 'future>=0.16.0', - 'google-cloud-monitoring==0.28.0', + 'google-cloud-monitoring==0.31.1', + 'google-api-core>=1.10.0', 'google-api-python-client>=1.6.2', 'seaborn>=0.7.0', 'plotly>=1.12.5', @@ -101,7 +102,7 @@ 'oauth2client>=2.2.0', 'pandas>=0.22.0', 'google_auth_httplib2>=0.0.2', - 'pandas-profiling>=1.0.0a2', + 'pandas-profiling==1.4.0', 'python-dateutil>=2.5.0', 'pytz>=2015.4', 'pyyaml>=3.11', @@ -111,9 +112,7 @@ 'ipykernel>=4.5.2', 'psutil>=4.3.0', 'jsonschema>=2.6.0', - # six needs to be pinned to 1.10.0 to work-around an apache_beam bug: - # https://stackoverflow.com/questions/46300173/import-apache-beam-metaclass-conflict - 'six==1.10.0', + 'six>=1.10.0', 'urllib3>=1.22', ], extras_require={ diff --git a/tests/stackdriver/monitoring/group_tests.py b/tests/stackdriver/monitoring/group_tests.py index 495581bde..a9d74798a 100644 --- a/tests/stackdriver/monitoring/group_tests.py +++ b/tests/stackdriver/monitoring/group_tests.py @@ -11,9 +11,12 @@ # the License. from __future__ import absolute_import + import mock import unittest +import google.cloud.monitoring_v3 + import google.auth import google.datalab import google.datalab.stackdriver.monitoring as gcm @@ -21,7 +24,7 @@ DEFAULT_PROJECT = 'test' PROJECT = 'my-project' GROUP_IDS = ['GROUP-205', 'GROUP-101'] -PARENT_IDS = [None, GROUP_IDS[0]] +PARENT_IDS = ['', GROUP_IDS[0]] DISPLAY_NAMES = ['All Instances', 'GCE Instances'] PARENT_DISPLAY_NAMES = ['', DISPLAY_NAMES[0]] FILTER_STRINGS = ['resource.type = ends_with("instance")', @@ -45,8 +48,6 @@ def test_constructor_minimal(self, mock_context_default): self.assertIsNone(groups._group_dict) self.assertEqual(groups._client.project, DEFAULT_PROJECT) - self.assertEqual(groups._client._connection.credentials, - self.context.credentials) def test_constructor_maximal(self): context = self._create_context(PROJECT) @@ -54,33 +55,31 @@ def test_constructor_maximal(self): self.assertIs(groups._context, context) self.assertIsNone(groups._group_dict) self.assertEqual(groups._client.project, PROJECT) - self.assertEqual(groups._client._connection.credentials, - context.credentials) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_list(self, mock_api_list_groups): mock_api_list_groups.return_value = self._list_groups_get_result( context=self.context) group_list = self.groups.list() - mock_api_list_groups.assert_called_once_with() + mock_api_list_groups.assert_called_once_with(DEFAULT_PROJECT) self.assertEqual(len(group_list), 2) - self.assertEqual(group_list[0].id, GROUP_IDS[0]) - self.assertEqual(group_list[1].id, GROUP_IDS[1]) + self.assertEqual(group_list[0].name, GROUP_IDS[0]) + self.assertEqual(group_list[1].name, GROUP_IDS[1]) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_list_w_pattern_match(self, mock_api_list_groups): mock_api_list_groups.return_value = self._list_groups_get_result( context=self.context) group_list = self.groups.list(pattern='GCE*') - mock_api_list_groups.assert_called_once_with() + mock_api_list_groups.assert_called_once_with(DEFAULT_PROJECT) self.assertEqual(len(group_list), 1) - self.assertEqual(group_list[0].id, GROUP_IDS[1]) + self.assertEqual(group_list[0].name, GROUP_IDS[1]) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_list_caching(self, mock_gcloud_list_groups): mock_gcloud_list_groups.return_value = self._list_groups_get_result( context=self.context) @@ -88,15 +87,15 @@ def test_list_caching(self, mock_gcloud_list_groups): actual_list1 = self.groups.list() actual_list2 = self.groups.list() - mock_gcloud_list_groups.assert_called_once_with() + mock_gcloud_list_groups.assert_called_once_with(DEFAULT_PROJECT) self.assertEqual(actual_list1, actual_list2) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_as_dataframe(self, mock_gcloud_list_groups): mock_gcloud_list_groups.return_value = self._list_groups_get_result( context=self.context) dataframe = self.groups.as_dataframe() - mock_gcloud_list_groups.assert_called_once_with() + mock_gcloud_list_groups.assert_called_once_with(DEFAULT_PROJECT) expected_headers = list(gcm.Groups._DISPLAY_HEADERS) self.assertEqual(dataframe.columns.tolist(), expected_headers) @@ -110,12 +109,12 @@ def test_as_dataframe(self, mock_gcloud_list_groups): PARENT_DISPLAY_NAMES, IS_CLUSTERS, FILTER_STRINGS)] self.assertEqual(dataframe.values.tolist(), expected_values) - @mock.patch('google.cloud.monitoring.Client.list_groups') + @mock.patch('google.cloud.monitoring_v3.GroupServiceClient.list_groups') def test_as_dataframe_w_all_args(self, mock_gcloud_list_groups): mock_gcloud_list_groups.return_value = self._list_groups_get_result( context=self.context) dataframe = self.groups.as_dataframe(pattern='*Instance*', max_rows=1) - mock_gcloud_list_groups.assert_called_once_with() + mock_gcloud_list_groups.assert_called_once_with(DEFAULT_PROJECT) expected_headers = list(gcm.Groups._DISPLAY_HEADERS) self.assertEqual(dataframe.columns.tolist(), expected_headers) @@ -129,13 +128,13 @@ def _create_context(project_id): @staticmethod def _list_groups_get_result(context): - client = gcm._utils.make_client(context=context) groups = [] for group_id, parent_id, display_name, filter_string, is_cluster in \ zip(GROUP_IDS, PARENT_IDS, DISPLAY_NAMES, FILTER_STRINGS, IS_CLUSTERS): - group = client.group(group_id=group_id, display_name=display_name, - parent_id=parent_id, filter_string=filter_string, - is_cluster=is_cluster) + group = google.cloud.monitoring_v3.types.Group( + name=group_id, display_name=display_name, + parent_name=parent_id, filter=filter_string, + is_cluster=is_cluster) groups.append(group) return groups diff --git a/tests/stackdriver/monitoring/metric_tests.py b/tests/stackdriver/monitoring/metric_tests.py index a2362772e..d47f2b546 100644 --- a/tests/stackdriver/monitoring/metric_tests.py +++ b/tests/stackdriver/monitoring/metric_tests.py @@ -11,10 +11,11 @@ # the License. from __future__ import absolute_import + import mock import unittest -import google.cloud.monitoring +import google.cloud.monitoring_v3 import google.auth import google.datalab @@ -49,8 +50,6 @@ def test_constructor_minimal(self, mock_context_default): descriptors = gcm.MetricDescriptors() self.assertEqual(descriptors._client.project, DEFAULT_PROJECT) - self.assertEqual(descriptors._client._connection.credentials, - self.context.credentials) self.assertIsNone(descriptors._filter_string) self.assertIsNone(descriptors._type_prefix) @@ -63,14 +62,12 @@ def test_constructor_maximal(self): context=context) self.assertEqual(descriptors._client.project, PROJECT) - self.assertEqual(descriptors._client._connection.credentials, - context.credentials) self.assertEqual(descriptors._filter_string, FILTER_STRING) self.assertEqual(descriptors._type_prefix, TYPE_PREFIX) self.assertIsNone(descriptors._descriptors) - @mock.patch('google.cloud.monitoring.Client.list_metric_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_metric_descriptors') def test_list(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -78,12 +75,12 @@ def test_list(self, mock_gcloud_list_descriptors): metric_descriptor_list = self.descriptors.list() mock_gcloud_list_descriptors.assert_called_once_with( - filter_string=None, type_prefix=None) + DEFAULT_PROJECT, filter_='') self.assertEqual(len(metric_descriptor_list), 2) self.assertEqual(metric_descriptor_list[0].type, METRIC_TYPES[0]) self.assertEqual(metric_descriptor_list[1].type, METRIC_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_metric_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_metric_descriptors') def test_list_w_api_filter(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -93,13 +90,16 @@ def test_list_w_api_filter(self, mock_gcloud_list_descriptors): context=self.context) metric_descriptor_list = descriptors.list() + expected_filter = '{} AND metric.type = starts_with("{}")'.format( + FILTER_STRING, TYPE_PREFIX) + mock_gcloud_list_descriptors.assert_called_once_with( - filter_string=FILTER_STRING, type_prefix=TYPE_PREFIX) + DEFAULT_PROJECT, filter_=expected_filter) self.assertEqual(len(metric_descriptor_list), 2) self.assertEqual(metric_descriptor_list[0].type, METRIC_TYPES[0]) self.assertEqual(metric_descriptor_list[1].type, METRIC_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_metric_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_metric_descriptors') def test_list_w_pattern_match(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -107,11 +107,11 @@ def test_list_w_pattern_match(self, mock_gcloud_list_descriptors): metric_descriptor_list = self.descriptors.list(pattern='*usage_time') mock_gcloud_list_descriptors.assert_called_once_with( - filter_string=None, type_prefix=None) + DEFAULT_PROJECT, filter_='') self.assertEqual(len(metric_descriptor_list), 1) self.assertEqual(metric_descriptor_list[0].type, METRIC_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_metric_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_metric_descriptors') def test_list_caching(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = self._list_metrics_get_result( context=self.context) @@ -120,7 +120,7 @@ def test_list_caching(self, mock_gcloud_list_descriptors): actual_list2 = self.descriptors.list() mock_gcloud_list_descriptors.assert_called_once_with( - filter_string=None, type_prefix=None) + DEFAULT_PROJECT, filter_='') self.assertEqual(actual_list1, actual_list2) @mock.patch('google.datalab.stackdriver.monitoring.MetricDescriptors.list') @@ -163,12 +163,11 @@ def _create_context(project_id): @staticmethod def _list_metrics_get_result(context): - client = gcm._utils.make_client(context=context) - all_labels = [google.cloud.monitoring.LabelDescriptor(**labels) + all_labels = [google.cloud.monitoring_v3.types.LabelDescriptor(**labels) for labels in LABELS] descriptors = [ - client.metric_descriptor( - metric_type, metric_kind=METRIC_KIND, value_type=VALUE_TYPE, + google.cloud.monitoring_v3.types.MetricDescriptor( + type=metric_type, metric_kind=METRIC_KIND, value_type=VALUE_TYPE, unit=UNIT, display_name=display_name, labels=all_labels, ) for metric_type, display_name in zip(METRIC_TYPES, DISPLAY_NAMES)] diff --git a/tests/stackdriver/monitoring/query_metadata_tests.py b/tests/stackdriver/monitoring/query_metadata_tests.py index d5cce0660..b1561e1f4 100644 --- a/tests/stackdriver/monitoring/query_metadata_tests.py +++ b/tests/stackdriver/monitoring/query_metadata_tests.py @@ -14,9 +14,9 @@ import mock import unittest -from google.cloud.monitoring import Resource -from google.cloud.monitoring import Metric -from google.cloud.monitoring import TimeSeries +from google.cloud.monitoring_v3.types import Metric +from google.cloud.monitoring_v3.types import MonitoredResource +from google.cloud.monitoring_v3.types import TimeSeries import google.auth import google.datalab @@ -142,7 +142,7 @@ def _query_iter_get_result(): for metric_labels, resource_labels in zip(METRIC_LABELS, RESOURCE_LABELS): yield TimeSeries( metric=Metric(type=METRIC_TYPE, labels=metric_labels), - resource=Resource(type=RESOURCE_TYPE, labels=resource_labels), + resource=MonitoredResource(type=RESOURCE_TYPE, labels=resource_labels), metric_kind='GAUGE', value_type='DOUBLE', points=[], diff --git a/tests/stackdriver/monitoring/query_tests.py b/tests/stackdriver/monitoring/query_tests.py index 7623c40ef..acb5bd6af 100644 --- a/tests/stackdriver/monitoring/query_tests.py +++ b/tests/stackdriver/monitoring/query_tests.py @@ -15,7 +15,7 @@ import mock import unittest -from google.cloud.monitoring import Query as BaseQuery +from google.cloud.monitoring_v3.query import Query as BaseQuery import google.auth import google.datalab @@ -42,19 +42,14 @@ def test_constructor_minimal(self, mock_context_default): query = gcm.Query() - expected_client = gcm._utils.make_client(context=self.context) - self.assertEqual(query._client.project, expected_client.project) - self.assertEqual(query._client._connection.credentials, - expected_client._connection.credentials) - self.assertEqual(query._filter.metric_type, BaseQuery.DEFAULT_METRIC_TYPE) self.assertIsNone(query._start_time) self.assertIsNone(query._end_time) - self.assertIsNone(query._per_series_aligner) - self.assertIsNone(query._alignment_period_seconds) - self.assertIsNone(query._cross_series_reducer) + self.assertEqual(query._per_series_aligner, 0) + self.assertEqual(query._alignment_period_seconds, 0) + self.assertEqual(query._cross_series_reducer, 0) self.assertEqual(query._group_by_fields, ()) def test_constructor_maximal(self): @@ -67,19 +62,14 @@ def test_constructor_maximal(self): end_time=T1, days=DAYS, hours=HOURS, minutes=MINUTES, context=self.context) - expected_client = gcm._utils.make_client(context=self.context) - self.assertEqual(query._client.project, expected_client.project) - self.assertEqual(query._client._connection.credentials, - expected_client._connection.credentials) - self.assertEqual(query._filter.metric_type, UPTIME_METRIC) self.assertEqual(query._start_time, T0) self.assertEqual(query._end_time, T1) - self.assertIsNone(query._per_series_aligner) - self.assertIsNone(query._alignment_period_seconds) - self.assertIsNone(query._cross_series_reducer) + self.assertEqual(query._per_series_aligner, 0) + self.assertEqual(query._alignment_period_seconds, 0) + self.assertEqual(query._cross_series_reducer, 0) self.assertEqual(query._group_by_fields, ()) @mock.patch('google.datalab.stackdriver.monitoring.Query.iter') diff --git a/tests/stackdriver/monitoring/resource_tests.py b/tests/stackdriver/monitoring/resource_tests.py index b394d7abe..473463d52 100644 --- a/tests/stackdriver/monitoring/resource_tests.py +++ b/tests/stackdriver/monitoring/resource_tests.py @@ -14,7 +14,7 @@ import mock import unittest -import google.cloud.monitoring +import google.cloud.monitoring_v3 import google.auth import google.datalab @@ -43,8 +43,6 @@ def test_constructor_minimal(self, mock_context_default): mock_context_default.return_value = self.context descriptors = gcm.ResourceDescriptors() self.assertEqual(descriptors._client.project, DEFAULT_PROJECT) - self.assertEqual(descriptors._client._connection.credentials, - self.context.credentials) self.assertIsNone(descriptors._filter_string) self.assertIsNone(descriptors._descriptors) @@ -53,24 +51,23 @@ def test_constructor_maximal(self): descriptors = gcm.ResourceDescriptors( filter_string=FILTER_STRING, context=context) self.assertEqual(descriptors._client.project, PROJECT) - self.assertEqual(descriptors._client._connection.credentials, - context.credentials) self.assertEqual(descriptors._filter_string, FILTER_STRING) self.assertIsNone(descriptors._descriptors) - @mock.patch('google.cloud.monitoring.Client.list_resource_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_list(self, mock_api_list_descriptors): mock_api_list_descriptors.return_value = self._list_resources_get_result() resource_descriptor_list = self.descriptors.list() - mock_api_list_descriptors.assert_called_once_with(filter_string=None) + mock_api_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) self.assertEqual(len(resource_descriptor_list), 2) self.assertEqual(resource_descriptor_list[0].type, RESOURCE_TYPES[0]) self.assertEqual(resource_descriptor_list[1].type, RESOURCE_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_resource_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_list_w_api_filter(self, mock_api_list_descriptors): mock_api_list_descriptors.return_value = self._list_resources_get_result() @@ -79,22 +76,23 @@ def test_list_w_api_filter(self, mock_api_list_descriptors): resource_descriptor_list = descriptors.list() mock_api_list_descriptors.assert_called_once_with( - filter_string=FILTER_STRING) + DEFAULT_PROJECT, filter_=FILTER_STRING) self.assertEqual(len(resource_descriptor_list), 2) self.assertEqual(resource_descriptor_list[0].type, RESOURCE_TYPES[0]) self.assertEqual(resource_descriptor_list[1].type, RESOURCE_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_resource_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_list_w_pattern_match(self, mock_api_list_descriptors): mock_api_list_descriptors.return_value = self._list_resources_get_result() resource_descriptor_list = self.descriptors.list(pattern='*ec2*') - mock_api_list_descriptors.assert_called_once_with(filter_string=None) + mock_api_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) self.assertEqual(len(resource_descriptor_list), 1) self.assertEqual(resource_descriptor_list[0].type, RESOURCE_TYPES[1]) - @mock.patch('google.cloud.monitoring.Client.list_resource_descriptors') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_list_caching(self, mock_gcloud_list_descriptors): mock_gcloud_list_descriptors.return_value = ( self._list_resources_get_result()) @@ -102,15 +100,17 @@ def test_list_caching(self, mock_gcloud_list_descriptors): actual_list1 = self.descriptors.list() actual_list2 = self.descriptors.list() - mock_gcloud_list_descriptors.assert_called_once_with(filter_string=None) + mock_gcloud_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) self.assertEqual(actual_list1, actual_list2) - @mock.patch('google.datalab.stackdriver.monitoring.ResourceDescriptors.list') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_as_dataframe(self, mock_datalab_list_descriptors): mock_datalab_list_descriptors.return_value = ( self._list_resources_get_result()) dataframe = self.descriptors.as_dataframe() - mock_datalab_list_descriptors.assert_called_once_with('*') + mock_datalab_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) expected_headers = list(gcm.ResourceDescriptors._DISPLAY_HEADERS) self.assertEqual(dataframe.columns.tolist(), expected_headers) @@ -125,12 +125,13 @@ def test_as_dataframe(self, mock_datalab_list_descriptors): for resource_type, display_name in zip(RESOURCE_TYPES, DISPLAY_NAMES)] self.assertEqual(dataframe.values.tolist(), expected_values) - @mock.patch('google.datalab.stackdriver.monitoring.ResourceDescriptors.list') + @mock.patch('google.cloud.monitoring_v3.MetricServiceClient.list_monitored_resource_descriptors') def test_as_dataframe_w_all_args(self, mock_datalab_list_descriptors): mock_datalab_list_descriptors.return_value = ( self._list_resources_get_result()) dataframe = self.descriptors.as_dataframe(pattern='*instance*', max_rows=1) - mock_datalab_list_descriptors.assert_called_once_with('*instance*') + mock_datalab_list_descriptors.assert_called_once_with( + DEFAULT_PROJECT, filter_=None) expected_headers = list(gcm.ResourceDescriptors._DISPLAY_HEADERS) self.assertEqual(dataframe.columns.tolist(), expected_headers) @@ -144,11 +145,11 @@ def _create_context(project_id): @staticmethod def _list_resources_get_result(): - all_labels = [google.cloud.monitoring.LabelDescriptor(**labels) + all_labels = [google.cloud.monitoring_v3.types.LabelDescriptor(**labels) for labels in LABELS] descriptors = [ - google.cloud.monitoring.ResourceDescriptor( - name=None, type_=resource_type, display_name=display_name, + google.cloud.monitoring_v3.types.MonitoredResourceDescriptor( + name=None, type=resource_type, display_name=display_name, description=None, labels=all_labels, ) for resource_type, display_name in zip(RESOURCE_TYPES, DISPLAY_NAMES)] diff --git a/tests/stackdriver/monitoring/utils_tests.py b/tests/stackdriver/monitoring/utils_tests.py index 64bcc9faa..2146c5b14 100644 --- a/tests/stackdriver/monitoring/utils_tests.py +++ b/tests/stackdriver/monitoring/utils_tests.py @@ -26,8 +26,6 @@ def test_make_client(self): client = gcm._utils.make_client(context) self.assertEqual(client.project, context.project_id) - self.assertEqual(client._connection.credentials, context.credentials) - self.assertEqual(client._connection.USER_AGENT, 'pydatalab/v0') @mock.patch('google.datalab.Context.default') def test_make_client_w_defaults(self, mock_context_default): @@ -36,9 +34,6 @@ def test_make_client_w_defaults(self, mock_context_default): client = gcm._utils.make_client() self.assertEqual(client.project, default_context.project_id) - self.assertEqual( - client._connection.credentials, default_context.credentials) - self.assertEqual(client._connection.USER_AGENT, 'pydatalab/v0') @staticmethod def _create_context(): diff --git a/tox.ini b/tox.ini index f80acf1e1..99379028e 100644 --- a/tox.ini +++ b/tox.ini @@ -10,10 +10,7 @@ skip_missing_interpreters = true # need them to run our tests suite. # # tox always installs the current package, so there's no need to list it here. -# -# For pandas-profiling, we have to install 1.4.0 as 1.4.1 triggers division-by-zero errors. -deps = pandas-profiling==1.4.0 - apache-airflow==1.9.0 +deps = apache-airflow==1.9.0 dill==0.2.6 tensorflow==1.8.0 lime==0.1.1.23