Beispiel #1
0
def test_cloudwatch(monkeypatch):
    client = MagicMock()
    client.list_metrics.return_value = {'Metrics': [{'MetricName': 'Latency',
                                                     'Namespace': 'ELB',
                                                     'Dimensions': [
                                                         {'Name': 'LoadBalancerName', 'Value': 'pierone-1'}]},
                                                    {'MetricName': 'Latency',
                                                     'Namespace': 'ELB',
                                                     'Dimensions': [
                                                         {'Name': 'AvailabilityZone', 'Value': 'az-1'},
                                                         {'Name': 'LoadBalancerName', 'Value': 'pierone-1'}]},
                                                    {'MetricName': 'Latency',
                                                     'Namespace': 'ELB',
                                                     'Dimensions': [
                                                         {'Name': 'LoadBalancerName', 'Value': 'otherapp-1'}]}
                                                    ]}
    client.get_metric_statistics.return_value = {
        'Datapoints': [{'Timestamp': datetime.datetime.now(), 'Average': 100.25}]}
    get = MagicMock()
    get.return_value.json.return_value = {'region': 'myregion'}
    monkeypatch.setattr('requests.get', get)
    monkeypatch.setattr('boto3.client', lambda x, region_name: client)
    cloudwatch = CloudwatchWrapper()
    elb_data = cloudwatch.query({'AvailabilityZone': 'NOT_SET', 'LoadBalancerName': 'pierone-*'}, 'Latency', 'Average',
                                namespace='ELB')
    assert {'Latency': 100.25, 'dimensions': {'LoadBalancerName': {'pierone-1': 100.25}}} == elb_data
def test_cloudwatch_paging(monkeypatch):
    client = MagicMock()

    call_count = {'list_metrics': 0, 'get_metric_statistics': 0}

    def my_list_metrics(*args, **kwargs):
        call_count['list_metrics'] += 1
        if 'NextToken' in kwargs:
            return {'Metrics': [{'MetricName': 'NetworkOut',
                                 'Namespace': 'AWS/EC2',
                                 'Dimensions': [
                                     {'Name': 'AutoScalingGroupName', 'Value': 'tailor-1'}]}]}
        else:
            return {'Metrics': [{'MetricName': 'NetworkOut',
                                 'Namespace': 'AWS/EC2',
                                 'Dimensions': [
                                     {'Value': 'i-123456789', 'Name': 'InstanceId'}]},
                                {'MetricName': 'NetworkOut',
                                 'Namespace': 'AWS/EC2',
                                 'Dimensions': [
                                     {'Value': 'i-987654321', 'Name': 'InstanceId'}]},
                                {'MetricName': 'NetworkOut',
                                 'Namespace': 'AWS/EC2',
                                 'Dimensions': [
                                     {'Value': 'other-asg-1VSSQK1FPN2A', 'Name': 'AutoScalingGroupName'}]}
                                ],
                    'NextToken': 'dummyToken'}

    def my_get_metric_statistics(*args, **kwargs):
        call_count['get_metric_statistics'] += 1
        if kwargs['Dimensions'][0]['Name'] == 'AutoScalingGroupName' and kwargs['Dimensions'][0]['Value'] == 'tailor-1':
            return {'Datapoints': [{'Timestamp': datetime.datetime.now(), 'Average': 42.0}]}

    client.list_metrics = my_list_metrics
    client.get_metric_statistics = my_get_metric_statistics

    monkeypatch.setattr('boto3.client', lambda x, region_name: client)
    cloudwatch = CloudwatchWrapper(region='dummy-region')
    data = cloudwatch.query({'AvailabilityZone': 'NOT_SET', 'AutoScalingGroupName': 'tailor-*'},
                            'NetworkOut', 'Average',
                            namespace='AWS/EC2')

    assert call_count['list_metrics'] is 2
    assert call_count['get_metric_statistics'] is 1

    assert {'NetworkOut': 42.0, 'dimensions': {'AutoScalingGroupName': {'tailor-1': 42.0}}} == data
