def testGetStatisticsNoData(self, ec2InstanceMetricGetterMock,
                                 repositoryMock):
    metricID = "abc"
    class MetricRowSpec(object):
      uid = None
      datasource = None

    metricRowMock = Mock(
        spec_set=MetricRowSpec,
        uid=metricID,
        datasource="autostack")
    autostackMock = Mock()
    repositoryMock.getAutostackFromMetric = Mock(return_value=autostackMock)
    repositoryMock.getMetricStats.side_effect = MetricStatisticsNotReadyError()
    metricGetterMock = Mock()

    ec2InstanceMetricGetterMock.return_value = metricGetterMock
    metricGetterMock.collectMetricStatistics.return_value = []

    # Call the function under test
    with self.assertRaises(MetricStatisticsNotReadyError):
      aggregation.getStatistics(metricRowMock)

    self.assertEqual(repositoryMock.getAutostackFromMetric.call_args[0][1],
                     metricID)

    metricGetterMock.collectMetricStatistics.assert_called_once_with(
        autostackMock, metricRowMock)
    metricGetterMock.close.assert_called_once()
    def testGetStatisticsNoData(self, ec2InstanceMetricGetterMock,
                                repositoryMock):
        metricID = "abc"

        class MetricRowSpec(object):
            uid = None
            datasource = None

        metricRowMock = Mock(spec_set=MetricRowSpec,
                             uid=metricID,
                             datasource="autostack")
        autostackMock = Mock()
        repositoryMock.getAutostackFromMetric = Mock(
            return_value=autostackMock)
        repositoryMock.getMetricStats.side_effect = MetricStatisticsNotReadyError(
        )
        metricGetterMock = Mock()

        ec2InstanceMetricGetterMock.return_value = metricGetterMock
        metricGetterMock.collectMetricStatistics.return_value = []

        # Call the function under test
        with self.assertRaises(MetricStatisticsNotReadyError):
            aggregation.getStatistics(metricRowMock)

        self.assertEqual(repositoryMock.getAutostackFromMetric.call_args[0][1],
                         metricID)

        metricGetterMock.collectMetricStatistics.assert_called_once_with(
            autostackMock, metricRowMock)
        metricGetterMock.close.assert_called_once()
    def testGetStatisticsMultpleInstances(self, ec2InstanceMetricGetterMock,
                                          getAutostackFromMetricMock,
                                          _engineFactoryMock):

        metricID = "abc"

        class MetricRowSpec(object):
            uid = None
            datasource = None

        metricRowMock = Mock(spec_set=MetricRowSpec,
                             uid=metricID,
                             datasource="autostack")
        autostackMock = Mock()
        getAutostackFromMetricMock.return_value = autostackMock

        metricGetterMock = Mock()
        ec2InstanceMetricGetterMock.return_value = metricGetterMock
        metricGetterMock.collectMetricStatistics.return_value = [
            InstanceMetricData(instanceID="tempID1",
                               records=[
                                   MetricRecord(timestamp=None,
                                                value={
                                                    "min": 5.0,
                                                    "max": 20.0
                                                })
                               ]),
            InstanceMetricData(instanceID="tempID2",
                               records=[
                                   MetricRecord(timestamp=None,
                                                value={
                                                    "min": 15.0,
                                                    "max": 30.0
                                                })
                               ]),
        ]

        # Call the function under test
        stats = aggregation.getStatistics(metricRowMock)

        # Validate stats
        self.assertSetEqual(set(stats.keys()), set(("min", "max")))
        # Make sure to include 20% buffer on range
        self.assertAlmostEqual(stats["min"], 7.0)
        self.assertAlmostEqual(stats["max"], 28.0)

        # Validate mocks were called correctly
        self.assertEqual(getAutostackFromMetricMock.call_args[0][1], metricID)

        metricGetterMock.collectMetricStatistics.assert_called_once_with(
            autostackMock, metricRowMock)
        metricGetterMock.close.assert_called_once()
  def testGetStatisticsMultpleInstances(self, ec2InstanceMetricGetterMock,
                                        getAutostackFromMetricMock,
                                        _engineFactoryMock):

    metricID = "abc"
    class MetricRowSpec(object):
      uid = None
      datasource = None
    metricRowMock = Mock(
        spec_set=MetricRowSpec,
        uid=metricID,
        datasource="autostack")
    autostackMock = Mock()
    getAutostackFromMetricMock.return_value = autostackMock

    metricGetterMock = Mock()
    ec2InstanceMetricGetterMock.return_value = metricGetterMock
    metricGetterMock.collectMetricStatistics.return_value = [
        InstanceMetricData(
            instanceID="tempID1",
            records=[MetricRecord(timestamp=None,
                                  value={"min": 5.0, "max": 20.0})]),
        InstanceMetricData(
            instanceID="tempID2",
            records=[MetricRecord(timestamp=None,
                                  value={"min": 15.0, "max": 30.0})]),
    ]

    # Call the function under test
    stats = aggregation.getStatistics(metricRowMock)

    # Validate stats
    self.assertSetEqual(set(stats.keys()), set(("min", "max")))
    # Make sure to include 20% buffer on range
    self.assertAlmostEqual(stats["min"], 7.0)
    self.assertAlmostEqual(stats["max"], 28.0)

    # Validate mocks were called correctly
    self.assertEqual(getAutostackFromMetricMock.call_args[0][1], metricID)

    metricGetterMock.collectMetricStatistics.assert_called_once_with(
        autostackMock, metricRowMock)
    metricGetterMock.close.assert_called_once()