@Test public void testGetActivePeerRowNoLocalIp() { Ip remoteIp = Ip.parse("2.2.2.2"); BgpPeerConfigId peerId = new BgpPeerConfigId("c1", "vrf1", remoteIp.toPrefix(), false); BgpActivePeerConfig peer = BgpActivePeerConfig.builder() .setPeerAddress(remoteIp) .setLocalAs(1L) .setRemoteAs(2L) .setIpv4UnicastAddressFamily(Ipv4UnicastAddressFamily.builder().build()) .build(); MutableValueGraph<BgpPeerConfigId, BgpSessionProperties> topology = ValueGraphBuilder.directed().allowsSelfLoops(false).build(); topology.addNode(peerId); Row row = getActivePeerRow(peerId, peer, ImmutableMap.of(), topology, topology); Row expected = Row.builder() .put(COL_ESTABLISHED_STATUS, BgpSessionStatus.NOT_COMPATIBLE) .put(COL_ADDRESS_FAMILIES, ImmutableSet.of()) .put(COL_LOCAL_INTERFACE, null) .put(COL_LOCAL_IP, null) .put(COL_LOCAL_AS, 1L) .put(COL_NODE, new Node("c1")) .put(COL_REMOTE_AS, LongSpace.of(2L).toString()) .put(COL_REMOTE_NODE, null) .put(COL_REMOTE_INTERFACE, null) .put(COL_REMOTE_IP, new SelfDescribingObject(Schema.IP, remoteIp)) .put(COL_SESSION_TYPE, SessionType.EBGP_SINGLEHOP) .put(COL_VRF, "vrf1") .build(); assertThat(row, equalTo(expected)); }
@Nonnull @VisibleForTesting static Row getActivePeerRow( BgpPeerConfigId activeId, BgpActivePeerConfig activePeer, Map<Ip, Map<String, Set<String>>> ipVrfOwners, ValueGraph<BgpPeerConfigId, BgpSessionProperties> configuredTopology, ValueGraph<BgpPeerConfigId, BgpSessionProperties> establishedTopology) { SessionType type = getSessionType(activePeer); BgpSessionStatus status = NOT_COMPATIBLE; Node remoteNode = null; Long localAs = activePeer.getLocalAs(); String remoteAs = activePeer.getRemoteAsns().toString(); Set<Type> addressFamilies = ImmutableSet.of(); if (establishedTopology.nodes().contains(activeId) && establishedTopology.outDegree(activeId) == 1) { status = ESTABLISHED; BgpPeerConfigId remoteId = establishedTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(establishedTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(establishedTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(establishedTopology, activeId, remoteId); } else if (getConfiguredStatus(activeId, activePeer, type, ipVrfOwners, configuredTopology) == UNIQUE_MATCH) { status = NOT_ESTABLISHED; BgpPeerConfigId remoteId = configuredTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(configuredTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(configuredTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(configuredTopology, activeId, remoteId); } return Row.builder(METADATA_MAP) .put(COL_ESTABLISHED_STATUS, status) .put(COL_ADDRESS_FAMILIES, addressFamilies) .put(COL_LOCAL_INTERFACE, null) .put(COL_LOCAL_AS, localAs) .put(COL_LOCAL_IP, activePeer.getLocalIp()) .put(COL_NODE, new Node(activeId.getHostname())) .put(COL_REMOTE_AS, remoteAs) .put(COL_REMOTE_NODE, remoteNode) .put(COL_REMOTE_INTERFACE, null) .put(COL_REMOTE_IP, new SelfDescribingObject(Schema.IP, activePeer.getPeerAddress())) .put(COL_SESSION_TYPE, getSessionType(activePeer)) .put(COL_VRF, activeId.getVrfName()) .build(); }
BgpSessionStatusAnswerer extends Answerer { @Nonnull @VisibleForTesting static Row getActivePeerRow( BgpPeerConfigId activeId, BgpActivePeerConfig activePeer, Map<Ip, Map<String, Set<String>>> ipVrfOwners, ValueGraph<BgpPeerConfigId, BgpSessionProperties> configuredTopology, ValueGraph<BgpPeerConfigId, BgpSessionProperties> establishedTopology) { SessionType type = getSessionType(activePeer); BgpSessionStatus status = NOT_COMPATIBLE; Node remoteNode = null; Long localAs = activePeer.getLocalAs(); String remoteAs = activePeer.getRemoteAsns().toString(); Set<Type> addressFamilies = ImmutableSet.of(); if (establishedTopology.nodes().contains(activeId) && establishedTopology.outDegree(activeId) == 1) { status = ESTABLISHED; BgpPeerConfigId remoteId = establishedTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(establishedTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(establishedTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(establishedTopology, activeId, remoteId); } else if (getConfiguredStatus(activeId, activePeer, type, ipVrfOwners, configuredTopology) == UNIQUE_MATCH) { status = NOT_ESTABLISHED; BgpPeerConfigId remoteId = configuredTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(configuredTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(configuredTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(configuredTopology, activeId, remoteId); } return Row.builder(METADATA_MAP) .put(COL_ESTABLISHED_STATUS, status) .put(COL_ADDRESS_FAMILIES, addressFamilies) .put(COL_LOCAL_INTERFACE, null) .put(COL_LOCAL_AS, localAs) .put(COL_LOCAL_IP, activePeer.getLocalIp()) .put(COL_NODE, new Node(activeId.getHostname())) .put(COL_REMOTE_AS, remoteAs) .put(COL_REMOTE_NODE, remoteNode) .put(COL_REMOTE_INTERFACE, null) .put(COL_REMOTE_IP, new SelfDescribingObject(Schema.IP, activePeer.getPeerAddress())) .put(COL_SESSION_TYPE, getSessionType(activePeer)) .put(COL_VRF, activeId.getVrfName()) .build(); } }
BgpSessionStatusAnswerer extends Answerer { @Nonnull @VisibleForTesting static Row getActivePeerRow( BgpPeerConfigId activeId, BgpActivePeerConfig activePeer, Map<Ip, Map<String, Set<String>>> ipVrfOwners, ValueGraph<BgpPeerConfigId, BgpSessionProperties> configuredTopology, ValueGraph<BgpPeerConfigId, BgpSessionProperties> establishedTopology) { SessionType type = getSessionType(activePeer); BgpSessionStatus status = NOT_COMPATIBLE; Node remoteNode = null; Long localAs = activePeer.getLocalAs(); String remoteAs = activePeer.getRemoteAsns().toString(); Set<Type> addressFamilies = ImmutableSet.of(); if (establishedTopology.nodes().contains(activeId) && establishedTopology.outDegree(activeId) == 1) { status = ESTABLISHED; BgpPeerConfigId remoteId = establishedTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(establishedTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(establishedTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(establishedTopology, activeId, remoteId); } else if (getConfiguredStatus(activeId, activePeer, type, ipVrfOwners, configuredTopology) == UNIQUE_MATCH) { status = NOT_ESTABLISHED; BgpPeerConfigId remoteId = configuredTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(configuredTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(configuredTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(configuredTopology, activeId, remoteId); } return Row.builder(METADATA_MAP) .put(COL_ESTABLISHED_STATUS, status) .put(COL_ADDRESS_FAMILIES, addressFamilies) .put(COL_LOCAL_INTERFACE, null) .put(COL_LOCAL_AS, localAs) .put(COL_LOCAL_IP, activePeer.getLocalIp()) .put(COL_NODE, new Node(activeId.getHostname())) .put(COL_REMOTE_AS, remoteAs) .put(COL_REMOTE_NODE, remoteNode) .put(COL_REMOTE_INTERFACE, null) .put(COL_REMOTE_IP, new SelfDescribingObject(Schema.IP, activePeer.getPeerAddress())) .put(COL_SESSION_TYPE, getSessionType(activePeer)) .put(COL_VRF, activeId.getVrfName()) .build(); } BgpSessionStatusAnswerer(Question question, IBatfish batfish); }
BgpSessionStatusAnswerer extends Answerer { @Nonnull @VisibleForTesting static Row getActivePeerRow( BgpPeerConfigId activeId, BgpActivePeerConfig activePeer, Map<Ip, Map<String, Set<String>>> ipVrfOwners, ValueGraph<BgpPeerConfigId, BgpSessionProperties> configuredTopology, ValueGraph<BgpPeerConfigId, BgpSessionProperties> establishedTopology) { SessionType type = getSessionType(activePeer); BgpSessionStatus status = NOT_COMPATIBLE; Node remoteNode = null; Long localAs = activePeer.getLocalAs(); String remoteAs = activePeer.getRemoteAsns().toString(); Set<Type> addressFamilies = ImmutableSet.of(); if (establishedTopology.nodes().contains(activeId) && establishedTopology.outDegree(activeId) == 1) { status = ESTABLISHED; BgpPeerConfigId remoteId = establishedTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(establishedTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(establishedTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(establishedTopology, activeId, remoteId); } else if (getConfiguredStatus(activeId, activePeer, type, ipVrfOwners, configuredTopology) == UNIQUE_MATCH) { status = NOT_ESTABLISHED; BgpPeerConfigId remoteId = configuredTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(configuredTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(configuredTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(configuredTopology, activeId, remoteId); } return Row.builder(METADATA_MAP) .put(COL_ESTABLISHED_STATUS, status) .put(COL_ADDRESS_FAMILIES, addressFamilies) .put(COL_LOCAL_INTERFACE, null) .put(COL_LOCAL_AS, localAs) .put(COL_LOCAL_IP, activePeer.getLocalIp()) .put(COL_NODE, new Node(activeId.getHostname())) .put(COL_REMOTE_AS, remoteAs) .put(COL_REMOTE_NODE, remoteNode) .put(COL_REMOTE_INTERFACE, null) .put(COL_REMOTE_IP, new SelfDescribingObject(Schema.IP, activePeer.getPeerAddress())) .put(COL_SESSION_TYPE, getSessionType(activePeer)) .put(COL_VRF, activeId.getVrfName()) .build(); } BgpSessionStatusAnswerer(Question question, IBatfish batfish); @Override AnswerElement answer(NetworkSnapshot snapshot); }
BgpSessionStatusAnswerer extends Answerer { @Nonnull @VisibleForTesting static Row getActivePeerRow( BgpPeerConfigId activeId, BgpActivePeerConfig activePeer, Map<Ip, Map<String, Set<String>>> ipVrfOwners, ValueGraph<BgpPeerConfigId, BgpSessionProperties> configuredTopology, ValueGraph<BgpPeerConfigId, BgpSessionProperties> establishedTopology) { SessionType type = getSessionType(activePeer); BgpSessionStatus status = NOT_COMPATIBLE; Node remoteNode = null; Long localAs = activePeer.getLocalAs(); String remoteAs = activePeer.getRemoteAsns().toString(); Set<Type> addressFamilies = ImmutableSet.of(); if (establishedTopology.nodes().contains(activeId) && establishedTopology.outDegree(activeId) == 1) { status = ESTABLISHED; BgpPeerConfigId remoteId = establishedTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(establishedTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(establishedTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(establishedTopology, activeId, remoteId); } else if (getConfiguredStatus(activeId, activePeer, type, ipVrfOwners, configuredTopology) == UNIQUE_MATCH) { status = NOT_ESTABLISHED; BgpPeerConfigId remoteId = configuredTopology.adjacentNodes(activeId).iterator().next(); String remoteNodeName = remoteId.getHostname(); remoteNode = new Node(remoteNodeName); localAs = getLocalAs(configuredTopology, activeId, remoteId, activePeer); remoteAs = getRemoteAs(configuredTopology, activeId, remoteId, activePeer); addressFamilies = getAddressFamilies(configuredTopology, activeId, remoteId); } return Row.builder(METADATA_MAP) .put(COL_ESTABLISHED_STATUS, status) .put(COL_ADDRESS_FAMILIES, addressFamilies) .put(COL_LOCAL_INTERFACE, null) .put(COL_LOCAL_AS, localAs) .put(COL_LOCAL_IP, activePeer.getLocalIp()) .put(COL_NODE, new Node(activeId.getHostname())) .put(COL_REMOTE_AS, remoteAs) .put(COL_REMOTE_NODE, remoteNode) .put(COL_REMOTE_INTERFACE, null) .put(COL_REMOTE_IP, new SelfDescribingObject(Schema.IP, activePeer.getPeerAddress())) .put(COL_SESSION_TYPE, getSessionType(activePeer)) .put(COL_VRF, activeId.getVrfName()) .build(); } BgpSessionStatusAnswerer(Question question, IBatfish batfish); @Override AnswerElement answer(NetworkSnapshot snapshot);  }