X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=neutron-ovsdb%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fgroupbasedpolicy%2Fneutron%2Fovsdb%2Futil%2FEndpointHelper.java;h=979c11717fbfba6ef333ae53af28aa7a9f32bff8;hb=02dd576a2ff7d7a8c304bd74a239c150be1ddd2b;hp=886a8471b2d11b83ac852f39e7fe2d897fc10e1c;hpb=21137890551eb95e0f45280e6dca8e6636838276;p=groupbasedpolicy.git diff --git a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/EndpointHelper.java b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/EndpointHelper.java old mode 100644 new mode 100755 index 886a8471b..979c11717 --- a/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/EndpointHelper.java +++ b/neutron-ovsdb/src/main/java/org/opendaylight/groupbasedpolicy/neutron/ovsdb/util/EndpointHelper.java @@ -7,172 +7,73 @@ */ package org.opendaylight.groupbasedpolicy.neutron.ovsdb.util; -import static org.opendaylight.groupbasedpolicy.neutron.ovsdb.util.DataStore.readFromDs; +import static org.opendaylight.groupbasedpolicy.util.DataStoreHelper.readFromDs; +import static org.opendaylight.groupbasedpolicy.util.IidFactory.endpointIid; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; +import com.google.common.base.Optional; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.Name; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.Endpoints; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.UnregisterEndpointInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.UnregisterEndpointInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3AddressBuilder; +import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; +import org.opendaylight.groupbasedpolicy.util.IidFactory; 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.EndpointBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.EndpointKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L2; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L2Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L3; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.unregister.endpoint.input.L3Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextInput; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextInputBuilder; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.common.RpcResult; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContextBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableList; public class EndpointHelper { - private static final Logger LOG = LoggerFactory.getLogger(EndpointHelper.class); /** * Look up the {@link Endpoint} from the Endpoint Registry. * * @param epKey The {@link EndpointKey} to look up - * @param dataBroker The {@link DataBroker} to use for the transaction + * @param transaction The {@link ReadOnlyTransaction} * @return The corresponding {@link Endpoint}, null if not found */ - public static Endpoint lookupEndpoint(EndpointKey epKey, DataBroker dataBroker) { - InstanceIdentifier iid = InstanceIdentifier - .builder(Endpoints.class) - .child(Endpoint.class, epKey).build(); + public static Endpoint lookupEndpoint(EndpointKey epKey, ReadOnlyTransaction transaction) { - ReadWriteTransaction transaction = dataBroker.newReadWriteTransaction(); - Optional optionalEp = readFromDs(LogicalDatastoreType.OPERATIONAL, iid, transaction ); + Optional optionalEp = + readFromDs(LogicalDatastoreType.OPERATIONAL, endpointIid(epKey.getL2Context(), epKey.getMacAddress()), + transaction); if (optionalEp.isPresent()) { return optionalEp.get(); } - return null; } /** - * Update a {@link Endpoint} in the Endpoint Repository with the - * location information and port name in the OfOverlay augmentation. - * It looks up the {@link EndpointKey} in a data store maintained by the - * neutron-mapper, and uses that to look up the {@link Endpoint}, and - * then uses RPCs to delete then add the updated {@link Endpoint} + * Updates an {@link Endpoint} location based on OVSDB Termination point notification. + * Note this updates the datastore directly. It does not use the Endpoint RPC, as this has + * unfortunate side-effects on EndpointL3 augmentations. * - * @param epKey The {@link EndpointKey} - * @param nodeIdString - * @param ovsdbBridge + * @param endpoint the network endpoint + * @param nodeIdString the string representation of the inventory NodeId + * @param nodeConnectorIdString the string representation of the inventory NodeConnectorId + * @param rwTx a reference to ReadWriteTransaction object */ - public static void updateEndpointWithLocation(Endpoint endpoint, String nodeIdString, - String nodeConnectorIdString, String portName, EndpointService endpointService) { - EndpointBuilder epBuilder = new EndpointBuilder(endpoint); - UnregisterEndpointInput unregisterEpRpcInput = createUnregisterEndpointInput(endpoint); - RegisterEndpointInput registerEpRpcInput = - createRegisterEndpointInput(epBuilder.build(), - portName, - nodeIdString, - nodeConnectorIdString); - try { - RpcResult rpcResult = endpointService.unregisterEndpoint(unregisterEpRpcInput).get(); - if (!rpcResult.isSuccessful()) { - LOG.warn("Illegal state - RPC unregisterEndpoint failed. Input of RPC: {}", unregisterEpRpcInput); - return; - } - rpcResult = endpointService.registerEndpoint(registerEpRpcInput).get(); - if (!rpcResult.isSuccessful()) { - LOG.warn("Illegal state - RPC registerEndpoint failed. Input of RPC: {}", registerEpRpcInput); - return; - } - } catch (InterruptedException | ExecutionException e) { - LOG.error("addPort - RPC invocation failed.", e); - return; - } + public static void updateEndpointWithLocation(Endpoint endpoint, String nodeIdString, String nodeConnectorIdString, + ReadWriteTransaction rwTx) { + NodeId invNodeId = new NodeId(nodeIdString); + NodeConnectorId ncId = new NodeConnectorId(nodeConnectorIdString); + OfOverlayContext newOfOverlayCtx = + new OfOverlayContextBuilder().setNodeId(invNodeId).setNodeConnectorId(ncId).build(); + rwTx.merge(LogicalDatastoreType.OPERATIONAL, + IidFactory.endpointIid(endpoint.getKey()).augmentation(OfOverlayContext.class), newOfOverlayCtx); + DataStoreHelper.submitToDs(rwTx); } - /** - * Create the {@link UnregisterEndpointInput} state needed to remove - * the existing {@link Endpoint} from the Endpoint Registry. - * - * @param ep The {@link Endpoint} to remove from the registry - * @return The {@link UnregisterEndpointInput}, null if failure - */ - public static UnregisterEndpointInput createUnregisterEndpointInput(Endpoint ep) { - UnregisterEndpointInputBuilder inputBuilder = new UnregisterEndpointInputBuilder(); - L2 l2Ep = new L2Builder().setL2Context(ep.getL2Context()).setMacAddress(ep.getMacAddress()).build(); - inputBuilder.setL2(ImmutableList.of(l2Ep)); - // TODO Li msunal this has to be rewrite when OFOverlay renderer will support l3-endpoints. - // Endpoint probably will not have l3-addresses anymore, because L2 and L3 endpoints should - // be registered separately. - if (ep.getL3Address() != null && !ep.getL3Address().isEmpty()) { - List l3Eps = new ArrayList<>(); - for (L3Address ip : ep.getL3Address()) { - l3Eps.add(new L3Builder().setL3Context(ip.getL3Context()).setIpAddress(ip.getIpAddress()).build()); - } - inputBuilder.setL3(l3Eps); - } - return inputBuilder.build(); - } - - /** - * Create the updated {@link RegisterEndpointInput}, using the existing - * {@link Endpoint} and the new OfOverlay augmentation information (i.e. - * port name, NodeId, and NodeConnectorId). - * - * @param ep The existing {@link Endpoint} state - * @param portName The new port name in the OfOverlay augmentation - * @param nodeIdString The new NodeId in the OfOverlay augmentation - * @param nodeConnectorIdString The new NodeConnectorId in the OfOverlay augmentation - * @return The new {@link RegisterEndpointInput}, null if failure - */ - public static RegisterEndpointInput createRegisterEndpointInput(Endpoint ep, - String portName, String nodeIdString, String nodeConnectorIdString) { - - org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId invNodeId = - new org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId(nodeIdString); - org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId ncId = - new org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId(nodeConnectorIdString); - - RegisterEndpointInputBuilder inputBuilder = new RegisterEndpointInputBuilder().setL2Context( - ep.getL2Context()) - .setMacAddress(new MacAddress(ep.getMacAddress())) - .setTenant(new TenantId(ep.getTenant())) - .setEndpointGroups(ep.getEndpointGroups()) - .addAugmentation(OfOverlayContextInput.class, - new OfOverlayContextInputBuilder() - .setPortName(new Name(portName)) - .setNodeId(invNodeId) - .setNodeConnectorId(ncId) - .build()) - .setTimestamp(System.currentTimeMillis()); - - // TODO Li msunal this getting of just first IP has to be rewrite when OFOverlay renderer - // will support l3-endpoints. Then we will register L2 and L3 endpoints separately. - if (ep.getNetworkContainment() != null) { - inputBuilder.setNetworkContainment(new SubnetId(ep.getNetworkContainment())); - L3Address l3Address = new L3AddressBuilder() - .setIpAddress(ep.getL3Address().get(0).getIpAddress()) - .setL3Context(ep.getL3Address().get(0).getL3Context()) - .build(); - inputBuilder.setL3Address(ImmutableList.of(l3Address)); - } - return inputBuilder.build(); + public static void updateEndpointRemoveLocation(Endpoint endpoint, ReadWriteTransaction rwTx) { + EndpointBuilder epBuilder = new EndpointBuilder(endpoint); + Endpoint newEp = epBuilder.build(); + epBuilder.removeAugmentation(OfOverlayContext.class); + rwTx.put(LogicalDatastoreType.OPERATIONAL, IidFactory.endpointIid(newEp.getL2Context(), newEp.getMacAddress()), + newEp); + DataStoreHelper.submitToDs(rwTx); } }