def test_get_status_with_faults(self): aim_obj = self.generate_aim_object(api_res.EndpointGroup) data = [self.root.aimc._generate_data_item(aim_obj)] self.POST('aim', data=json.dumps(data)) self.mgr.set_resource_sync_synced(self.ctx, aim_obj) self.mgr.set_fault( self.ctx, aim_obj, status_res.AciFault(fault_code='900', external_identifier=aim_obj.dn)) resp = self.GET('aim?include-status=true') self.assertEqual(200, resp.status_code) body = resp.json() self.assertEqual(3, body['count']) for item in body['data']: if item['type'] == 'endpoint_group': aim_id = item['aim_id'] elif item['type'] == 'aci_fault': fault_code = item['attributes']['fault_code'] status_id = item['attributes']['status_id'] elif item['type'] == 'aci_status': res_id = item['attributes']['resource_id'] real_status_id = item['attributes']['id'] # Correlate resources self.assertEqual('900', fault_code) self.assertEqual(real_status_id, status_id) self.assertEqual(aim_id, res_id)
def _get_example_aim_fault(cls, **kwargs): example = aim_status.AciFault( fault_code='951', external_identifier='uni/tn-t1/ap-a1/epg-test/fault-951', severity='warning') example.__dict__.update(kwargs) return example
def test_cleanup_state(self, tree_type=tree_manager.CONFIG_TREE): tree_mgr = tree_manager.HashTreeManager() aim_mgr = aim_manager.AimManager() aim_mgr.create(self.ctx, resource.Tenant(name='t1')) bd1 = resource.BridgeDomain(tenant_name='t1', name='bd1', display_name='somestuff', vrf_name='vrf') bd1_fault = aim_status.AciFault( fault_code='901', external_identifier='uni/tn-t1/BD-bd1/fault-901', description='failure901') aim_mgr.create(self.ctx, bd1) aim_mgr.set_fault(self.ctx, bd1, bd1_fault) self.assertRaises(Exception, self.universe.cleanup_state, 'tn-t1') trees = tree_mgr.find(self.ctx, tree=tree_type) # tenant still there, trees not empty. self.assertEqual(1, len(trees)) aim_mgr.clear_fault(self.ctx, bd1_fault) aim_mgr.delete(self.ctx, resource.Tenant(name='t1'), cascade=True) self.universe.cleanup_state(self.ctx, 'tn-t1') trees = tree_mgr.find(self.ctx, tree=tree_type) self.assertEqual(0, len(trees))
def test_retrieve_fault_parent(self): ext_net = aim_status.AciFault( fault_code='F0967', external_identifier=('uni/tn-common/out-l3out-1/instP-kepg/' 'rscons-service__default_frontend/' 'fault-F0967')) self.assertTrue( isinstance( aim_universe.utils.retrieve_fault_parent( ext_net.external_identifier, aim_universe.converter.resource_map)[0], resource.ExternalNetwork)) epg = aim_status.AciFault( fault_code='F0967', external_identifier=('uni/tn-common/ap-ap1/epg-epg1/' 'rscons-service__default_frontend/' 'fault-F0967')) self.assertTrue( isinstance( aim_universe.utils.retrieve_fault_parent( epg.external_identifier, aim_universe.converter.resource_map)[0], resource.EndpointGroup))
def test_push_resources(self): aim_mgr = aim_manager.AimManager() aim_mgr.create(self.ctx, resource.Tenant(name='t1')) ap = self._get_example_aci_app_profile(dn='uni/tn-t1/ap-a1') ap_aim = resource.ApplicationProfile(tenant_name='t1', name='a1') epg = self._get_example_aci_epg( dn='uni/tn-t1/ap-a1/epg-test') fault = self._get_example_aci_fault( dn='uni/tn-t1/ap-a1/epg-test/fault-951') faul_aim = aim_status.AciFault( fault_code='951', external_identifier='uni/tn-t1/ap-a1/epg-test/fault-951') self.universe.push_resources(self.ctx, {'create': [ap, epg, fault], 'delete': []}) res = aim_mgr.get(self.ctx, resource.EndpointGroup( tenant_name='t1', app_profile_name='a1', name='test')) status = aim_mgr.get_status(self.ctx, res) self.assertEqual(1, len(status.faults)) self.assertEqual('951', status.faults[0].fault_code) # Unset fault self.universe.push_resources(self.ctx, {'create': [], 'delete': [faul_aim]}) status = aim_mgr.get_status(self.ctx, res) self.assertEqual(0, len(status.faults)) # create subject, and faults for subject-to-filter relation filter_objs = [ {'vzBrCP': {'attributes': {'dn': 'uni/tn-t1/brc-c'}}}, {'vzSubj': {'attributes': {'dn': 'uni/tn-t1/brc-c/subj-s2'}}}, self._get_example_aci_fault( dn='uni/tn-t1/brc-c/subj-s2/intmnl/rsfiltAtt-f/fault-F1111', code='F1111'), self._get_example_aci_fault( dn='uni/tn-t1/brc-c/subj-s2/outtmnl/rsfiltAtt-g/fault-F1112', code='F1112'), self._get_example_aci_fault( dn='uni/tn-t1/brc-c/subj-s2/rssubjFiltAtt-h/fault-F1113', code='F1113')] self.universe.push_resources(self.ctx, {'create': filter_objs, 'delete': []}) subj = resource.ContractSubject(tenant_name='t1', contract_name='c', name='s2') status = aim_mgr.get_status(self.ctx, subj) self.assertEqual(2, len(status.faults)) self.assertEqual(['F1111', 'F1112'], [f.fault_code for f in status.faults]) # delete filter faults self.universe.push_resources(self.ctx, {'create': [], 'delete': status.faults}) status = aim_mgr.get_status(self.ctx, subj) self.assertEqual(0, len(status.faults)) # Managed epg managed_epg = resource.EndpointGroup( tenant_name='t1', app_profile_name='a1', name='managed') aim_mgr.create(self.ctx, managed_epg) # EPG cannot be deleted since is managed self.universe.push_resources( self.ctx, {'create': [], 'delete': [ap_aim, managed_epg]}) res = aim_mgr.get(self.ctx, managed_epg) if self.monitor_universe: self.assertIsNotNone(res) aim_mgr.delete(self.ctx, managed_epg) else: self.assertIsNone(res)
def test_get_aim_resources(self, tree_type=tree_manager.CONFIG_TREE): tree_mgr = tree_manager.HashTreeManager() aim_mgr = aim_manager.AimManager() t1 = resource.Tenant(name='t1') t2 = resource.Tenant(name='t2') t1_fault = aim_status.AciFault( fault_code='101', external_identifier='uni/tn-t1/fault-101', description='failure101') t2_fault = aim_status.AciFault( fault_code='102', external_identifier='uni/tn-t2/fault-102', description='failure102') # Create Resources on a couple of tenants bd1 = resource.BridgeDomain( tenant_name='t1', name='bd1', display_name='somestuff', vrf_name='vrf') bd1_fault = aim_status.AciFault( fault_code='901', external_identifier='uni/tn-t1/BD-bd1/fault-901', description='failure901') bd1_fault2 = aim_status.AciFault( fault_code='902', external_identifier='uni/tn-t1/BD-bd1/fault-902', description='failure902') bd2 = resource.BridgeDomain( tenant_name='t2', name='bd1', display_name='somestuff', vrf_name='vrf2') dc1 = aim_service_graph.DeviceCluster( tenant_name='t1', name='clus1', devices=[{'name': '1'}]) dc1_fault = aim_status.AciFault( fault_code='901', external_identifier='uni/tn-t1/lDevVip-clus1/fault-901', description='failure901') sg1 = aim_service_graph.ServiceGraph( tenant_name='t1', name='gr1', linear_chain_nodes=[{'name': 'N1', 'device_cluster_name': 'cl1'}]) sg1_fault = aim_status.AciFault( fault_code='901', external_identifier='uni/tn-t1/AbsGraph-gr1/fault-901', description='failure901') srp1 = aim_service_graph.ServiceRedirectPolicy( tenant_name='t1', name='srp1', destinations=[{'ip': '1.1.1.1', 'mac': 'aa:bb:cc:dd:ee:ff'}]) srp1_fault = aim_status.AciFault( fault_code='901', external_identifier=('uni/tn-t1/svcCont/svcRedirectPol-srp1' '/fault-901'), description='failure901') dc_ctx1 = aim_service_graph.DeviceClusterContext( tenant_name='t1', contract_name='contract1', service_graph_name='graph1', node_name='N1', device_cluster_name='cluster1', device_cluster_tenant_name='common', bridge_domain_name='svc_bd', service_redirect_policy_name='srp1') dc_ctx1_fault = aim_status.AciFault( fault_code='901', external_identifier=('uni/tn-t1/ldevCtx-c-contract1-' 'g-graph1-n-N1/fault-901'), description='failure901') if tree_type == tree_manager.MONITORED_TREE: bd1.monitored = True bd2.monitored = True t1.monitored = True t2.monitored = True dc1.monitored = True sg1.monitored = True srp1.monitored = True dc_ctx1.monitored = True aim_mgr.create(self.ctx, t1) aim_mgr.create(self.ctx, t2) aim_mgr.create(self.ctx, bd1) aim_mgr.set_fault(self.ctx, t1, t1_fault) aim_mgr.set_fault(self.ctx, t2, t2_fault) aim_mgr.set_fault(self.ctx, bd1, bd1_fault) aim_mgr.set_fault(self.ctx, bd1, bd1_fault2) aim_mgr.create(self.ctx, bd2) aim_mgr.set_resource_sync_synced(self.ctx, t1) aim_mgr.set_resource_sync_synced(self.ctx, t2) aim_mgr.set_resource_sync_synced(self.ctx, bd2) aim_mgr.set_resource_sync_synced(self.ctx, bd1) aim_mgr.create(self.ctx, dc1) aim_mgr.create(self.ctx, sg1) aim_mgr.create(self.ctx, srp1) aim_mgr.create(self.ctx, dc_ctx1) aim_mgr.set_fault(self.ctx, dc1, dc1_fault) aim_mgr.set_fault(self.ctx, sg1, sg1_fault) aim_mgr.set_fault(self.ctx, srp1, srp1_fault) aim_mgr.set_fault(self.ctx, dc_ctx1, dc_ctx1_fault) aim_mgr.set_resource_sync_synced(self.ctx, dc1) aim_mgr.set_resource_sync_synced(self.ctx, sg1) aim_mgr.set_resource_sync_synced(self.ctx, srp1) aim_mgr.set_resource_sync_synced(self.ctx, dc_ctx1) # Two trees exist trees = tree_mgr.find(self.ctx, tree=tree_type) self.assertEqual(2, len(trees)) # Calculate the different with empty trees to retrieve missing keys diff_tn_1 = trees[0].diff(tree.StructuredHashTree()) diff_tn_2 = trees[1].diff(tree.StructuredHashTree()) self.universe.get_relevant_state_for_read = mock.Mock( return_value=[{'tn-t1': trees[0], 'tn-t2': trees[1]}]) result = self.universe.get_resources(diff_tn_1.get('add', []) + diff_tn_1.get('remove', []) + diff_tn_2.get('add', []) + diff_tn_2.get('remove', [])) converted = converter.AciToAimModelConverter().convert( converter.AimToAciModelConverter().convert( [bd1, bd2, dc1, sg1, srp1, dc_ctx1, t1, t2])) if tree_type == tree_manager.MONITORED_TREE: for x in converted: x.monitored = True if tree_type in [tree_manager.CONFIG_TREE, tree_manager.MONITORED_TREE]: self.assertEqual(len(converted), len(result)) for item in converted: self.assertTrue(item in result) elif tree_type == tree_manager.OPERATIONAL_TREE: self.assertEqual(8, len(result)) self.assertTrue(bd1_fault in result) self.assertTrue(bd1_fault2 in result) self.assertTrue(dc1_fault in result) self.assertTrue(sg1_fault in result) self.assertTrue(srp1_fault in result) self.assertTrue(dc_ctx1_fault in result)