import java.math.BigInteger;
import java.util.Collections;
import java.util.HashSet;
-import java.util.Map;
import java.util.Set;
+import org.opendaylight.groupbasedpolicy.dto.EgKey;
+import org.opendaylight.groupbasedpolicy.dto.IndexedTenant;
import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfContext;
-import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager.FlowMap;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.OfWriter;
+import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.endpoint.EndpointManager;
import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow.OrdinalFactory.EndpointFwdCtxOrdinals;
-import org.opendaylight.groupbasedpolicy.resolver.EgKey;
-import org.opendaylight.groupbasedpolicy.resolver.IndexedTenant;
-import org.opendaylight.groupbasedpolicy.resolver.PolicyInfo;
import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointL3;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.EndpointLocation.LocationType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
}
@Override
- public void sync(NodeId nodeId, PolicyInfo policyInfo, FlowMap flowMap) throws Exception {
+ public void sync(NodeId nodeId, OfWriter ofWriter) throws Exception {
- flowMap.writeFlow(nodeId, TABLE_ID, dropFlow(Integer.valueOf(1), null, TABLE_ID));
+ ofWriter.writeFlow(nodeId, TABLE_ID, dropFlow(Integer.valueOf(1), null, TABLE_ID));
// Handle case where packets from from External
- Map<EndpointKey, EndpointL3> l3EpWithNatByL2Key = ctx.getEndpointManager().getL3EpWithNatByL2Key();
for (Endpoint ep : ctx.getEndpointManager().getEndpointsForNode(nodeId)) {
- OfOverlayContext ofc = ep.getAugmentation(OfOverlayContext.class);
-
- IndexedTenant tenant = ctx.getPolicyResolver().getTenant(ep.getTenant());
+ IndexedTenant tenant = ctx.getTenant(ep.getTenant());
if (tenant == null)
continue;
- EndpointFwdCtxOrdinals epFwdCtxOrds = OrdinalFactory.getEndpointFwdCtxOrdinals(ctx, policyInfo, ep);
- EgKey sepg = new EgKey(ep.getTenant(), ep.getEndpointGroup());
+ EndpointFwdCtxOrdinals epFwdCtxOrds = OrdinalFactory.getEndpointFwdCtxOrdinals(ctx, ep);
+ if (epFwdCtxOrds == null) {
+ LOG.debug("getEndpointFwdCtxOrdinals is null for EP {}", ep);
+ continue;
+ }
- createRemoteTunnels(flowMap, nodeId, ep, policyInfo, epFwdCtxOrds);
+ createRemoteTunnels(ofWriter, nodeId, ep, epFwdCtxOrds);
if (ep.getTenant() == null || (ep.getEndpointGroup() == null && ep.getEndpointGroups() == null)) {
continue;
}
+ OfOverlayContext ofc = ep.getAugmentation(OfOverlayContext.class);
if (ofc != null && ofc.getNodeConnectorId() != null
- && (ofc.getLocationType() == null || LocationType.Internal.equals(ofc.getLocationType()))) {
+ && (EndpointManager.isInternal(ep, ctx.getTenant(ep.getTenant()).getExternalImplicitGroups()))) {
/**
* Sync the local EP information.
*/
- syncEP(flowMap, nodeId, ep, ofc.getNodeConnectorId(), epFwdCtxOrds);
-
+ syncEP(ofWriter, nodeId, ep, ofc.getNodeConnectorId(), epFwdCtxOrds);
}
-// if (l3EpWithNatByL2Key.containsKey(ep.getKey())) {
-// Set<NodeConnectorId> external = ctx.getSwitchManager().getExternalPorts(nodeId);
-// for (NodeConnectorId ncId : external) {
-// // TODO Bug 3546 - Difficult: External port is unrelated to Tenant, L3C, L2BD..
-// syncEP(flowMap, nodeId, ep, ncId, epFwdCtxOrds);
-// }
-// }
}
}
- private void createRemoteTunnels(FlowMap flowMap, NodeId nodeId, Endpoint ep, PolicyInfo policyInfo,
- EndpointFwdCtxOrdinals epFwdCtxOrds) throws Exception {
+ private void createRemoteTunnels(OfWriter ofWriter, NodeId nodeId, Endpoint ep, EndpointFwdCtxOrdinals epFwdCtxOrds)
+ throws Exception {
Set<EgKey> epgs = new HashSet<>();
// Get EPGs and add to Set to remove duplicates
// Create tunnels on remote Nodes that may talk to us.
for (EgKey epg : epgs) {
- Set<EgKey> peers = Sets.union(Collections.singleton(epg), policyInfo.getPeers(epg));
+ Set<EgKey> peers = Sets.union(Collections.singleton(epg), ctx.getCurrentPolicy().getPeers(epg));
for (EgKey peer : peers) {
for (NodeId remoteNodeId : ctx.getEndpointManager().getNodesForGroup(peer)) {
nodeId.getValue(), remoteNodeId.getValue());
continue;
}
- flowMap.writeFlow(remoteNodeId, TABLE_ID, createTunnelFlow(tunPort, epFwdCtxOrds));
- flowMap.writeFlow(remoteNodeId, TABLE_ID, createBroadcastFlow(tunPort, epFwdCtxOrds));
+ ofWriter.writeFlow(remoteNodeId, TABLE_ID, createTunnelFlow(tunPort, epFwdCtxOrds));
+ ofWriter.writeFlow(remoteNodeId, TABLE_ID, createBroadcastFlow(tunPort, epFwdCtxOrds));
}
}
}
return flowb.build();
}
- private void syncEP(FlowMap flowMap, NodeId nodeId, Endpoint ep, NodeConnectorId ncId, EndpointFwdCtxOrdinals epFwdCtxOrds) throws Exception {
+ private void syncEP(OfWriter ofWriter, NodeId nodeId, Endpoint ep, NodeConnectorId ncId, EndpointFwdCtxOrdinals epFwdCtxOrds) throws Exception {
// TODO alagalah Li/Be: We should also match on EndpointL3 with the appropriate
// network containment. This would solve a lot of problems and prepare for EndpointL3 RPC.
.setInstructions(
instructions(applyActionIns(segReg, scgReg, bdReg, fdReg, vrfReg,tunIdAction),
gotoTableIns(ctx.getPolicyManager().getTABLEID_DESTINATION_MAPPER())));
- flowMap.writeFlow(nodeId, TABLE_ID, flowb.build());
+ ofWriter.writeFlow(nodeId, TABLE_ID, flowb.build());
}
}