예제 #1
0
    def test_get_all_metrics(self):
        """
        Metrics are returned based on the requests done to get server info.
        """
        # Maybe this could use a parameterized "get_all_scaling_group_servers"
        # call to avoid needing to stub the nova responses, but it seems okay.
        servers_t1 = {
            'g1': ([_server('g1', 'ACTIVE')] * 3 +
                   [_server('g1', 'BUILD')] * 2),
            'g2': [_server('g2', 'ACTIVE')]}

        servers_t2 = {
            'g4': [_server('g4', 'ACTIVE'),
                   _server('g4', 'BUILD')]}

        groups = {
            "t1": [{'tenantId': 't1', 'groupId': 'g1', 'desired': 3},
                   {'tenantId': 't1', 'groupId': 'g2', 'desired': 4}],
            "t2": [{'tenantId': 't2', 'groupId': 'g4', 'desired': 2}]}

        tenant_servers = {'t1': servers_t1, 't2': servers_t2}

        effs = get_all_metrics_effects(groups, mock_log())
        # All the effs are wrapped in TenantScopes to indicate the tenant
        # of ServiceRequests made under them. We use that tenant to get the
        # stubbed result of get_all_scaling_group_servers.
        results = [
            resolve_effect(eff, tenant_servers[eff.intent.tenant_id])
            for eff in effs]

        self.assertEqual(
            set(reduce(operator.add, results)),
            set([GroupMetrics('t1', 'g1', desired=3, actual=3, pending=2),
                 GroupMetrics('t1', 'g2', desired=4, actual=1, pending=0),
                 GroupMetrics('t2', 'g4', desired=2, actual=1, pending=1)]))
예제 #2
0
    def test_error_per_tenant(self):
        """
        When a request for servers fails, the associated effect results in
        None, and an error is logged.
        """
        log = mock_log()
        log.err.return_value = None

        groups = {
            "t1": [{
                'tenantId': 't1',
                'groupId': 'g1',
                'desired': 0
            }],
            "t2": [{
                'tenantId': 't2',
                'groupId': 'g2',
                'desired': 0
            }]
        }
        effs = get_all_metrics_effects(groups, log)
        results = []
        for eff in effs:
            if eff.intent.tenant_id == 't1':
                results.append(resolve_effect(eff, {}))
            elif eff.intent.tenant_id == 't2':
                err = (ZeroDivisionError, ZeroDivisionError('foo bar'), None)
                results.append(resolve_effect(eff, err, is_error=True))
        self.assertEqual(
            results,
            [None, [GroupMetrics('t1', 'g1', desired=0, actual=0, pending=0)]])
        log.err.assert_called_once_with(
            CheckFailureValue(ZeroDivisionError('foo bar')))
예제 #3
0
    def test_get_all_metrics(self):
        """
        Metrics are returned based on the requests done to get server info.
        """
        # Maybe this could use a parameterized "get_all_scaling_group_servers"
        # call to avoid needing to stub the nova responses, but it seems okay.
        servers_t1 = {
            'g1':
            ([_server('g1', 'ACTIVE')] * 3 + [_server('g1', 'BUILD')] * 2),
            'g2': [_server('g2', 'ACTIVE')]
        }

        servers_t2 = {'g4': [_server('g4', 'ACTIVE'), _server('g4', 'BUILD')]}

        groups = {
            "t1": [{
                'tenantId': 't1',
                'groupId': 'g1',
                'desired': 3
            }, {
                'tenantId': 't1',
                'groupId': 'g2',
                'desired': 4
            }],
            "t2": [{
                'tenantId': 't2',
                'groupId': 'g4',
                'desired': 2
            }]
        }

        tenant_servers = {'t1': servers_t1, 't2': servers_t2}

        effs = get_all_metrics_effects(groups, mock_log())
        # All the effs are wrapped in TenantScopes to indicate the tenant
        # of ServiceRequests made under them. We use that tenant to get the
        # stubbed result of get_all_scaling_group_servers.
        results = [
            resolve_effect(eff, tenant_servers[eff.intent.tenant_id])
            for eff in effs
        ]

        self.assertEqual(
            set(reduce(operator.add, results)),
            set([
                GroupMetrics('t1', 'g1', desired=3, actual=3, pending=2),
                GroupMetrics('t1', 'g2', desired=4, actual=1, pending=0),
                GroupMetrics('t2', 'g4', desired=2, actual=1, pending=1)
            ]))
예제 #4
0
    def test_error_per_tenant(self):
        """
        When a request for servers fails, the associated effect results in
        None, and an error is logged.
        """
        log = mock_log()
        log.err.return_value = None

        groups = {
            "t1": [{"tenantId": "t1", "groupId": "g1", "desired": 0}],
            "t2": [{"tenantId": "t2", "groupId": "g2", "desired": 0}],
        }
        effs = get_all_metrics_effects(groups, log)
        results = []
        for eff in effs:
            if eff.intent.tenant_id == "t1":
                results.append(resolve_effect(eff, {}))
            elif eff.intent.tenant_id == "t2":
                err = (ZeroDivisionError, ZeroDivisionError("foo bar"), None)
                results.append(resolve_effect(eff, err, is_error=True))
        self.assertEqual(results, [None, [GroupMetrics("t1", "g1", desired=0, actual=0, pending=0)]])
        log.err.assert_called_once_with(CheckFailureValue(ZeroDivisionError("foo bar")))