def test_recover_networks(self, mock_client): # Setup return values for get functions net = model.Network.from_neutron(fake_networks.fake_net2) mock_client.return_value.get_vpns.return_value = [net.vpn.data] mock_client.return_value.get_scopes.return_value = \ [s.data for s in net.scopes.values()] mock_client.return_value.get_client_entries.return_value = \ [ce.data for ce in net.client_entries.values()] mock_client.return_value.get_dns_views.return_value = [net.view.data] mock_client.return_value.get_ccm_zones.return_value = \ [fz.data for fz in net.forward_zones.values()] mock_client.return_value.get_ccm_reverse_zones.return_value = \ [rz.data for rz in net.reverse_zones.values()] mock_client.return_value.get_ccm_hosts.return_value = \ [h.data for h in net.hosts.values()] # Extract key identifiers netid = fake_networks.fake_net2.id vpnid = net.vpn.data['id'] viewid = net.view.data['viewId'] zoneid = 'openstacklocal.' # Invoke recover_networks function networks = model.recover_networks() self.assertIn(netid, networks) rec = networks[netid] # Validate get functions are called as expected mock_client.return_value.get_vpns.assert_called_once_with() mock_client.return_value.get_scopes.assert_called_once_with(vpnid) mock_client.return_value.get_client_entries.assert_called_once_with() mock_client.return_value.get_dns_views.assert_called_once_with() mock_client.return_value.\ get_ccm_zones.assert_called_once_with(viewid=viewid) mock_client.return_value.get_ccm_reverse_zones.assert_called_once_with( viewid=viewid) mock_client.return_value.get_ccm_hosts(viewid=viewid, zoneid=zoneid) # Validate that recover_networks returned correct data self.assertEqual(net.vpn.data, rec.vpn.data) self.assertEqual(net.view.data, rec.view.data) for scopeid in net.scopes: self.assertIn(scopeid, rec.scopes) self.assertEqual(net.scopes[scopeid].data, rec.scopes[scopeid].data) for clientid in net.client_entries: self.assertIn(clientid, rec.client_entries) self.assertEqual(net.client_entries[clientid].data, rec.client_entries[clientid].data) for fzid in net.forward_zones: self.assertIn(fzid, rec.forward_zones) self.assertEqual(net.forward_zones[fzid].data, rec.forward_zones[fzid].data) for rzid in net.reverse_zones: self.assertIn(rzid, rec.reverse_zones) self.assertEqual(net.reverse_zones[rzid].data, rec.reverse_zones[rzid].data) for hostid in net.hosts: self.assertIn(hostid, rec.hosts) self.assertEqual(net.hosts[hostid].data, rec.hosts[hostid].data)
def recover_networks(cls): """Track Network Objects. Creates global dict to track network objects across driver invocations and populates using the model module. """ if "_networks" in globals(): return global _networks _networks = model.recover_networks()
def _synchronize_cpnr(cls): global last_activity while True: eventlet.sleep(cfg.CONF.cisco_pnr.sync_interval) if ((time.time() - last_activity) < cfg.CONF.cisco_pnr.sync_interval): continue pnr_networks = model.recover_networks() # Delete stale VPNs in CPNR deleted_keys = set(pnr_networks.keys()) - set( _networks.keys()) for key in deleted_keys: deleted = pnr_networks[key] try: lock = _locks.setdefault(deleted.vpn.data['name'], eventlet.semaphore.Semaphore()) with lock: deleted.delete() except Exception: LOG.exception(_LE('Failed to delete network %s in CPNR ' 'during sync:'), key) # Create VPNs in CPNR if not already present created_keys = set(_networks.keys()) - set( pnr_networks.keys()) for key in created_keys: created = _networks[key] try: lock = _locks.setdefault(created.vpn.data['name'], eventlet.semaphore.Semaphore()) with lock: created.create() except Exception: LOG.exception(_LE('Failed to create network %s in CPNR ' 'during sync'), key) # Update VPNs in CPNR if normal update has been unsuccessful updated_keys = set(_networks.keys()) & set( pnr_networks.keys()) for key in updated_keys: updated = _networks[key] try: lock = _locks.setdefault(updated.vpn.data['name'], eventlet.semaphore.Semaphore()) with lock: pnr_networks[key].update(updated) except Exception: LOG.exception(_LE('Failed to update network %s in CPNR ' 'during sync'), key)
def _synchronize_cpnr(cls): global last_activity while True: eventlet.sleep(cfg.CONF.cisco_pnr.sync_interval) if ((time.time() - last_activity) < cfg.CONF.cisco_pnr.sync_interval): continue pnr_networks = model.recover_networks() # Delete stale VPNs in CPNR deleted_keys = set(pnr_networks.keys()) - set(_networks.keys()) for key in deleted_keys: deleted = pnr_networks[key] try: lock = _locks.setdefault(deleted.vpn.data['name'], eventlet.semaphore.Semaphore()) with lock: deleted.delete() except Exception: LOG.exception( _LE('Failed to delete network %s in CPNR ' 'during sync:'), key) # Create VPNs in CPNR if not already present created_keys = set(_networks.keys()) - set(pnr_networks.keys()) for key in created_keys: created = _networks[key] try: lock = _locks.setdefault(created.vpn.data['name'], eventlet.semaphore.Semaphore()) with lock: created.create() except Exception: LOG.exception( _LE('Failed to create network %s in CPNR ' 'during sync'), key) # Update VPNs in CPNR if normal update has been unsuccessful updated_keys = set(_networks.keys()) & set(pnr_networks.keys()) for key in updated_keys: updated = _networks[key] try: lock = _locks.setdefault(updated.vpn.data['name'], eventlet.semaphore.Semaphore()) with lock: pnr_networks[key].update(updated) except Exception: LOG.exception( _LE('Failed to update network %s in CPNR ' 'during sync'), key)
def test_recover_networks(self, mock_client): # Setup return values for get functions net = model.Network.from_neutron(fake_networks.fake_net2) mock_client.return_value.get_vpns.return_value = [net.vpn.data] mock_client.return_value.get_scopes.return_value = [s.data for s in net.scopes.values()] mock_client.return_value.get_client_entries.return_value = [ce.data for ce in net.client_entries.values()] mock_client.return_value.get_dns_views.return_value = [net.view.data] mock_client.return_value.get_ccm_zones.return_value = [fz.data for fz in net.forward_zones.values()] mock_client.return_value.get_ccm_reverse_zones.return_value = [rz.data for rz in net.reverse_zones.values()] mock_client.return_value.get_ccm_hosts.return_value = [h.data for h in net.hosts.values()] # Extract key identifiers netid = fake_networks.fake_net2.id vpnid = net.vpn.data["id"] viewid = net.view.data["viewId"] zoneid = "openstacklocal." # Invoke recover_networks function networks = model.recover_networks() self.assertIn(netid, networks) rec = networks[netid] # Validate get functions are called as expected mock_client.return_value.get_vpns.assert_called_once_with() mock_client.return_value.get_scopes.assert_called_once_with(vpnid) mock_client.return_value.get_client_entries.assert_called_once_with() mock_client.return_value.get_dns_views.assert_called_once_with() mock_client.return_value.get_ccm_zones.assert_called_once_with(viewid=viewid) mock_client.return_value.get_ccm_reverse_zones.assert_called_once_with(viewid=viewid) mock_client.return_value.get_ccm_hosts(viewid=viewid, zoneid=zoneid) # Validate that recover_networks returned correct data self.assertEqual(net.vpn.data, rec.vpn.data) self.assertEqual(net.view.data, rec.view.data) for scopeid in net.scopes: self.assertIn(scopeid, rec.scopes) self.assertEqual(net.scopes[scopeid].data, rec.scopes[scopeid].data) for clientid in net.client_entries: self.assertIn(clientid, rec.client_entries) self.assertEqual(net.client_entries[clientid].data, rec.client_entries[clientid].data) for fzid in net.forward_zones: self.assertIn(fzid, rec.forward_zones) self.assertEqual(net.forward_zones[fzid].data, rec.forward_zones[fzid].data) for rzid in net.reverse_zones: self.assertIn(rzid, rec.reverse_zones) self.assertEqual(net.reverse_zones[rzid].data, rec.reverse_zones[rzid].data) for hostid in net.hosts: self.assertIn(hostid, rec.hosts) self.assertEqual(net.hosts[hostid].data, rec.hosts[hostid].data)