From 8425f614f3570b735b34d161ec6305fbce2fc117 Mon Sep 17 00:00:00 2001 From: HemaTG Date: Tue, 12 Jan 2016 12:14:58 +0530 Subject: [PATCH] Support for CreatingTerminatingService RPC Change-Id: I77ef819f6c89a4b50f7bb7fd4e291833e9410ba9 Signed-off-by: HemaTG --- .../vpnservice/itm/globals/ITMConstants.java | 5 +- itm/itm-api/src/main/yang/itm-rpc.yang | 32 ++++- .../vpnservice/itm/impl/ItmProvider.java | 2 +- .../itm/rpc/ItmManagerRpcService.java | 120 +++++++++++++++++- 4 files changed, 154 insertions(+), 5 deletions(-) diff --git a/itm/itm-api/src/main/java/org/opendaylight/vpnservice/itm/globals/ITMConstants.java b/itm/itm-api/src/main/java/org/opendaylight/vpnservice/itm/globals/ITMConstants.java index d60c72b7..11c62041 100644 --- a/itm/itm-api/src/main/java/org/opendaylight/vpnservice/itm/globals/ITMConstants.java +++ b/itm/itm-api/src/main/java/org/opendaylight/vpnservice/itm/globals/ITMConstants.java @@ -7,7 +7,10 @@ */ package org.opendaylight.vpnservice.itm.globals; +import java.math.BigInteger; + public class ITMConstants{ - + public static final short INTERNAL_TUNNEL_TABLE = 22; + public static final BigInteger COOKIE_ITM = new BigInteger("9000000", 16); } diff --git a/itm/itm-api/src/main/yang/itm-rpc.yang b/itm/itm-api/src/main/yang/itm-rpc.yang index 83d52093..69e1ea9b 100644 --- a/itm/itm-api/src/main/yang/itm-rpc.yang +++ b/itm/itm-api/src/main/yang/itm-rpc.yang @@ -19,7 +19,11 @@ module itm-rpc { prefix odlif; revision-date "2015-03-31"; } - + + import opendaylight-action-types {prefix action;revision-date "2013-11-12";} + import opendaylight-flow-types {prefix offlow;revision-date "2013-10-26";} + + revision "2015-12-17" { description "ODL Specific Itm Manager Rpcs Module"; } @@ -120,4 +124,30 @@ module itm-rpc { } } } + + rpc create-terminating-service-actions { + description "used for programming the terminating service actions"; + input { + leaf dpn-id { + type uint64; + } + leaf service-id { + type uint16; + } + uses offlow:instruction-list; + } + } + + rpc remove-terminating-service-actions { + description "used for removing the terminating service actions"; + input { + leaf dpn-id { + type uint64; + } + leaf service-id { + type uint16; + } + } + } + } \ No newline at end of file diff --git a/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/impl/ItmProvider.java b/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/impl/ItmProvider.java index cba0777e..b805a629 100644 --- a/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/impl/ItmProvider.java +++ b/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/impl/ItmProvider.java @@ -62,7 +62,7 @@ public class ItmProvider implements BindingAwareProvider, AutoCloseable, IITMPro tzChangeListener = new TransportZoneListener(dataBroker) ; itmRpcService = new ItmManagerRpcService(dataBroker); final BindingAwareBroker.RpcRegistration rpcRegistration = getRpcProviderRegistry().addRpcImplementation(ItmRpcService.class, itmRpcService); - + itmRpcService.setMdsalManager(mdsalManager); itmManager.setMdsalManager(mdsalManager); itmManager.setNotificationPublishService(notificationPublishService); itmManager.setMdsalManager(mdsalManager); diff --git a/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/rpc/ItmManagerRpcService.java b/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/rpc/ItmManagerRpcService.java index c3adcc40..70d8f82c 100644 --- a/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/rpc/ItmManagerRpcService.java +++ b/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/rpc/ItmManagerRpcService.java @@ -8,15 +8,21 @@ package org.opendaylight.vpnservice.itm.rpc; import java.math.BigInteger; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.opendaylight.controller.md.sal.binding.api.DataBroker; +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.instruction.list.Instruction; import org.opendaylight.vpnservice.itm.confighelpers.ItmExternalTunnelAddWorker; +import org.opendaylight.vpnservice.itm.globals.ITMConstants; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.vpnservice.itm.impl.ItmUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.ExternalTunnelList; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.TunnelList; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.dpn.endpoints.DPNTEPsInfo; @@ -26,6 +32,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.tunnel.list.TunnelKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.AddExternalTunnelEndpointInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.BuildExternalTunnelFromDpnsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.CreateTerminatingServiceActionsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetExternalTunnelInterfaceNameInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetExternalTunnelInterfaceNameOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetExternalTunnelInterfaceNameOutputBuilder; @@ -35,6 +42,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev1512 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.ItmRpcService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.RemoveExternalTunnelEndpointInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.RemoveExternalTunnelFromDpnsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.RemoveTerminatingServiceActionsInput; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -45,6 +53,12 @@ import com.google.common.util.concurrent.SettableFuture; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; +import org.opendaylight.vpnservice.mdsalutil.MDSALUtil; +import org.opendaylight.vpnservice.mdsalutil.MatchFieldType; +import org.opendaylight.vpnservice.mdsalutil.MatchInfo; +import org.opendaylight.vpnservice.mdsalutil.MetaDataUtil; +import org.opendaylight.vpnservice.mdsalutil.ActionInfo; +import org.opendaylight.vpnservice.mdsalutil.ActionType; import com.google.common.base.Optional; @@ -54,10 +68,15 @@ public class ItmManagerRpcService implements ItmRpcService { private static final Logger LOG = LoggerFactory.getLogger(ItmManagerRpcService.class); DataBroker dataBroker; + private IMdsalApiManager mdsalManager; public ItmManagerRpcService(DataBroker dataBroker) { this.dataBroker = dataBroker; } - + + public void setMdsalManager(IMdsalApiManager mdsalManager) { + this.mdsalManager = mdsalManager; + } + @Override public Future> getTunnelInterfaceName(GetTunnelInterfaceNameInput input) { RpcResultBuilder resultBld = null; @@ -164,6 +183,103 @@ public class ItmManagerRpcService implements ItmRpcService { } return Futures.immediateFuture(resultBld.build()); - } + + @Override + public Future> createTerminatingServiceActions(final CreateTerminatingServiceActionsInput input) { + LOG.info("create terminatingServiceAction on DpnId = {} for service id {} and instructions {}", input.getDpnId() , input.getServiceId(), input.getInstruction()); + final SettableFuture> result = SettableFuture.create(); + int serviceId = input.getServiceId() ; + List mkMatches = new ArrayList(); + byte[] vxLANHeader = new byte[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + // Flags Byte + byte Flags = (byte) 0x08; + vxLANHeader[0] = Flags; + + // Extract the serviceId details and imprint on the VxLAN Header + vxLANHeader[4] = (byte) (serviceId >> 16); + vxLANHeader[5] = (byte) (serviceId >> 8); + vxLANHeader[6] = (byte) (serviceId >> 0); + + // Matching metadata + mkMatches.add(new MatchInfo(MatchFieldType.tunnel_id, new BigInteger[] { + new BigInteger(1, vxLANHeader), + MetaDataUtil.METADA_MASK_VALID_TUNNEL_ID_BIT_AND_TUNNEL_ID })); + + Flow terminatingServiceTableFlow = MDSALUtil.buildFlowNew(ITMConstants.INTERNAL_TUNNEL_TABLE, + getFlowRef(ITMConstants.INTERNAL_TUNNEL_TABLE,serviceId), 5, String.format("%s:%d","ITM Flow Entry ",serviceId), + 0, 0, ITMConstants.COOKIE_ITM.add(BigInteger.valueOf(serviceId)),mkMatches, input.getInstruction()); + + ListenableFuture installFlowResult = mdsalManager.installFlow(input.getDpnId(), terminatingServiceTableFlow); + Futures.addCallback(installFlowResult, new FutureCallback(){ + + @Override + public void onSuccess(Void aVoid) { + result.set(RpcResultBuilder.success().build()); + } + + @Override + public void onFailure(Throwable error) { + String msg = String.format("Unable to install terminating service flow for %s", input.getDpnId()); + LOG.error("create terminating service actions failed. {}. {}", msg, error); + result.set(RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, msg, error).build()); + } + }); + result.set(RpcResultBuilder.success().build()); + return result; + } + + @Override + public Future> removeTerminatingServiceActions(final RemoveTerminatingServiceActionsInput input) { + LOG.info("remove terminatingServiceActions called with DpnId = {} and serviceId = {}", input.getDpnId(), input.getServiceId()); + final SettableFuture> result = SettableFuture.create(); + Flow terminatingServiceTableFlow = MDSALUtil.buildFlowNew(ITMConstants.INTERNAL_TUNNEL_TABLE, + getFlowRef(ITMConstants.INTERNAL_TUNNEL_TABLE,input.getServiceId()), 5, String.format("%s:%d","ITM Flow Entry ",input.getServiceId()), + 0, 0, ITMConstants.COOKIE_ITM.add(BigInteger.valueOf(input.getServiceId())),getTunnelMatchesForServiceId(input.getServiceId()), null ); + + ListenableFuture installFlowResult = mdsalManager.installFlow(input.getDpnId(), terminatingServiceTableFlow); + Futures.addCallback(installFlowResult, new FutureCallback(){ + + @Override + public void onSuccess(Void aVoid) { + result.set(RpcResultBuilder.success().build()); + } + + @Override + public void onFailure(Throwable error) { + String msg = String.format("Unable to remove terminating service flow for %s", input.getDpnId()); + LOG.error("remove terminating service actions failed. {}. {}", msg, error); + result.set(RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, msg, error).build()); + } + }); + result.set(RpcResultBuilder.success().build()); + + return result ; + } + + public List getTunnelMatchesForServiceId(int serviceId) { + List mkMatches = new ArrayList(); + byte[] vxLANHeader = new byte[]{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + // Flags Byte + byte Flags = (byte) 0x08; + vxLANHeader[0] = Flags; + + // Extract the serviceId details and imprint on the VxLAN Header + vxLANHeader[4] = (byte) (serviceId >> 16); + vxLANHeader[5] = (byte) (serviceId >> 8); + vxLANHeader[6] = (byte) (serviceId >> 0); + + // Matching metadata + mkMatches.add(new MatchInfo(MatchFieldType.tunnel_id, new BigInteger[]{ + new BigInteger(1, vxLANHeader), + MetaDataUtil.METADA_MASK_VALID_TUNNEL_ID_BIT_AND_TUNNEL_ID})); + + return mkMatches; + } + + private String getFlowRef(long termSvcTable, int svcId) { + return new StringBuffer().append(termSvcTable).append(svcId).toString(); + } + } -- 2.36.6