def test_cloudwatch(monkeypatch):
    client = MagicMock()
    client.list_metrics.return_value = {
        'Metrics': [{
            'MetricName':
            'Latency',
            'Namespace':
            'ELB',
            'Dimensions': [{
                'Name': 'LoadBalancerName',
                'Value': 'pierone-1'
            }]
        }, {
            'MetricName':
            'Latency',
            'Namespace':
            'ELB',
            'Dimensions': [{
                'Name': 'AvailabilityZone',
                'Value': 'az-1'
            }, {
                'Name': 'LoadBalancerName',
                'Value': 'pierone-1'
            }]
        }, {
            'MetricName':
            'Latency',
            'Namespace':
            'ELB',
            'Dimensions': [{
                'Name': 'LoadBalancerName',
                'Value': 'otherapp-1'
            }]
        }]
    }
    client.get_metric_statistics.return_value = {
        'Datapoints': [{
            'Timestamp': datetime.datetime.now(),
            'Average': 100.25
        }]
    }
    get = MagicMock()
    get.return_value.json.return_value = {'region': 'myregion'}
    monkeypatch.setattr('requests.get', get)
    monkeypatch.setattr('boto3.client', lambda x, region_name: client)
    cloudwatch = CloudwatchWrapper()
    elb_data = cloudwatch.query(
        {
            'AvailabilityZone': 'NOT_SET',
            'LoadBalancerName': 'pierone-*'
        },
        'Latency',
        'Average',
        namespace='ELB')
    assert {
        'Latency': 100.25,
        'dimensions': {
            'LoadBalancerName': {
                'pierone-1': 100.25
            }
        }
    } == elb_data
def test_cloudwatch_paging(monkeypatch):
    client = MagicMock()

    call_count = {'list_metrics': 0, 'get_metric_statistics': 0}

    def my_list_metrics(*args, **kwargs):
        call_count['list_metrics'] += 1
        if 'NextToken' in kwargs:
            return {
                'Metrics': [{
                    'MetricName':
                    'NetworkOut',
                    'Namespace':
                    'AWS/EC2',
                    'Dimensions': [{
                        'Name': 'AutoScalingGroupName',
                        'Value': 'tailor-1'
                    }]
                }]
            }
        else:
            return {
                'Metrics': [{
                    'MetricName':
                    'NetworkOut',
                    'Namespace':
                    'AWS/EC2',
                    'Dimensions': [{
                        'Value': 'i-123456789',
                        'Name': 'InstanceId'
                    }]
                }, {
                    'MetricName':
                    'NetworkOut',
                    'Namespace':
                    'AWS/EC2',
                    'Dimensions': [{
                        'Value': 'i-987654321',
                        'Name': 'InstanceId'
                    }]
                }, {
                    'MetricName':
                    'NetworkOut',
                    'Namespace':
                    'AWS/EC2',
                    'Dimensions': [{
                        'Value': 'other-asg-1VSSQK1FPN2A',
                        'Name': 'AutoScalingGroupName'
                    }]
                }],
                'NextToken':
                'dummyToken'
            }

    def my_get_metric_statistics(*args, **kwargs):
        call_count['get_metric_statistics'] += 1
        if kwargs['Dimensions'][0]['Name'] == 'AutoScalingGroupName' and kwargs[
                'Dimensions'][0]['Value'] == 'tailor-1':
            return {
                'Datapoints': [{
                    'Timestamp': datetime.datetime.now(),
                    'Average': 42.0
                }]
            }

    client.list_metrics = my_list_metrics
    client.get_metric_statistics = my_get_metric_statistics

    monkeypatch.setattr('boto3.client', lambda x, region_name: client)
    cloudwatch = CloudwatchWrapper(region='dummy-region')
    data = cloudwatch.query(
        {
            'AvailabilityZone': 'NOT_SET',
            'AutoScalingGroupName': 'tailor-*'
        },
        'NetworkOut',
        'Average',
        namespace='AWS/EC2')

    assert call_count['list_metrics'] is 2
    assert call_count['get_metric_statistics'] is 1

    assert {
        'NetworkOut': 42.0,
        'dimensions': {
            'AutoScalingGroupName': {
                'tailor-1': 42.0
            }
        }
    } == data