+ Subnet routerPortSubnet = potentialRouterPortSubnet.get();
+ ContextId l2BdId = new ContextId(routerPortSubnet.getNetworkId().getValue());
+ ForwardingContext l2Bd = new ForwardingContextBuilder().setContextId(l2BdId)
+ .setContextType(MappingUtils.L2_BRDIGE_DOMAIN)
+ .setParent(MappingUtils.createParent(routerL3Context, MappingUtils.L3_CONTEXT))
+ .build();
+ rwTx.merge(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd, true);
+ // set virtual router IP for subnet
+ NetworkDomain subnetDomain = NeutronSubnetAware.createSubnet(
+ routerPortSubnet, portIpWithSubnet.getIpAddress());
+ rwTx.merge(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.subnetIid(tenantId, subnetDomain.getNetworkDomainId()), subnetDomain);
+
+ // does the same for tenant forwarding domains
+ processTenantForwarding(routerPortSubnet, routerL3Context, portIpWithSubnet, tenantId, rwTx);
+
+ DataStoreHelper.submitToDs(rwTx);
+ } else if (PortUtils.isDhcpPort(port)) {
+ // process as normal port but put it to DHCP group
+ LOG.trace("Port is DHCP port: {}", port.getUuid().getValue());
+ Optional<FixedIps> firstFixedIps = PortUtils.resolveFirstFixedIps(port);
+ if (!firstFixedIps.isPresent()) {
+ LOG.warn("DHCP port does not have an IP address. {}", port);
+ return;
+ }
+ FixedIps ipWithSubnet = firstFixedIps.get();
+ NetworkDomainId networkContainment = new NetworkDomainId(ipWithSubnet.getSubnetId().getValue());
+ List<EndpointGroupId> epgsFromSecGroups = resolveEpgIdsFromSecGroups(port.getSecurityGroups());
+ epgsFromSecGroups.add(NetworkService.EPG_ID);
+
+ // BUILD BASE ENDPOINT
+ AddressEndpointRegBuilder l2BaseEp = createBasicMacAddrEpInputBuilder(port, networkContainment,
+ epgsFromSecGroups);
+ AddressEndpointRegBuilder l3BaseEp = createBasicL3AddrEpInputBuilder(port, networkContainment,
+ epgsFromSecGroups, neutron);
+ setParentChildRelationshipForEndpoints(l3BaseEp, l2BaseEp);
+
+ // BUILD ENDPOINT
+ org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInputBuilder epInBuilder = createEndpointRegFromPort(
+ port, ipWithSubnet, networkContainment, epgsFromSecGroups, neutron);
+
+ ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
+ registerBaseEndpointAndStoreMapping(
+ ImmutableList.of(l2BaseEp.build(), l3BaseEp.build()), port, rwTx, addBaseEpMapping);
+ registerEndpointAndStoreMapping(epInBuilder.build(), port, rwTx);
+ DataStoreHelper.submitToDs(rwTx);
+ } else if (PortUtils.isNormalPort(port)) {
+ LOG.trace("Port is normal port: {}", port.getUuid().getValue());
+ org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInputBuilder epInBuilder = null;
+ AddressEndpointRegBuilder l2BaseEp;
+ AddressEndpointRegBuilder l3BaseEp = null;
+ Optional<FixedIps> firstFixedIps = PortUtils.resolveFirstFixedIps(port);
+ List<EndpointGroupId> epgsFromSecGroups = resolveEpgIdsFromSecGroups(port.getSecurityGroups());
+ epgsFromSecGroups.add(NetworkClient.EPG_ID);
+ if (firstFixedIps.isPresent()) {
+ // endpoint has only one network containment therefore only first IP is used
+ FixedIps ipWithSubnet = firstFixedIps.get();
+ NetworkDomainId containment = new NetworkDomainId(ipWithSubnet.getSubnetId().getValue());
+ epInBuilder = createEndpointRegFromPort(port, ipWithSubnet, containment, epgsFromSecGroups, neutron);
+ l2BaseEp = createBasicMacAddrEpInputBuilder(port,
+ containment, epgsFromSecGroups);
+ l3BaseEp = createBasicL3AddrEpInputBuilder(port, containment, epgsFromSecGroups, neutron);
+ setParentChildRelationshipForEndpoints(l3BaseEp, l2BaseEp);
+ } else {
+ NetworkDomainId containment = new NetworkDomainId(port.getNetworkId().getValue());
+ epInBuilder = createEndpointRegFromPort(port, null, containment, epgsFromSecGroups, neutron);
+ l2BaseEp = createBasicMacAddrEpInputBuilder(port, containment, epgsFromSecGroups);
+ }
+ List<AddressEndpointReg> baseEpRegs = new ArrayList<>();
+ baseEpRegs.add(l2BaseEp.build());
+ if (l3BaseEp != null) {
+ baseEpRegs.add(l3BaseEp.build());
+ }
+ ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction();
+ registerBaseEndpointAndStoreMapping(baseEpRegs, port, rwTx, addBaseEpMapping);
+ registerEndpointAndStoreMapping(epInBuilder.build(), port, rwTx);
+ DataStoreHelper.submitToDs(rwTx);
+ } else if (PortUtils.isRouterGatewayPort(port)) {
+ // do nothing because actual trigger is attaching of port to router
+ LOG.trace("Port is router gateway port: {}", port.getUuid().getValue());
+ } else if (PortUtils.isFloatingIpPort(port)) {
+ // do nothing because trigger is floating IP
+ LOG.trace("Port is floating ip: {}", port.getUuid().getValue());
+ } else {
+ LOG.warn("Unknown port: {}", port);