496 lines
17 KiB
Python
496 lines
17 KiB
Python
|
# Copyright 2016 Google Inc. All rights reserved.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
|
||
|
import unittest2
|
||
|
|
||
|
|
||
|
class TestClient(unittest2.TestCase):
|
||
|
|
||
|
PROJECT = 'PROJECT'
|
||
|
LOGGER_NAME = 'LOGGER_NAME'
|
||
|
SINK_NAME = 'SINK_NAME'
|
||
|
FILTER = 'logName:syslog AND severity>=ERROR'
|
||
|
DESTINATION_URI = 'faux.googleapis.com/destination'
|
||
|
METRIC_NAME = 'metric_name'
|
||
|
FILTER = 'logName:syslog AND severity>=ERROR'
|
||
|
DESCRIPTION = 'DESCRIPTION'
|
||
|
|
||
|
def _getTargetClass(self):
|
||
|
from gcloud.logging.client import Client
|
||
|
return Client
|
||
|
|
||
|
def _makeOne(self, *args, **kw):
|
||
|
return self._getTargetClass()(*args, **kw)
|
||
|
|
||
|
def test_ctor(self):
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
self.assertEqual(client.project, self.PROJECT)
|
||
|
|
||
|
def test_logging_api_wo_gax(self):
|
||
|
from gcloud.logging.connection import _LoggingAPI
|
||
|
from gcloud.logging import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
client = self._makeOne(self.PROJECT, credentials=_Credentials())
|
||
|
conn = client.connection = object()
|
||
|
|
||
|
with _Monkey(MUT, _USE_GAX=False):
|
||
|
api = client.logging_api
|
||
|
|
||
|
self.assertTrue(isinstance(api, _LoggingAPI))
|
||
|
self.assertTrue(api._connection is conn)
|
||
|
# API instance is cached
|
||
|
again = client.logging_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_logging_api_w_gax(self):
|
||
|
from gcloud.logging import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
|
||
|
wrapped = object()
|
||
|
_called_with = []
|
||
|
|
||
|
def _generated_api(*args, **kw):
|
||
|
_called_with.append((args, kw))
|
||
|
return wrapped
|
||
|
|
||
|
class _GaxLoggingAPI(object):
|
||
|
|
||
|
def __init__(self, _wrapped):
|
||
|
self._wrapped = _wrapped
|
||
|
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
|
||
|
with _Monkey(MUT,
|
||
|
_USE_GAX=True,
|
||
|
GeneratedLoggingAPI=_generated_api,
|
||
|
GAXLoggingAPI=_GaxLoggingAPI):
|
||
|
api = client.logging_api
|
||
|
|
||
|
self.assertIsInstance(api, _GaxLoggingAPI)
|
||
|
self.assertTrue(api._wrapped is wrapped)
|
||
|
# API instance is cached
|
||
|
again = client.logging_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_sinks_api_wo_gax(self):
|
||
|
from gcloud.logging.connection import _SinksAPI
|
||
|
from gcloud.logging import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
client = self._makeOne(self.PROJECT, credentials=_Credentials())
|
||
|
conn = client.connection = object()
|
||
|
|
||
|
with _Monkey(MUT, _USE_GAX=False):
|
||
|
api = client.sinks_api
|
||
|
|
||
|
self.assertTrue(isinstance(api, _SinksAPI))
|
||
|
self.assertTrue(api._connection is conn)
|
||
|
# API instance is cached
|
||
|
again = client.sinks_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_sinks_api_w_gax(self):
|
||
|
from gcloud.logging import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
|
||
|
wrapped = object()
|
||
|
_called_with = []
|
||
|
|
||
|
def _generated_api(*args, **kw):
|
||
|
_called_with.append((args, kw))
|
||
|
return wrapped
|
||
|
|
||
|
class _GaxSinksAPI(object):
|
||
|
|
||
|
def __init__(self, _wrapped):
|
||
|
self._wrapped = _wrapped
|
||
|
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
|
||
|
with _Monkey(MUT,
|
||
|
_USE_GAX=True,
|
||
|
GeneratedSinksAPI=_generated_api,
|
||
|
GAXSinksAPI=_GaxSinksAPI):
|
||
|
api = client.sinks_api
|
||
|
|
||
|
self.assertIsInstance(api, _GaxSinksAPI)
|
||
|
self.assertTrue(api._wrapped is wrapped)
|
||
|
# API instance is cached
|
||
|
again = client.sinks_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_metrics_api_wo_gax(self):
|
||
|
from gcloud.logging.connection import _MetricsAPI
|
||
|
from gcloud.logging import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
client = self._makeOne(self.PROJECT, credentials=_Credentials())
|
||
|
conn = client.connection = object()
|
||
|
|
||
|
with _Monkey(MUT, _USE_GAX=False):
|
||
|
api = client.metrics_api
|
||
|
|
||
|
self.assertTrue(isinstance(api, _MetricsAPI))
|
||
|
self.assertTrue(api._connection is conn)
|
||
|
# API instance is cached
|
||
|
again = client.metrics_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_metrics_api_w_gax(self):
|
||
|
from gcloud.logging import client as MUT
|
||
|
from gcloud._testing import _Monkey
|
||
|
|
||
|
wrapped = object()
|
||
|
_called_with = []
|
||
|
|
||
|
def _generated_api(*args, **kw):
|
||
|
_called_with.append((args, kw))
|
||
|
return wrapped
|
||
|
|
||
|
class _GaxMetricsAPI(object):
|
||
|
|
||
|
def __init__(self, _wrapped):
|
||
|
self._wrapped = _wrapped
|
||
|
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
|
||
|
with _Monkey(MUT,
|
||
|
_USE_GAX=True,
|
||
|
GeneratedMetricsAPI=_generated_api,
|
||
|
GAXMetricsAPI=_GaxMetricsAPI):
|
||
|
api = client.metrics_api
|
||
|
|
||
|
self.assertIsInstance(api, _GaxMetricsAPI)
|
||
|
self.assertTrue(api._wrapped is wrapped)
|
||
|
# API instance is cached
|
||
|
again = client.metrics_api
|
||
|
self.assertTrue(again is api)
|
||
|
|
||
|
def test_logger(self):
|
||
|
from gcloud.logging.logger import Logger
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
logger = client.logger(self.LOGGER_NAME)
|
||
|
self.assertTrue(isinstance(logger, Logger))
|
||
|
self.assertEqual(logger.name, self.LOGGER_NAME)
|
||
|
self.assertTrue(logger.client is client)
|
||
|
self.assertEqual(logger.project, self.PROJECT)
|
||
|
|
||
|
def test__entry_from_resource_unknown_type(self):
|
||
|
PROJECT = 'PROJECT'
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(PROJECT, creds)
|
||
|
loggers = {}
|
||
|
with self.assertRaises(ValueError):
|
||
|
client._entry_from_resource({'unknownPayload': {}}, loggers)
|
||
|
|
||
|
def test_list_entries_defaults(self):
|
||
|
from gcloud.logging.entries import TextEntry
|
||
|
IID = 'IID'
|
||
|
TEXT = 'TEXT'
|
||
|
TOKEN = 'TOKEN'
|
||
|
ENTRIES = [{
|
||
|
'textPayload': TEXT,
|
||
|
'insertId': IID,
|
||
|
'resource': {
|
||
|
'type': 'global',
|
||
|
},
|
||
|
'logName': 'projects/%s/logs/%s' % (
|
||
|
self.PROJECT, self.LOGGER_NAME),
|
||
|
}]
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
api = client._logging_api = _DummyLoggingAPI()
|
||
|
api._list_entries_response = ENTRIES, TOKEN
|
||
|
|
||
|
entries, token = client.list_entries()
|
||
|
|
||
|
self.assertEqual(len(entries), 1)
|
||
|
entry = entries[0]
|
||
|
self.assertTrue(isinstance(entry, TextEntry))
|
||
|
self.assertEqual(entry.insert_id, IID)
|
||
|
self.assertEqual(entry.payload, TEXT)
|
||
|
logger = entry.logger
|
||
|
self.assertEqual(logger.name, self.LOGGER_NAME)
|
||
|
self.assertTrue(logger.client is client)
|
||
|
self.assertEqual(logger.project, self.PROJECT)
|
||
|
self.assertEqual(token, TOKEN)
|
||
|
|
||
|
self.assertEqual(
|
||
|
api._list_entries_called_with,
|
||
|
([self.PROJECT], None, None, None, None))
|
||
|
|
||
|
def test_list_entries_explicit(self):
|
||
|
from gcloud.logging import DESCENDING
|
||
|
from gcloud.logging.entries import ProtobufEntry
|
||
|
from gcloud.logging.entries import StructEntry
|
||
|
from gcloud.logging.logger import Logger
|
||
|
PROJECT1 = 'PROJECT1'
|
||
|
PROJECT2 = 'PROJECT2'
|
||
|
FILTER = 'logName:LOGNAME'
|
||
|
IID1 = 'IID1'
|
||
|
IID2 = 'IID2'
|
||
|
PAYLOAD = {'message': 'MESSAGE', 'weather': 'partly cloudy'}
|
||
|
PROTO_PAYLOAD = PAYLOAD.copy()
|
||
|
PROTO_PAYLOAD['@type'] = 'type.googleapis.com/testing.example'
|
||
|
TOKEN = 'TOKEN'
|
||
|
PAGE_SIZE = 42
|
||
|
ENTRIES = [{
|
||
|
'jsonPayload': PAYLOAD,
|
||
|
'insertId': IID1,
|
||
|
'resource': {
|
||
|
'type': 'global',
|
||
|
},
|
||
|
'logName': 'projects/%s/logs/%s' % (
|
||
|
self.PROJECT, self.LOGGER_NAME),
|
||
|
}, {
|
||
|
'protoPayload': PROTO_PAYLOAD,
|
||
|
'insertId': IID2,
|
||
|
'resource': {
|
||
|
'type': 'global',
|
||
|
},
|
||
|
'logName': 'projects/%s/logs/%s' % (
|
||
|
self.PROJECT, self.LOGGER_NAME),
|
||
|
}]
|
||
|
client = self._makeOne(self.PROJECT, credentials=_Credentials())
|
||
|
api = client._logging_api = _DummyLoggingAPI()
|
||
|
api._list_entries_response = ENTRIES, None
|
||
|
|
||
|
entries, token = client.list_entries(
|
||
|
projects=[PROJECT1, PROJECT2], filter_=FILTER, order_by=DESCENDING,
|
||
|
page_size=PAGE_SIZE, page_token=TOKEN)
|
||
|
self.assertEqual(len(entries), 2)
|
||
|
|
||
|
entry = entries[0]
|
||
|
self.assertTrue(isinstance(entry, StructEntry))
|
||
|
self.assertEqual(entry.insert_id, IID1)
|
||
|
self.assertEqual(entry.payload, PAYLOAD)
|
||
|
logger = entry.logger
|
||
|
self.assertTrue(isinstance(logger, Logger))
|
||
|
self.assertEqual(logger.name, self.LOGGER_NAME)
|
||
|
self.assertTrue(logger.client is client)
|
||
|
self.assertEqual(logger.project, self.PROJECT)
|
||
|
|
||
|
entry = entries[1]
|
||
|
self.assertTrue(isinstance(entry, ProtobufEntry))
|
||
|
self.assertEqual(entry.insert_id, IID2)
|
||
|
self.assertEqual(entry.payload, PROTO_PAYLOAD)
|
||
|
logger = entry.logger
|
||
|
self.assertEqual(logger.name, self.LOGGER_NAME)
|
||
|
self.assertTrue(logger.client is client)
|
||
|
self.assertEqual(logger.project, self.PROJECT)
|
||
|
|
||
|
self.assertTrue(entries[0].logger is entries[1].logger)
|
||
|
|
||
|
self.assertEqual(token, None)
|
||
|
self.assertEqual(
|
||
|
api._list_entries_called_with,
|
||
|
([PROJECT1, PROJECT2], FILTER, DESCENDING, PAGE_SIZE, TOKEN))
|
||
|
|
||
|
def test_sink_defaults(self):
|
||
|
from gcloud.logging.sink import Sink
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
sink = client.sink(self.SINK_NAME)
|
||
|
self.assertTrue(isinstance(sink, Sink))
|
||
|
self.assertEqual(sink.name, self.SINK_NAME)
|
||
|
self.assertEqual(sink.filter_, None)
|
||
|
self.assertEqual(sink.destination, None)
|
||
|
self.assertTrue(sink.client is client)
|
||
|
self.assertEqual(sink.project, self.PROJECT)
|
||
|
|
||
|
def test_sink_explicit(self):
|
||
|
from gcloud.logging.sink import Sink
|
||
|
creds = _Credentials()
|
||
|
client = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
sink = client.sink(self.SINK_NAME, self.FILTER, self.DESTINATION_URI)
|
||
|
self.assertTrue(isinstance(sink, Sink))
|
||
|
self.assertEqual(sink.name, self.SINK_NAME)
|
||
|
self.assertEqual(sink.filter_, self.FILTER)
|
||
|
self.assertEqual(sink.destination, self.DESTINATION_URI)
|
||
|
self.assertTrue(sink.client is client)
|
||
|
self.assertEqual(sink.project, self.PROJECT)
|
||
|
|
||
|
def test_list_sinks_no_paging(self):
|
||
|
from gcloud.logging.sink import Sink
|
||
|
PROJECT = 'PROJECT'
|
||
|
TOKEN = 'TOKEN'
|
||
|
SINK_NAME = 'sink_name'
|
||
|
FILTER = 'logName:syslog AND severity>=ERROR'
|
||
|
SINKS = [{
|
||
|
'name': SINK_NAME,
|
||
|
'filter': FILTER,
|
||
|
'destination': self.DESTINATION_URI,
|
||
|
}]
|
||
|
client = self._makeOne(project=PROJECT, credentials=_Credentials())
|
||
|
api = client._sinks_api = _DummySinksAPI()
|
||
|
api._list_sinks_response = SINKS, TOKEN
|
||
|
|
||
|
sinks, token = client.list_sinks()
|
||
|
|
||
|
self.assertEqual(len(sinks), 1)
|
||
|
sink = sinks[0]
|
||
|
self.assertTrue(isinstance(sink, Sink))
|
||
|
self.assertEqual(sink.name, SINK_NAME)
|
||
|
self.assertEqual(sink.filter_, FILTER)
|
||
|
self.assertEqual(sink.destination, self.DESTINATION_URI)
|
||
|
|
||
|
self.assertEqual(token, TOKEN)
|
||
|
self.assertEqual(api._list_sinks_called_with,
|
||
|
(PROJECT, None, None))
|
||
|
|
||
|
def test_list_sinks_with_paging(self):
|
||
|
from gcloud.logging.sink import Sink
|
||
|
PROJECT = 'PROJECT'
|
||
|
SINK_NAME = 'sink_name'
|
||
|
FILTER = 'logName:syslog AND severity>=ERROR'
|
||
|
TOKEN = 'TOKEN'
|
||
|
PAGE_SIZE = 42
|
||
|
SINKS = [{
|
||
|
'name': SINK_NAME,
|
||
|
'filter': FILTER,
|
||
|
'destination': self.DESTINATION_URI,
|
||
|
}]
|
||
|
client = self._makeOne(project=PROJECT, credentials=_Credentials())
|
||
|
api = client._sinks_api = _DummySinksAPI()
|
||
|
api._list_sinks_response = SINKS, None
|
||
|
|
||
|
sinks, token = client.list_sinks(PAGE_SIZE, TOKEN)
|
||
|
|
||
|
self.assertEqual(len(sinks), 1)
|
||
|
sink = sinks[0]
|
||
|
self.assertTrue(isinstance(sink, Sink))
|
||
|
self.assertEqual(sink.name, SINK_NAME)
|
||
|
self.assertEqual(sink.filter_, FILTER)
|
||
|
self.assertEqual(sink.destination, self.DESTINATION_URI)
|
||
|
self.assertEqual(token, None)
|
||
|
self.assertEqual(api._list_sinks_called_with,
|
||
|
(PROJECT, PAGE_SIZE, TOKEN))
|
||
|
|
||
|
def test_metric_defaults(self):
|
||
|
from gcloud.logging.metric import Metric
|
||
|
creds = _Credentials()
|
||
|
|
||
|
client_obj = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
metric = client_obj.metric(self.METRIC_NAME)
|
||
|
self.assertTrue(isinstance(metric, Metric))
|
||
|
self.assertEqual(metric.name, self.METRIC_NAME)
|
||
|
self.assertEqual(metric.filter_, None)
|
||
|
self.assertEqual(metric.description, '')
|
||
|
self.assertTrue(metric.client is client_obj)
|
||
|
self.assertEqual(metric.project, self.PROJECT)
|
||
|
|
||
|
def test_metric_explicit(self):
|
||
|
from gcloud.logging.metric import Metric
|
||
|
creds = _Credentials()
|
||
|
|
||
|
client_obj = self._makeOne(project=self.PROJECT, credentials=creds)
|
||
|
metric = client_obj.metric(self.METRIC_NAME, self.FILTER,
|
||
|
description=self.DESCRIPTION)
|
||
|
self.assertTrue(isinstance(metric, Metric))
|
||
|
self.assertEqual(metric.name, self.METRIC_NAME)
|
||
|
self.assertEqual(metric.filter_, self.FILTER)
|
||
|
self.assertEqual(metric.description, self.DESCRIPTION)
|
||
|
self.assertTrue(metric.client is client_obj)
|
||
|
self.assertEqual(metric.project, self.PROJECT)
|
||
|
|
||
|
def test_list_metrics_no_paging(self):
|
||
|
from gcloud.logging.metric import Metric
|
||
|
PROJECT = 'PROJECT'
|
||
|
TOKEN = 'TOKEN'
|
||
|
METRICS = [{
|
||
|
'name': self.METRIC_NAME,
|
||
|
'filter': self.FILTER,
|
||
|
'description': self.DESCRIPTION,
|
||
|
}]
|
||
|
client = self._makeOne(project=PROJECT, credentials=_Credentials())
|
||
|
api = client._metrics_api = _DummyMetricsAPI()
|
||
|
api._list_metrics_response = METRICS, TOKEN
|
||
|
|
||
|
metrics, token = client.list_metrics()
|
||
|
|
||
|
self.assertEqual(len(metrics), 1)
|
||
|
metric = metrics[0]
|
||
|
self.assertTrue(isinstance(metric, Metric))
|
||
|
self.assertEqual(metric.name, self.METRIC_NAME)
|
||
|
self.assertEqual(metric.filter_, self.FILTER)
|
||
|
self.assertEqual(metric.description, self.DESCRIPTION)
|
||
|
self.assertEqual(token, TOKEN)
|
||
|
self.assertEqual(api._list_metrics_called_with,
|
||
|
(PROJECT, None, None))
|
||
|
|
||
|
def test_list_metrics_with_paging(self):
|
||
|
from gcloud.logging.metric import Metric
|
||
|
PROJECT = 'PROJECT'
|
||
|
TOKEN = 'TOKEN'
|
||
|
PAGE_SIZE = 42
|
||
|
METRICS = [{
|
||
|
'name': self.METRIC_NAME,
|
||
|
'filter': self.FILTER,
|
||
|
'description': self.DESCRIPTION,
|
||
|
}]
|
||
|
client = self._makeOne(project=PROJECT, credentials=_Credentials())
|
||
|
api = client._metrics_api = _DummyMetricsAPI()
|
||
|
api._list_metrics_response = METRICS, None
|
||
|
|
||
|
# Execute request.
|
||
|
metrics, token = client.list_metrics(PAGE_SIZE, TOKEN)
|
||
|
# Test values are correct.
|
||
|
self.assertEqual(len(metrics), 1)
|
||
|
metric = metrics[0]
|
||
|
self.assertTrue(isinstance(metric, Metric))
|
||
|
self.assertEqual(metric.name, self.METRIC_NAME)
|
||
|
self.assertEqual(metric.filter_, self.FILTER)
|
||
|
self.assertEqual(metric.description, self.DESCRIPTION)
|
||
|
self.assertEqual(token, None)
|
||
|
self.assertEqual(api._list_metrics_called_with,
|
||
|
(PROJECT, PAGE_SIZE, TOKEN))
|
||
|
|
||
|
|
||
|
class _Credentials(object):
|
||
|
|
||
|
_scopes = None
|
||
|
|
||
|
@staticmethod
|
||
|
def create_scoped_required():
|
||
|
return True
|
||
|
|
||
|
def create_scoped(self, scope):
|
||
|
self._scopes = scope
|
||
|
return self
|
||
|
|
||
|
|
||
|
class _DummyLoggingAPI(object):
|
||
|
|
||
|
def list_entries(self, projects, filter_, order_by, page_size, page_token):
|
||
|
self._list_entries_called_with = (
|
||
|
projects, filter_, order_by, page_size, page_token)
|
||
|
return self._list_entries_response
|
||
|
|
||
|
|
||
|
class _DummySinksAPI(object):
|
||
|
|
||
|
def list_sinks(self, project, page_size, page_token):
|
||
|
self._list_sinks_called_with = (project, page_size, page_token)
|
||
|
return self._list_sinks_response
|
||
|
|
||
|
|
||
|
class _DummyMetricsAPI(object):
|
||
|
|
||
|
def list_metrics(self, project, page_size, page_token):
|
||
|
self._list_metrics_called_with = (project, page_size, page_token)
|
||
|
return self._list_metrics_response
|