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)]))
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')))
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) ]))
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")))