def test_multi_isl_port_down(self): sw_alpha = make_datapath_id(1) sw_beta = make_datapath_id(2) sw_gamma = make_datapath_id(3) isl_alpha_beta = model.InterSwitchLink( model.NetworkEndpoint(sw_alpha, 2), model.NetworkEndpoint(sw_beta, 2), None) isl_beta_alpha = isl_alpha_beta.reversed() isl_beta_gamma = model.InterSwitchLink( model.NetworkEndpoint(sw_beta, 2), model.NetworkEndpoint(sw_gamma, 3), None) isl_gamma_beta = isl_beta_gamma.reversed() for dpid in sw_alpha, sw_beta, sw_gamma: self.assertTrue(make_switch_add(dpid)) self.assertTrue(share.exec_isl_discovery(isl_alpha_beta)) self.assertTrue(share.exec_isl_discovery(isl_beta_alpha)) self.assertTrue(share.exec_isl_discovery(isl_beta_gamma)) self.assertTrue(share.exec_isl_discovery(isl_gamma_beta)) self.assertTrue(make_port_down(isl_alpha_beta.dest)) self.ensure_isl_props(neo4j_connect, isl_alpha_beta, ISL_STATUS_PROPS_HALF_UP) self.ensure_isl_props(neo4j_connect, isl_beta_alpha, ISL_STATUS_PROPS_DOWN) self.ensure_isl_props(neo4j_connect, isl_beta_gamma, ISL_STATUS_PROPS_DOWN) self.ensure_isl_props(neo4j_connect, isl_gamma_beta, ISL_STATUS_PROPS_HALF_UP)
def test_moved_isl_should_be_marked(self): self.setup_initial_data() src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint forward = model.InterSwitchLink(src_endpoint, dst_endpoint, None) make_isl_moved(forward) self.ensure_isl_props(neo4j_connect, forward, ISL_STATUS_PROPS_MOVED)
class Abstract(share.AbstractTest): endpoint_alpha = model.NetworkEndpoint(share.make_datapath_id(1), 4) endpoint_beta = model.NetworkEndpoint(share.make_datapath_id(2), 6) endpoint_gamma = model.NetworkEndpoint(share.make_datapath_id(3), 8) isl_alpha_beta = model.InterSwitchLink( model.IslPathNode(endpoint_alpha.dpid, endpoint_alpha.port), model.IslPathNode(endpoint_beta.dpid, endpoint_beta.port)) isl_beta_alpha = isl_alpha_beta.reversed() def setUp(self): super(Abstract, self).setUp() for isl in (self.isl_alpha_beta, self.isl_beta_alpha): isl_info = share.isl_info_payload(isl) command = share.command(isl_info) self.assertTrue(messageclasses.MessageItem(command).handle()) def take_response(self, **kwargs): return self.take_kafka_response(config.KAFKA_NORTHBOUND_TOPIC, **kwargs) def _ensure_props_match(self, link_props, props): with self.open_neo4j_session() as tx: persistent = link_props_utils.read(tx, link_props) self.assertEqual(props, persistent.props) def _put(self, subject): request = share.link_props_request(subject) payload = share.link_props_put_payload(request) self.feed_service(share.command(payload)) return payload
def test_isl_status(self): src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint forward = model.InterSwitchLink(src_endpoint, dst_endpoint, None) reverse = forward.reversed() make_switch_add(src_endpoint.dpid) make_switch_add(dst_endpoint.dpid) status_down = { 'actual': ISL_STATUS_INACTIVE, 'status': ISL_STATUS_INACTIVE } status_half_up = { 'actual': ISL_STATUS_ACTIVE, 'status': ISL_STATUS_INACTIVE } status_up = {'actual': ISL_STATUS_ACTIVE, 'status': ISL_STATUS_ACTIVE} # 0 0 self.assertTrue(share.exec_isl_discovery(forward)) # 1 0 self.ensure_isl_props(neo4j_connect, forward, status_half_up) self.ensure_isl_props(neo4j_connect, reverse, status_down) self.assertTrue(share.exec_isl_discovery(reverse)) # 1 1 self.ensure_isl_props(neo4j_connect, forward, status_up) self.ensure_isl_props(neo4j_connect, reverse, status_up) self.assertTrue(make_isl_failed(src_endpoint)) # 0 1 self.ensure_isl_props(neo4j_connect, forward, status_down) self.ensure_isl_props(neo4j_connect, reverse, status_half_up) self.assertTrue(share.exec_isl_discovery(forward)) # 1 1 self.ensure_isl_props(neo4j_connect, forward, status_up) self.ensure_isl_props(neo4j_connect, reverse, status_up) self.assertTrue(make_isl_failed(dst_endpoint)) # 1 0 self.ensure_isl_props(neo4j_connect, forward, status_half_up) self.ensure_isl_props(neo4j_connect, reverse, status_down) self.assertTrue(share.exec_isl_discovery(reverse)) # 1 1 self.ensure_isl_props(neo4j_connect, forward, status_up) self.ensure_isl_props(neo4j_connect, reverse, status_up) self.assertTrue(make_isl_failed(src_endpoint)) # 0 1 self.ensure_isl_props(neo4j_connect, forward, status_down) self.ensure_isl_props(neo4j_connect, reverse, status_half_up) self.assertTrue(make_isl_failed(dst_endpoint)) # 0 0 self.ensure_isl_props(neo4j_connect, forward, status_down) self.ensure_isl_props(neo4j_connect, reverse, status_down)
def _set_isl_cost(self, value): with neo4j_connect.begin() as tx: isl = model.InterSwitchLink(self.src_endpoint, self.dst_endpoint, None) isl_utils.set_cost(tx, isl, value) isl_utils.set_cost(tx, isl.reversed(), value) with neo4j_connect.begin() as tx: props = {'cost': value} self.ensure_isl_props(tx, isl, props) self.ensure_isl_props(tx, isl.reversed(), props)
def test_port_down_with_cost_as_string(self): sw_alpha = make_datapath_id(1) sw_beta = make_datapath_id(2) isl_alpha_beta = model.InterSwitchLink( model.NetworkEndpoint(sw_alpha, 2), model.NetworkEndpoint(sw_beta, 2), None) self.assertTrue(share.exec_isl_discovery(isl_alpha_beta)) with neo4j_connect.begin() as tx: isl_utils.set_props(tx, isl_alpha_beta, {"cost": "10"}) self.assertTrue(make_port_down(isl_alpha_beta.source))
def switch_unplug(tx, dpid): logging.info("Deactivate all ISL to/from %s", dpid) for db_link in fetch_by_datapath(tx, dpid): source = model.NetworkEndpoint(db_link['src_switch'], db_link['src_port']) dest = model.NetworkEndpoint(db_link['dst_switch'], db_link['dst_port']) isl = model.InterSwitchLink(source, dest, db_link['actual']) logging.debug("Found ISL: %s", isl) set_active_field(tx, db.neo_id(db_link), 'inactive') update_status(tx, isl)
def switch_unplug(tx, dpid, mtime=True): logging.info("Deactivate all ISL to/from %s", dpid) involved = list(fetch_by_datapath(tx, dpid)) _lock_affected_switches(tx, involved, dpid) for db_link in involved: source = model.IslPathNode(db_link['src_switch'], db_link['src_port']) dest = model.IslPathNode(db_link['dst_switch'], db_link['dst_port']) isl = model.InterSwitchLink(source, dest, db_link['actual']) logging.debug("Found ISL: %s", isl) set_active_field(tx, db.neo_id(db_link), 'inactive') update_status(tx, isl, mtime=mtime)
def test_drop(self): lookup_mask = model.LinkProps(self.endpoint_alpha, self.endpoint_beta) with self.open_neo4j_session() as tx: isl_db = isl_utils.fetch( tx, model.InterSwitchLink(self.endpoint_alpha, self.endpoint_beta)) tx.graph.pull(isl_db) self.assertEqual('alpha-beta', isl_db['name']) self._drop(lookup_mask) self._ensure_missing(lookup_mask) self._ensure_exists( model.LinkProps(self.endpoint_alpha, self.endpoint_gamma), model.LinkProps(self.endpoint_beta, self.endpoint_gamma)) with self.open_neo4j_session() as tx: isl_db = isl_utils.fetch( tx, model.InterSwitchLink(self.endpoint_alpha, self.endpoint_beta)) tx.graph.pull(isl_db) self.assertNotIn('name', isl_db)
def _cost_raise_on_port_down(self, initial, down, recover): src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint isl = model.InterSwitchLink(src_endpoint, dst_endpoint, None) self.ensure_isl_costs((src_endpoint, initial), (dst_endpoint, initial)) self.assertTrue(make_port_down(src_endpoint), 'Port DOWN command have failed') self.ensure_isl_costs((src_endpoint, down), (dst_endpoint, down)) self.assertTrue(share.exec_isl_discovery(isl), 'ISL discovery command have failed') self.ensure_isl_costs((src_endpoint, recover), (dst_endpoint, recover))
def test_port_down_without_isl(self): sw_alpha = make_datapath_id(1) sw_beta = make_datapath_id(2) isl_alpha_beta = model.InterSwitchLink( model.NetworkEndpoint(sw_alpha, 2), model.NetworkEndpoint(sw_beta, 2), None) isl_beta_alpha = isl_alpha_beta.reversed() self.assertTrue(make_switch_add(sw_alpha)) self.assertTrue(make_port_down(isl_alpha_beta.source)) self.assertRaises(exc.DBRecordNotFound, isl_utils.fetch, neo4j_connect, isl_alpha_beta) self.assertRaises(exc.DBRecordNotFound, isl_utils.fetch, neo4j_connect, isl_beta_alpha)
def test_no_cost_raise_on_isl_down(self): self.setup_initial_data() src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint isl = model.InterSwitchLink(src_endpoint, dst_endpoint, None) self.ensure_isl_costs((src_endpoint, 10), (dst_endpoint, 10)) self.assertTrue(make_isl_failed(src_endpoint), 'Port DOWN command have failed') self.ensure_isl_costs((src_endpoint, 10), (dst_endpoint, 10)) self.assertTrue(share.exec_isl_discovery(isl), 'ISL discovery command have failed') self.ensure_isl_costs((src_endpoint, 10), (dst_endpoint, 10))
def test_switch_unplug(self): src_endpoint, dst_endpoint = self.src_endpoint, self.dst_endpoint forward = model.InterSwitchLink(src_endpoint, dst_endpoint, None) reverse = forward.reversed() self.assertTrue(make_switch_add(src_endpoint.dpid)) self.assertTrue(make_switch_add(dst_endpoint.dpid)) self.assertTrue(share.exec_isl_discovery(forward)) self.assertTrue(share.exec_isl_discovery(reverse)) self.ensure_isl_props(neo4j_connect, forward, ISL_STATUS_PROPS_UP) self.ensure_isl_props(neo4j_connect, reverse, ISL_STATUS_PROPS_UP) self.assertTrue(make_switch_remove(src_endpoint.dpid)) self.ensure_isl_props(neo4j_connect, forward, ISL_STATUS_PROPS_DOWN) self.ensure_isl_props(neo4j_connect, reverse, ISL_STATUS_PROPS_HALF_UP)
def test_time_update_on_isl_discovery(self): sw_alpha = make_datapath_id(1) sw_beta = make_datapath_id(2) isl_alpha_beta = model.InterSwitchLink( model.NetworkEndpoint(sw_alpha, 2), model.NetworkEndpoint(sw_beta, 2), None) self.assertTrue(make_switch_add(sw_alpha)) self.assertTrue(make_switch_add(sw_beta)) update_point_a = model.TimeProperty.now(milliseconds_precission=True) message = share.command(share.payload_isl_info(isl_alpha_beta)) message['timestamp'] = update_point_a.as_java_timestamp() self.assertTrue(messageclasses.MessageItem(**message).handle()) recovered = model.TimeProperty.new_from_java_timestamp( message['timestamp']) self.assertEquals(update_point_a.value, recovered.value) with neo4j_connect.begin() as tx: isl = isl_utils.fetch(tx, isl_alpha_beta) neo4j_connect.pull(isl) db_ctime = model.TimeProperty.new_from_db(isl['time_create']) self.assertEqual(update_point_a.value, db_ctime.value) db_mtime = model.TimeProperty.new_from_db(isl['time_modify']) self.assertEqual(update_point_a.value, db_mtime.value) # one more update update_point_b = model.TimeProperty.now(milliseconds_precission=True) self.assertNotEqual(update_point_a.value, update_point_b.value) message['timestamp'] = update_point_b.as_java_timestamp() self.assertTrue(messageclasses.MessageItem(**message).handle()) with neo4j_connect.begin() as tx: isl = isl_utils.fetch(tx, isl_alpha_beta) neo4j_connect.pull(isl) db_ctime = model.TimeProperty.new_from_db(isl['time_create']) self.assertEqual(update_point_a.value, db_ctime.value) db_mtime = model.TimeProperty.new_from_db(isl['time_modify']) self.assertEqual(update_point_b.value, db_mtime.value)
def test_isl_without_life_cycle_fields(self): sw_alpha = share.make_datapath_id(1) sw_beta = share.make_datapath_id(2) isl_alpha_beta = model.InterSwitchLink( model.IslPathNode(sw_alpha, 2), model.IslPathNode(sw_beta, 2), None) self.assertTrue(make_switch_add(sw_alpha)) self.assertTrue(make_switch_add(sw_beta)) self.assertTrue(share.feed_isl_discovery(isl_alpha_beta)) with neo4j_connect.begin() as tx: neo4j_connect.pull(isl_utils.fetch(tx, isl_alpha_beta)) isl_utils.set_props( tx, isl_alpha_beta, {'time_create': None, 'time_modify': None}) self.assertTrue(share.feed_isl_discovery(isl_alpha_beta))
class Abstract(share.AbstractTest): endpoint_alpha = model.NetworkEndpoint(share.make_datapath_id(1), 4) endpoint_beta = model.NetworkEndpoint(share.make_datapath_id(2), 6) endpoint_gamma = model.NetworkEndpoint(share.make_datapath_id(3), 8) isl_alpha_beta = model.InterSwitchLink( model.IslPathNode(endpoint_alpha.dpid, endpoint_alpha.port), model.IslPathNode(endpoint_beta.dpid, endpoint_beta.port)) isl_beta_alpha = isl_alpha_beta.reversed() def setUp(self): super(Abstract, self).setUp() for isl in (self.isl_alpha_beta, self.isl_beta_alpha): isl_info = share.isl_info_payload(isl) command = share.command(isl_info) self.assertTrue(messageclasses.MessageItem(command).handle()) def _put(self, subject): request = share.link_props_request(subject) payload = share.link_props_put_payload(request) self.feed_service(share.command(payload)) return payload def _get_kafka_response(self, offset=0, expect_class=message_utils.MT_INFO): kafka_backlog = share.env.kafka_producer_stub.backlog self.assertTrue(offset < len(kafka_backlog)) kafka_record = kafka_backlog[offset] self.assertEqual(config.KAFKA_NORTHBOUND_TOPIC, kafka_record.topic) message = json.loads(kafka_record.payload) self.assertEqual(expect_class, message['clazz']) return message['payload']
def make_isl_pair(source, dest): forward = model.InterSwitchLink(source, dest, None) share.exec_isl_discovery(forward) share.exec_isl_discovery(forward.reversed())
def test_isl_replug(self): sw_alpha = make_datapath_id(1) sw_beta = make_datapath_id(2) sw_gamma = make_datapath_id(3) sw_delta = make_datapath_id(4) isl_alpha_beta = model.InterSwitchLink( model.NetworkEndpoint(sw_alpha, 2), model.NetworkEndpoint(sw_beta, 2), None) isl_beta_alpha = isl_alpha_beta.reversed() isl_beta_gamma = model.InterSwitchLink( model.NetworkEndpoint(sw_beta, 2), model.NetworkEndpoint(sw_gamma, 3), None) isl_gamma_beta = isl_beta_gamma.reversed() isl_gamma_delta = model.InterSwitchLink( model.NetworkEndpoint(sw_gamma, 3), model.NetworkEndpoint(sw_delta, 3), None) isl_delta_gamma = isl_gamma_delta.reversed() for dpid in sw_alpha, sw_beta, sw_gamma, sw_delta: self.assertTrue(make_switch_add(dpid)) self.assertTrue(share.exec_isl_discovery(isl_alpha_beta)) self.assertTrue(share.exec_isl_discovery(isl_beta_alpha)) self.assertTrue(share.exec_isl_discovery(isl_gamma_delta)) self.assertTrue(share.exec_isl_discovery(isl_delta_gamma)) self.ensure_isl_props(neo4j_connect, isl_alpha_beta, ISL_STATUS_PROPS_UP) self.ensure_isl_props(neo4j_connect, isl_beta_alpha, ISL_STATUS_PROPS_UP) self.ensure_isl_props(neo4j_connect, isl_gamma_delta, ISL_STATUS_PROPS_UP) self.ensure_isl_props(neo4j_connect, isl_delta_gamma, ISL_STATUS_PROPS_UP) self.assertRaises(exc.DBRecordNotFound, isl_utils.fetch, neo4j_connect, isl_beta_gamma) self.assertRaises(exc.DBRecordNotFound, isl_utils.fetch, neo4j_connect, isl_gamma_beta) # replug self.assertTrue(share.exec_isl_discovery(isl_beta_gamma)) # alpha <-> beta is down self.ensure_isl_props(neo4j_connect, isl_alpha_beta, ISL_STATUS_PROPS_HALF_UP) self.ensure_isl_props(neo4j_connect, isl_beta_alpha, ISL_STATUS_PROPS_DOWN) # gamma -> delta is down self.ensure_isl_props(neo4j_connect, isl_gamma_delta, ISL_STATUS_PROPS_DOWN) self.ensure_isl_props(neo4j_connect, isl_delta_gamma, ISL_STATUS_PROPS_HALF_UP) # beta <-> gamma is half up self.ensure_isl_props(neo4j_connect, isl_beta_gamma, ISL_STATUS_PROPS_HALF_UP) self.ensure_isl_props(neo4j_connect, isl_gamma_beta, ISL_STATUS_PROPS_DOWN) self.assertTrue(share.exec_isl_discovery(isl_gamma_beta)) # alpha <-> beta is down self.ensure_isl_props(neo4j_connect, isl_alpha_beta, ISL_STATUS_PROPS_HALF_UP) self.ensure_isl_props(neo4j_connect, isl_beta_alpha, ISL_STATUS_PROPS_DOWN) # gamma -> delta is down self.ensure_isl_props(neo4j_connect, isl_gamma_delta, ISL_STATUS_PROPS_DOWN) self.ensure_isl_props(neo4j_connect, isl_delta_gamma, ISL_STATUS_PROPS_HALF_UP) # beta <-> gamma is up self.ensure_isl_props(neo4j_connect, isl_beta_gamma, ISL_STATUS_PROPS_UP) self.ensure_isl_props(neo4j_connect, isl_gamma_beta, ISL_STATUS_PROPS_UP)