From f27f2337e171c9f944de55a3ac6650b3b1ec0af2 Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Thu, 14 Nov 2013 13:05:29 +0100 Subject: [PATCH] Added meter, action, group, flow models, mask and transactions support. - Updated SAL-Compatibility - Updated Group Consumer - Updated Meter Consumer Change-Id: I4854eb822723c3fc8fccdf6b05241d7c03fdb60d Signed-off-by: Prasanna Huddar Signed-off-by: Ed Warnicke Signed-off-by: Tony Tkacik --- .../openflow/pom.xml | 17 +- .../consumer/impl/GroupConsumerImpl.java | 14 +- .../consumer/impl/MeterConsumerImpl.java | 514 ++++++++++++++++++ opendaylight/md-sal/compatibility/pom.xml | 2 +- .../compatibility/FlowProgrammerAdapter.xtend | 2 +- .../FromSalConversionsUtils.java | 11 +- .../sal/compatibility/MDFlowMapping.xtend | 56 +- .../compatibility/ToSalConversionsUtils.java | 70 +-- .../adsal/FlowServiceAdapter.java | 29 +- .../test/TestFromSalConversionsUtils.java | 14 +- .../test/TestToSalConversionsUtils.java | 14 +- .../src/main/yang/action-types.yang | 229 ++++++++ .../src/main/yang/flow-types.yang | 248 +-------- .../src/main/yang/group-types.yang | 20 +- .../src/main/yang/match-types.yang | 64 ++- .../src/main/yang/meter-types.yang | 4 + .../src/main/yang/table-types.yang | 10 +- .../src/main/yang/flow-service.yang | 15 +- 18 files changed, 965 insertions(+), 368 deletions(-) create mode 100644 opendaylight/forwardingrulesmanager_mdsal/openflow/src/main/java/org/opendaylight/controller/forwardingrulesmanager_mdsal/consumer/impl/MeterConsumerImpl.java create mode 100644 opendaylight/md-sal/model/model-flow-base/src/main/yang/action-types.yang diff --git a/opendaylight/forwardingrulesmanager_mdsal/openflow/pom.xml b/opendaylight/forwardingrulesmanager_mdsal/openflow/pom.xml index 29de77270b..dcf119930b 100644 --- a/opendaylight/forwardingrulesmanager_mdsal/openflow/pom.xml +++ b/opendaylight/forwardingrulesmanager_mdsal/openflow/pom.xml @@ -89,12 +89,7 @@ org.opendaylight.controller sal-binding-api 1.0-SNAPSHOT - - - org.opendaylight.controller - flow-management-compatibility - 1.0-SNAPSHOT - + org.opendaylight.controller.model model-flow-service @@ -111,5 +106,15 @@ 1.0-SNAPSHOT provided + + org.opendaylight.controller + clustering.services + 0.4.1-SNAPSHOT + + + org.opendaylight.controller + sal + 0.5.1-SNAPSHOT + diff --git a/opendaylight/forwardingrulesmanager_mdsal/openflow/src/main/java/org/opendaylight/controller/forwardingrulesmanager_mdsal/consumer/impl/GroupConsumerImpl.java b/opendaylight/forwardingrulesmanager_mdsal/openflow/src/main/java/org/opendaylight/controller/forwardingrulesmanager_mdsal/consumer/impl/GroupConsumerImpl.java index acc0dc69cd..73295cc1e7 100644 --- a/opendaylight/forwardingrulesmanager_mdsal/openflow/src/main/java/org/opendaylight/controller/forwardingrulesmanager_mdsal/consumer/impl/GroupConsumerImpl.java +++ b/opendaylight/forwardingrulesmanager_mdsal/openflow/src/main/java/org/opendaylight/controller/forwardingrulesmanager_mdsal/consumer/impl/GroupConsumerImpl.java @@ -62,16 +62,14 @@ public class GroupConsumerImpl { private ConcurrentMap> nodeGroups; private ConcurrentMap inactiveGroups; - private IClusterContainerServices clusterGroupContainerService = null; - private ISwitchManager switchGroupManager; + private IClusterContainerServices clusterGroupContainerService = null; private IContainer container; public GroupConsumerImpl() { - InstanceIdentifier path = InstanceIdentifier.builder().node(Groups.class).toInstance(); + InstanceIdentifier path = InstanceIdentifier.builder().node(Groups.class).node(Group.class).toInstance(); groupService = FRMConsumerImpl.getProviderSession().getRpcService(SalGroupService.class); - clusterGroupContainerService = FRMConsumerImpl.getClusterContainerService(); - switchGroupManager = FRMConsumerImpl.getSwitchManager(); + clusterGroupContainerService = FRMConsumerImpl.getClusterContainerService(); container = FRMConsumerImpl.getContainer(); if (!(cacheStartup())) { @@ -279,7 +277,7 @@ public class GroupConsumerImpl { * @param dataObject */ private Status updateGroup(InstanceIdentifier path, Group groupUpdateDataObject) { - GroupKey groupKey = groupUpdateDataObject.getKey(); + GroupKey groupKey = groupUpdateDataObject.getKey(); Status groupOperationStatus = validateGroup(groupUpdateDataObject, FRMUtil.operation.UPDATE); if (!groupOperationStatus.isSuccess()) { @@ -319,7 +317,7 @@ public class GroupConsumerImpl { logger.error("Group data object validation failed %s" + groupAddDataObject.getGroupName()); return groupOperationStatus; } - validateGroup(groupAddDataObject, FRMUtil.operation.ADD); + originalSwGroupView.put(groupKey, groupAddDataObject); if (groupAddDataObject.isInstall()) { @@ -363,7 +361,7 @@ public class GroupConsumerImpl { @Override public DataCommitTransaction requestCommit(DataModification, DataObject> modification) { // We should verify transaction - System.out.println("Coming in FlowDatacommitHandler"); + System.out.println("Coming in GroupDatacommitHandler"); internalTransaction transaction = new internalTransaction(modification); transaction.prepareUpdate(); return transaction; diff --git a/opendaylight/forwardingrulesmanager_mdsal/openflow/src/main/java/org/opendaylight/controller/forwardingrulesmanager_mdsal/consumer/impl/MeterConsumerImpl.java b/opendaylight/forwardingrulesmanager_mdsal/openflow/src/main/java/org/opendaylight/controller/forwardingrulesmanager_mdsal/consumer/impl/MeterConsumerImpl.java new file mode 100644 index 0000000000..5eb971ed91 --- /dev/null +++ b/opendaylight/forwardingrulesmanager_mdsal/openflow/src/main/java/org/opendaylight/controller/forwardingrulesmanager_mdsal/consumer/impl/MeterConsumerImpl.java @@ -0,0 +1,514 @@ +package org.opendaylight.controller.forwardingrulesmanager_mdsal.consumer.impl; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.opendaylight.controller.clustering.services.CacheConfigException; +import org.opendaylight.controller.clustering.services.CacheExistException; +import org.opendaylight.controller.clustering.services.IClusterContainerServices; +import org.opendaylight.controller.clustering.services.IClusterServices; +import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; +import org.opendaylight.controller.md.sal.common.api.data.DataModification; +import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction; +import org.opendaylight.controller.sal.common.util.Rpcs; +import org.opendaylight.controller.sal.core.IContainer; +import org.opendaylight.controller.sal.core.Node; +import org.opendaylight.controller.sal.utils.GlobalConstants; +import org.opendaylight.controller.sal.utils.Status; +import org.opendaylight.controller.sal.utils.StatusCode; +import org.opendaylight.controller.switchmanager.ISwitchManager; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.Meters; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.meters.MeterKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterAdded; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.MeterUpdated; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterListener; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.SalMeterService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.BandType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Drop; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemark; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.Experimenter; +import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.meters.Meter; +import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.NotificationListener; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MeterConsumerImpl { + protected static final Logger logger = LoggerFactory.getLogger(MeterConsumerImpl.class); + private MeterEventListener meterEventListener = new MeterEventListener(); + private Registration meterListener; + private SalMeterService meterService; + private MeterDataCommitHandler commitHandler; + + private ConcurrentMap originalSwMeterView; + private ConcurrentMap installedSwMeterView; + + private ConcurrentMap> nodeMeters; + private ConcurrentMap inactiveMeters; + + private IClusterContainerServices clusterMeterContainerService = null; + private IContainer container; + + public MeterConsumerImpl() { + InstanceIdentifier path = InstanceIdentifier.builder().node(Meters.class).node(Meter.class).toInstance(); + meterService = FRMConsumerImpl.getProviderSession().getRpcService(SalMeterService.class); + clusterMeterContainerService = FRMConsumerImpl.getClusterContainerService(); + + container = FRMConsumerImpl.getContainer(); + + if (!(cacheStartup())) { + logger.error("Unable to allocate/retrieve meter cache"); + System.out.println("Unable to allocate/retrieve meter cache"); + } + + if (null == meterService) { + logger.error("Consumer SAL Meter Service is down or NULL. FRM may not function as intended"); + System.out.println("Consumer SAL Meter Service is down or NULL."); + return; + } + + // For switch/plugin events + meterListener = FRMConsumerImpl.getNotificationService().registerNotificationListener(meterEventListener); + + if (null == meterListener) { + logger.error("Listener to listen on meter data modifcation events"); + System.out.println("Listener to listen on meter data modifcation events."); + return; + } + + commitHandler = new MeterDataCommitHandler(); + FRMConsumerImpl.getDataProviderService().registerCommitHandler(path, commitHandler); + } + + + + private boolean allocateMeterCaches() { + if (this.clusterMeterContainerService == null) { + logger.warn("Meter: Un-initialized clusterMeterContainerService, can't create cache"); + return false; + } + + try { + clusterMeterContainerService.createCache("frm.originalSwMeterView", + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); + + clusterMeterContainerService.createCache("frm.installedSwMeterView", + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); + + clusterMeterContainerService.createCache("frm.inactiveMeters", + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); + + clusterMeterContainerService.createCache("frm.nodeMeters", + EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); + +//TODO for cluster mode + /* clusterMeterContainerService.createCache(WORK_STATUS_CACHE, + EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL, IClusterServices.cacheMode.ASYNC)); + + clusterMeterContainerService.createCache(WORK_ORDER_CACHE, + EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL, IClusterServices.cacheMode.ASYNC));*/ + + } catch (CacheConfigException cce) { + logger.error("Meter CacheConfigException"); + return false; + + } catch (CacheExistException cce) { + logger.error(" Meter CacheExistException"); + } + + return true; + } + + private void nonClusterMeterObjectCreate() { + originalSwMeterView = new ConcurrentHashMap(); + installedSwMeterView = new ConcurrentHashMap(); + nodeMeters = new ConcurrentHashMap>(); + inactiveMeters = new ConcurrentHashMap(); + } + + @SuppressWarnings({ "unchecked" }) + private boolean retrieveMeterCaches() { + ConcurrentMap map; + + if (this.clusterMeterContainerService == null) { + logger.warn("Meter: un-initialized clusterMeterContainerService, can't retrieve cache"); + nonClusterMeterObjectCreate(); + return false; + } + + map = clusterMeterContainerService.getCache("frm.originalSwMeterView"); + if (map != null) { + originalSwMeterView = (ConcurrentMap) map; + } else { + logger.error("Retrieval of cache(originalSwMeterView) failed"); + return false; + } + + map = clusterMeterContainerService.getCache("frm.installedSwMeterView"); + if (map != null) { + installedSwMeterView = (ConcurrentMap) map; + } else { + logger.error("Retrieval of cache(installedSwMeterView) failed"); + return false; + } + + map = clusterMeterContainerService.getCache("frm.inactiveMeters"); + if (map != null) { + inactiveMeters = (ConcurrentMap) map; + } else { + logger.error("Retrieval of cache(inactiveMeters) failed"); + return false; + } + + map = clusterMeterContainerService.getCache("frm.nodeMeters"); + if (map != null) { + nodeMeters = (ConcurrentMap>) map; + } else { + logger.error("Retrieval of cache(nodeMeter) failed"); + return false; + } + + return true; + } + + private boolean cacheStartup() { + if (allocateMeterCaches()) { + if (retrieveMeterCaches()) { + return true; + } + } + + return false; + } + + /** + * Adds Meter to the southbound plugin and our internal database + * + * @param path + * @param dataObject + */ + private Status addMeter(InstanceIdentifier path, Meter meterAddDataObject) { + MeterKey meterKey = meterAddDataObject.getKey(); + + if (null != meterKey && + validateMeter(meterAddDataObject, FRMUtil.operation.ADD).isSuccess()) { + if (meterAddDataObject.isInstall()) { + AddMeterInputBuilder meterBuilder = new AddMeterInputBuilder(); + + meterBuilder.setContainerName(meterAddDataObject.getContainerName()); + meterBuilder.setFlags(meterAddDataObject.getFlags()); + meterBuilder.setMeterBandHeaders(meterAddDataObject.getMeterBandHeaders()); + meterBuilder.setMeterId(meterAddDataObject.getMeterId()); + meterBuilder.setNode(meterAddDataObject.getNode()); + originalSwMeterView.put(meterKey, meterAddDataObject); + meterService.addMeter(meterBuilder.build()); + } + + originalSwMeterView.put(meterKey, meterAddDataObject); + } + else { + return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed"); + } + + return new Status(StatusCode.SUCCESS); + } + + /* + * Update Meter to the southbound plugin and our internal database + * + * @param path + * @param dataObject + */ + private Status updateMeter(InstanceIdentifier path, Meter meterUpdateDataObject) { + MeterKey meterKey = meterUpdateDataObject.getKey(); + + if (null != meterKey && + validateMeter(meterUpdateDataObject, FRMUtil.operation.ADD).isSuccess()) { + if (meterUpdateDataObject.isInstall()) { + UpdateMeterInputBuilder updateMeterBuilder = new UpdateMeterInputBuilder(); + + originalSwMeterView.put(meterKey, meterUpdateDataObject); + meterService.updateMeter(updateMeterBuilder.build()); + } + + originalSwMeterView.put(meterKey, meterUpdateDataObject); + } + else { + return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed"); + } + + return new Status(StatusCode.SUCCESS); + } + + /* + * Remove Meter to the southbound plugin and our internal database + * + * @param path + * @param dataObject + */ + private Status RemoveMeter(InstanceIdentifier path, Meter meterUpdateDataObject) { + MeterKey meterKey = meterUpdateDataObject.getKey(); + + if (null != meterKey && + validateMeter(meterUpdateDataObject, FRMUtil.operation.ADD).isSuccess()) { + if (meterUpdateDataObject.isInstall()) { + UpdateMeterInputBuilder updateMeterBuilder = new UpdateMeterInputBuilder(); + + originalSwMeterView.put(meterKey, meterUpdateDataObject); + meterService.updateMeter(updateMeterBuilder.build()); + } + + originalSwMeterView.put(meterKey, meterUpdateDataObject); + } + else { + return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed"); + } + + return new Status(StatusCode.SUCCESS); + } + + public Status validateMeter(Meter meter, FRMUtil.operation operation) { + String containerName; + String meterName; + Status returnStatus = null; + boolean returnResult; + + if (null != meter) { + containerName = meter.getContainerName(); + + if (null == containerName) { + containerName = GlobalConstants.DEFAULT.toString(); + } + else if (!FRMUtil.isNameValid(containerName)) { + logger.error("Container Name is invalid %s" + containerName); + returnStatus = new Status(StatusCode.BADREQUEST, "Container Name is invalid"); + return returnStatus; + } + + meterName = meter.getMeterName(); + if (!FRMUtil.isNameValid(meterName)) { + logger.error("Meter Name is invalid %s" + meterName); + returnStatus = new Status(StatusCode.BADREQUEST, "Meter Name is invalid"); + return returnStatus; + } + + returnResult = doesMeterEntryExists(meter.getKey(), meterName, containerName); + + if (FRMUtil.operation.ADD == operation && returnResult) { + logger.error("Record with same Meter Name exists"); + returnStatus = new Status(StatusCode.BADREQUEST, "Meter record exists"); + return returnStatus; + } + else if (!returnResult) { + logger.error("Group record does not exist"); + returnStatus = new Status(StatusCode.BADREQUEST, "Meter record does not exist"); + return returnStatus; + } + + for (int i = 0; i < meter.getMeterBandHeaders().getMeterBandHeader().size(); i++) { + if (!meter.getFlags().isMeterBurst()) { + if (0 < meter.getMeterBandHeaders().getMeterBandHeader().get(i).getBurstSize()) { + logger.error("Burst size should only be associated when Burst FLAG is set"); + returnStatus = new Status(StatusCode.BADREQUEST, "Burst size should only be associated when Burst FLAG is set"); + break; + } + } + } + + if (null != returnStatus && !returnStatus.isSuccess()) { + return returnStatus; + } + else { + BandType setBandType = null; + DscpRemark dscpRemark = null; + for (int i = 0; i < meter.getMeterBandHeaders().getMeterBandHeader().size(); i++) { + setBandType = meter.getMeterBandHeaders().getMeterBandHeader().get(i).getBandType(); + if ( setBandType instanceof DscpRemark) { + dscpRemark = (DscpRemark)setBandType; + if (0 > dscpRemark.getRate()) { + + } + } + else if (setBandType instanceof Drop) { + if (0 < dscpRemark.getPercLevel()) { + logger.error("Number of drop Precedence level"); + } + } + else if (setBandType instanceof Experimenter) { + + } + } + } + } + return new Status(StatusCode.SUCCESS); + } + + private boolean doesMeterEntryExists(MeterKey key, String meterName, String containerName) { + if (! originalSwMeterView.containsKey(key)) { + return false; + } + + for (Entry entry : originalSwMeterView.entrySet()) { + if (entry.getValue().getMeterName().equals(meterName)) { + if (entry.getValue().getContainerName().equals(containerName)) { + return true; + } + } + } + return false; + } + + + private RpcResult commitToPlugin(internalTransaction transaction) { + for(Entry, Meter> entry :transaction.additions.entrySet()) { + + if (!addMeter(entry.getKey(),entry.getValue()).isSuccess()) { + return Rpcs.getRpcResult(false, null, null); + } + } + for(@SuppressWarnings("unused") Entry, Meter> entry :transaction.updates.entrySet()) { + + if (!updateMeter(entry.getKey(),entry.getValue()).isSuccess()) { + return Rpcs.getRpcResult(false, null, null); + } + } + + for(InstanceIdentifier removal : transaction.removals) { + /* if (!removeMeter(entry.getKey(),entry.getValue()).isSuccess()) { + return Rpcs.getRpcResult(false, null, null); + }*/ + } + + return Rpcs.getRpcResult(true, null, null); + } + + private final class internalTransaction implements DataCommitTransaction, DataObject> { + + private final DataModification, DataObject> modification; + + @Override + public DataModification, DataObject> getModification() { + return modification; + } + + public internalTransaction(DataModification, DataObject> modification) { + this.modification = modification; + } + + Map, Meter> additions = new HashMap<>(); + Map, Meter> updates = new HashMap<>(); + Set> removals = new HashSet<>(); + + /** + * We create a plan which flows will be added, which will be updated and + * which will be removed based on our internal state. + * + */ + void prepareUpdate() { + + Set, DataObject>> puts = modification.getUpdatedConfigurationData().entrySet(); + for (Entry, DataObject> entry : puts) { + if (entry.getValue() instanceof Meter) { + Meter Meter = (Meter) entry.getValue(); + preparePutEntry(entry.getKey(), Meter); + } + + } + + removals = modification.getRemovedConfigurationData(); + } + + private void preparePutEntry(InstanceIdentifier key, Meter meter) { + + Meter original = originalSwMeterView.get(key); + if (original != null) { + // It is update for us + + updates.put(key, meter); + } else { + // It is addition for us + + additions.put(key, meter); + } + } + + /** + * We are OK to go with execution of plan + * + */ + @Override + public RpcResult finish() throws IllegalStateException { + + RpcResult rpcStatus = commitToPlugin(this); + // We return true if internal transaction is successful. + // return Rpcs.getRpcResult(true, null, Collections.emptySet()); + return rpcStatus; + } + + /** + * + * We should rollback our preparation + * + */ + @Override + public RpcResult rollback() throws IllegalStateException { + // NOOP - we did not modified any internal state during + // requestCommit phase + // return Rpcs.getRpcResult(true, null, Collections.emptySet()); + return Rpcs.getRpcResult(true, null, null); + + } + + } + + private final class MeterDataCommitHandler implements DataCommitHandler, DataObject> { + @Override + public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction, DataObject> requestCommit( + DataModification, DataObject> modification) { + // We should verify transaction + System.out.println("Coming in MeterDataCommitHandler"); + internalTransaction transaction = new internalTransaction(modification); + transaction.prepareUpdate(); + return transaction; + } + } + + final class MeterEventListener implements SalMeterListener { + + List addedMeter = new ArrayList<>(); + List removeMeter = new ArrayList<>(); + List updatedMeter = new ArrayList<>(); + + @Override + public void onMeterAdded(MeterAdded notification) { + // TODO Auto-generated method stub + + } + + @Override + public void onMeterRemoved(MeterRemoved notification) { + // TODO Auto-generated method stub + + } + + @Override + public void onMeterUpdated(MeterUpdated notification) { + // TODO Auto-generated method stub + + } + } +} diff --git a/opendaylight/md-sal/compatibility/pom.xml b/opendaylight/md-sal/compatibility/pom.xml index a829380e68..151fdbfaaa 100644 --- a/opendaylight/md-sal/compatibility/pom.xml +++ b/opendaylight/md-sal/compatibility/pom.xml @@ -8,7 +8,7 @@ compatibility-parent pom - MD-SAL to AD-SAL Adaptation + MD-SAL to AD-SAL Adaptation Parent scm:git:ssh://git.opendaylight.org:29418/controller.git scm:git:ssh://git.opendaylight.org:29418/controller.git diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FlowProgrammerAdapter.xtend b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FlowProgrammerAdapter.xtend index da652e65a7..7d9c93908e 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FlowProgrammerAdapter.xtend +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FlowProgrammerAdapter.xtend @@ -98,7 +98,7 @@ class FlowProgrammerAdapter implements IPluginInFlowProgrammerService, SalFlowLi return null; } - public static def toStatus(RpcResult result) { + public static def toStatus(RpcResult result) { if (result.isSuccessful()) { return new Status(StatusCode.SUCCESS); } else { diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FromSalConversionsUtils.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FromSalConversionsUtils.java index a31d8e265d..cc86659657 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FromSalConversionsUtils.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/FromSalConversionsUtils.java @@ -4,13 +4,10 @@ import static org.opendaylight.controller.sal.match.MatchType.DL_DST; import static org.opendaylight.controller.sal.match.MatchType.DL_SRC; import static org.opendaylight.controller.sal.match.MatchType.DL_TYPE; -import java.math.BigInteger; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; + import org.opendaylight.controller.sal.compatibility.MDFlowMapping; import org.opendaylight.controller.sal.core.NodeConnector; @@ -28,9 +25,9 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. 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.flow.statistics.rev130819.GetNodeConnectorStatisticsInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetNodeConnectorStatisticsInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv6Builder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/MDFlowMapping.xtend b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/MDFlowMapping.xtend index b43e8af661..5dd149a997 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/MDFlowMapping.xtend +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/MDFlowMapping.xtend @@ -41,34 +41,34 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.Flow import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsInputBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.VlanCfi -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.ControllerActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.DropActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.FloodActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.FloodAllActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.HwPathActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.LoopbackActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.OutputActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PopVlanActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PushVlanActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlDstActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlSrcActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlTypeActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNextHopActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwDstActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwSrcActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwTosActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetTpDstActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetTpSrcActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanCfiActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanIdActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanPcpActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SwPathActionBuilder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.Action -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.ActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.VlanCfi +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodAllActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.HwPathActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.LoopbackActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlTypeActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNextHopActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanCfiActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SwPathActionBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv6Builder +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java index 5009e5dfb7..96b69618b0 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ToSalConversionsUtils.java @@ -33,40 +33,40 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri; 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.flow.types.rev131026.ActionList; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.VlanCfi; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.ControllerAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.DropAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.FloodAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.FloodAllAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.HwPathAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.LoopbackAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.OutputAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PopMplsAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PopVlanAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PushMplsAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PushPbbAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.PushVlanAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlDstAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlSrcAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetDlTypeAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetMplsTtlAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNextHopAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwDstAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwSrcAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwTosAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetNwTtlAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetQueueAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetTpDstAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetTpSrcAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanCfiAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanIdAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SetVlanPcpAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.SwPathAction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.Action; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.ActionList; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.VlanCfi; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodAllAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.HwPathAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.LoopbackAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlTypeAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNextHopAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanCfiAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SwPathAction; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv6; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType; import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp; @@ -159,7 +159,7 @@ public class ToSalConversionsUtils { public static List actionFrom(List actions) { List targetAction = new ArrayList<>(); for (Action action : actions) { - org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.Action sourceAction = action + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action sourceAction = action .getAction(); if (sourceAction instanceof ControllerAction) { diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowServiceAdapter.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowServiceAdapter.java index ae427455a4..fd03ea4ca5 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowServiceAdapter.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/FlowServiceAdapter.java @@ -1,5 +1,6 @@ package org.opendaylight.controller.sal.compatibility.adsal; +import java.math.BigInteger; import java.util.concurrent.Future; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; @@ -14,10 +15,17 @@ import org.opendaylight.controller.sal.flowprogrammer.IFlowProgrammerListener; import org.opendaylight.controller.sal.flowprogrammer.IFlowProgrammerService; import org.opendaylight.controller.sal.utils.Status; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemovedBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowOutputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; @@ -46,39 +54,46 @@ public class FlowServiceAdapter implements SalFlowService, IFlowProgrammerListen } @Override - public Future> addFlow(AddFlowInput input) { + public Future> addFlow(AddFlowInput input) { Flow flow = ToSalConversionsUtils.toFlow(input); @SuppressWarnings("unchecked") org.opendaylight.controller.sal.core.Node node = InventoryMapping.toAdNode((InstanceIdentifier) input .getNode().getValue()); Status status = delegate.addFlowAsync(node, flow); - Void rpcResultType = null; + AddFlowOutputBuilder builder = new AddFlowOutputBuilder(); + builder.setTransactionId(new TransactionId(BigInteger.valueOf(status.getRequestId()))); + AddFlowOutput rpcResultType = builder.build(); return Futures.immediateFuture(Rpcs.getRpcResult(status.isSuccess(), rpcResultType, null)); } @Override - public Future> removeFlow(RemoveFlowInput input) { + public Future> removeFlow(RemoveFlowInput input) { Flow flow = ToSalConversionsUtils.toFlow(input); @SuppressWarnings("unchecked") org.opendaylight.controller.sal.core.Node node = InventoryMapping.toAdNode((InstanceIdentifier) input .getNode().getValue()); Status status = delegate.removeFlowAsync(node, flow); - Void rpcResultType = null; + RemoveFlowOutputBuilder builder = new RemoveFlowOutputBuilder(); + builder.setTransactionId(new TransactionId(BigInteger.valueOf(status.getRequestId()))); + RemoveFlowOutput rpcResultType = builder.build(); return Futures.immediateFuture(Rpcs.getRpcResult(status.isSuccess(), rpcResultType, null)); } @Override - public Future> updateFlow(UpdateFlowInput input) { + public Future> updateFlow(UpdateFlowInput input) { @SuppressWarnings("unchecked") org.opendaylight.controller.sal.core.Node node = InventoryMapping.toAdNode((InstanceIdentifier) input .getNode().getValue()); Flow originalFlow = ToSalConversionsUtils.toFlow(input.getOriginalFlow()); Flow updatedFlow = ToSalConversionsUtils.toFlow(input.getUpdatedFlow()); Status status = delegate.modifyFlowAsync(node, originalFlow, updatedFlow); - Void rpcResultType = null; - return Futures.immediateFuture(Rpcs.getRpcResult(status.isSuccess(), rpcResultType, null)); + UpdateFlowOutputBuilder builder = new UpdateFlowOutputBuilder(); + builder.setTransactionId(new TransactionId(BigInteger.valueOf(status.getRequestId()))); + UpdateFlowOutput rpcResultType = builder.build(); + throw new UnsupportedOperationException("Need to translate AD-SAL status to MD-SAL UpdateFlowOuptut - eaw@cisco.com"); + // return Futures.immediateFuture(Rpcs.getRpcResult(status.isSuccess(), rpcResultType, null)); } } diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestFromSalConversionsUtils.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestFromSalConversionsUtils.java index c37cce0837..96b8cafdf8 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestFromSalConversionsUtils.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestFromSalConversionsUtils.java @@ -26,9 +26,9 @@ import org.opendaylight.controller.sal.flowprogrammer.Flow; import org.opendaylight.controller.sal.match.Match; import org.opendaylight.controller.sal.match.MatchType; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer3Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Layer4Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch; @@ -185,7 +185,7 @@ public class TestFromSalConversionsUtils { } private void checkOdActions( - List actions) { + List actions) { checkOdAction(actions, FloodAction.class, false); checkOdAction(actions, FloodAllAction.class, false); checkOdAction(actions, HwPathAction.class, false); @@ -208,11 +208,11 @@ public class TestFromSalConversionsUtils { } private void checkOdAction( - List actions, Class cl, + List actions, Class cl, boolean b) { int numOfFoundActions = 0; - for (org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.Action action : actions) { - org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.Action innerAction = action + for (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action action : actions) { + org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action innerAction = action .getAction(); if (cl.isInstance(innerAction)) { numOfFoundActions++; diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java index e251dd02a0..e2ae724606 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/test/java/org/opendaylight/controller/sal/compatibility/test/TestToSalConversionsUtils.java @@ -27,13 +27,13 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. 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.flow.service.rev130819.FlowAddedBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.VlanCfi; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.action.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.Address; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv4Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.address.address.Ipv6Builder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.Action; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.action.list.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.VlanCfi; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv6Builder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match; diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/action-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/action-types.yang new file mode 100644 index 0000000000..3bf7db6297 --- /dev/null +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/action-types.yang @@ -0,0 +1,229 @@ +module opendaylight-action-types { + namespace "urn:opendaylight:action:types"; + prefix action; + + import ietf-inet-types {prefix inet; revision-date "2010-09-24";} + import ietf-yang-types {prefix yang; revision-date "2010-09-24";} + import opendaylight-l2-types {prefix l2t; revision-date "2013-08-27";} + + revision "2013-11-12" { + description "Initial revision of action service"; + } + + typedef vlan-cfi { + type int32; + } + + grouping address { + choice address { + case ipv4 { + leaf ipv4-address { + type inet:ipv4-prefix; + } + } + case ipv6 { + leaf ipv6-address { + type inet:ipv6-prefix; + } + } + } + } + + grouping action-list { + list action { + key "order"; + leaf order { + type int32; + } + uses action; + } + } + + grouping action { + choice action { + case output-action { + leaf-list output-node-connector { + type inet:uri; + } + + leaf max-length { + type uint16 { + range "0..65294"; + } + } + } + + case controller-action { + leaf max-length { + type uint16 { + range "0..65294"; + } + } + } + + case set-queue-action { + leaf queue { + type string; + } + } + + case pop-mpls-action { + leaf ethernet-type { + type uint16; // TODO: define ethertype type + } + } + + case set-mpls-ttl-action { + leaf mpls-ttl { + type uint8; + } + } + + case set-nw-ttl-action { + leaf nw-ttl { + type uint8; + } + } + + case push-pbb-action { + leaf ethernet-type { + type uint16; // TODO: define ethertype type + } + } + + case pop-pbb-action { + + } + + case push-mpls-action { + leaf ethernet-type { + type uint16; // TODO: define ethertype type + } + } + + case dec-mpls-ttl { + } + + case dec-nw-ttl { + } + + case drop-action { + } + + case flood-action { + } + + case flood-all-action { + } + + case hw-path-action { + } + + case loopback-action { + } + + case pop-vlan-action { + } + + case push-vlan-action { + leaf ethernet-type { + type uint16; // TODO: define ethertype type + } + leaf tag { // TPID - 16 bits + type int32; + } + leaf pcp { // PCP - 3 bits + type int32; + } + leaf cfi { // CFI - 1 bit (drop eligible) + type vlan-cfi; + } + leaf vlan-id { // VID - 12 bits + type l2t:vlan-id; + } +// leaf tci { //TCI = [PCP + CFI + VID] +// } +// leaf header { //header = [TPID + TCI] +// } + } + + case copy-ttl-out { + } + + case copy-ttl-in { + } + + case set-dl-dst-action { + leaf address { + type yang:mac-address; + } + } + + case set-dl-src-action { + leaf address { + type yang:mac-address; + } + } + case group-action { + leaf group { + type string; + } + } + + case set-dl-type-action { + leaf dl-type { + type l2t:ether-type; + } + } + + case set-next-hop-action { + uses address; + } + + case set-nw-dst-action { + uses address; + } + + case set-nw-src-action{ + uses address; + } + + case set-nw-tos-action { + leaf tos { + type int32; + } + } + + case set-tp-dst-action { + leaf port { + type inet:port-number; + } + } + case set-tp-src-action { + leaf port { + type inet:port-number; + } + } + case set-vlan-cfi-action { + leaf vlan-cfi { + type vlan-cfi; + } + } + + case set-vlan-id-action { + leaf vlan-id { + type l2t:vlan-id; + } + } + + case set-vlan-pcp-action { + leaf vlan-pcp { + type l2t:vlan-pcp; + } + } + + case sw-path-action { + } + } + } +} \ No newline at end of file diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang index 8e8c822935..4145977f63 100644 --- a/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/flow-types.yang @@ -3,54 +3,22 @@ module opendaylight-flow-types { prefix flow; import ietf-inet-types {prefix inet; revision-date "2010-09-24";} - import ietf-yang-types {prefix yang; revision-date "2010-09-24";} - import opendaylight-l2-types {prefix l2t; revision-date "2013-08-27";} + import ietf-yang-types {prefix yang; revision-date "2010-09-24";} import opendaylight-match-types {prefix match; revision-date 2013-10-26";} - + import opendaylight-action-types {prefix action;} revision "2013-10-26" { description "Initial revision of flow service"; } - - typedef vlan-cfi { - type int32; - } - - - grouping action-list { - list action { + grouping instruction-list { + list instruction { key "order"; leaf order { type int32; } - uses action; - } - } - - grouping address { - choice address { - case ipv4 { - leaf ipv4-address { - type inet:ipv4-prefix; - } - } - case ipv6 { - leaf ipv6-address { - type inet:ipv6-prefix; - } - } + uses instruction; } - } - - grouping instruction-list { - list instruction { - key "order"; - leaf order { - type int32; - } - uses instruction; - } } grouping instruction { @@ -72,15 +40,15 @@ module opendaylight-flow-types { } case write-actions { - uses action-list; + uses action:action-list; } case apply-actions { - uses action-list; + uses action:action-list; } case clear-actions { - uses action-list; + uses action:action-list; } case meter { @@ -91,197 +59,13 @@ module opendaylight-flow-types { } } - grouping action { - choice action { - case output-action { - leaf-list output-node-connector { - type inet:uri; - } - - leaf max-length { - type uint16 { - range "0..65294"; - } - } - } - - case controller-action { - leaf max-length { - type uint16 { - range "0..65294"; - } - } - } - - case set-queue-action { - leaf queue { - type string; - } - } - - case pop-mpls-action { - leaf ethernet-type { - type uint16; // TODO: define ethertype type - } - } - - case set-mpls-ttl-action { - leaf mpls-ttl { - type uint8; - } - } - - case set-nw-ttl-action { - leaf nw-ttl { - type uint8; - } - } - - case push-pbb-action { - leaf ethernet-type { - type uint16; // TODO: define ethertype type - } - } - - case pop-pbb-action { - - } - - case push-mpls-action { - leaf ethernet-type { - type uint16; // TODO: define ethertype type - } - } - - case dec-mpls-ttl { - } - - case dec-nw-ttl { - } - - case drop-action { - } - - case flood-action { - } - - case flood-all-action { - } - - case hw-path-action { - } - - case loopback-action { - } - - case pop-vlan-action { - } - - case push-vlan-action { - leaf tag { // TPID - 16 bits - type int32; - } - leaf pcp { // PCP - 3 bits - type int32; - } - leaf cfi { // CFI - 1 bit (drop eligible) - type vlan-cfi; - } - leaf vlan-id { // VID - 12 bits - type l2t:vlan-id; - } -// leaf tci { //TCI = [PCP + CFI + VID] -// } -// leaf header { //header = [TPID + TCI] -// } - } - - case copy-ttl-out { - } - - case copy-ttl-in { - } - - case set-dl-dst-action { - leaf address { - type yang:mac-address; - } - } - - case set-dl-src-action { - leaf address { - type yang:mac-address; - } - } - case group-action { - leaf group { - type string; - } - } - - case set-dl-type-action { - leaf dl-type { - type l2t:ether-type; - } - } - - case set-next-hop-action { - uses address; - } - - case set-nw-dst-action { - uses address; - } - - case set-nw-src-action{ - uses address; - } - - case set-nw-tos-action { - leaf tos { - type int32; - } - } - - case set-tp-dst-action { - leaf port { - type inet:port-number; - } - } - case set-tp-src-action { - leaf port { - type inet:port-number; - } - } - case set-vlan-cfi-action { - leaf vlan-cfi { - type vlan-cfi; - } - } - - case set-vlan-id-action { - leaf vlan-id { - type l2t:vlan-id; - } - } - - case set-vlan-pcp-action { - leaf vlan-pcp { - type l2t:vlan-pcp; - } - } - - case sw-path-action { - } - } - } - typedef flow-mod-flags { type bits { bit CHECK_OVERLAP; bit RESET_COUNTS; bit NO_PKT_COUNTS; bit NO_BYT_COUNTS; + bit SEND_FLOW_REM; } } @@ -341,6 +125,20 @@ module opendaylight-flow-types { leaf flow-name{ type string; } + + leaf installHw { + type boolean; + } + + leaf barrier { + type boolean; + } + + leaf strict { + type boolean; + default "false"; + } + } grouping flow-statistics { diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/group-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/group-types.yang index 03e36924e7..685728a887 100644 --- a/opendaylight/md-sal/model/model-flow-base/src/main/yang/group-types.yang +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/group-types.yang @@ -3,8 +3,8 @@ module opendaylight-group-types { prefix group; import ietf-inet-types {prefix inet; revision-date "2010-09-24";} - import ietf-yang-types {prefix yang; revision-date "2010-09-24";} - import opendaylight-flow-types {prefix flow-types;revision-date 2013-10-26";} + import ietf-yang-types {prefix yang; revision-date "2010-09-24";} + import opendaylight-action-types {prefix action;} revision "2013-10-18" { description "Initial revision of group service"; @@ -41,6 +41,10 @@ module opendaylight-group-types { type string; } + leaf install { + type boolean; + } + leaf barrier { type boolean; } @@ -64,16 +68,7 @@ module opendaylight-group-types { type uint32; } - container actions { - list action { - key "action-order"; - leaf action-order { - type int32; - } - - uses flow-types:action; - } - } + uses action:action-list; } } } @@ -164,6 +159,7 @@ module opendaylight-group-types { } uses group-types; + leaf capabilities { type enumeration { enum select-weight; diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/match-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/match-types.yang index a2aca362e2..f58f6a4597 100644 --- a/opendaylight/md-sal/model/model-flow-base/src/main/yang/match-types.yang +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/match-types.yang @@ -19,6 +19,16 @@ module opendaylight-match-types { type binary; } } + + grouping "of-metadata" { + leaf metadata { + type uint64; + } + + leaf metadata-mask { + type binary; + } + } /** Match Groupings **/ grouping "ethernet-match-fields" { @@ -40,6 +50,7 @@ module opendaylight-match-types { mandatory true; type l2t:ether-type; // Needs to define that as general model } + leaf mask { type binary; } @@ -85,25 +96,27 @@ module opendaylight-match-types { description "IP Proto (IPv4 or IPv6 Protocol Number)."; type inet:ip-version; } - } - + } + grouping "ipv4-match-fields" { leaf ipv4-source { description "IPv4 source address."; type inet:ipv4-prefix; } + leaf ipv4-destination { description "IPv4 destination address."; type inet:ipv4-prefix; } + } - + grouping "ipv6-match-fields" { leaf ipv6-source { description "IPv6 source address."; type inet:ipv6-prefix; } - + leaf ipv6-destination { description "IPv6 destination address."; type inet:ipv6-prefix; @@ -111,11 +124,17 @@ module opendaylight-match-types { leaf ipv6-nd-target { description "IPv6 target address for neighbour discovery message"; - type inet:ipv6-prefix; + type inet:ipv6-address; } - leaf ipv6-flabel { - type inet:ipv6-flow-label; + container "ipv6-label" { + leaf ipv6-flabel { + type inet:ipv6-flow-label; + } + + leaf flabel-mask { + type binary; + } } leaf ipv6-nd-sll { @@ -161,11 +180,16 @@ module opendaylight-match-types { type uint8; } - leaf pbb-isid { - description "I-SID in the first PBB service instance tag"; - type uint32; - } - + container "pbb" { + leaf pbb-isid { + description "I-SID in the first PBB service instance tag"; + type uint32; + } + + leaf pbb-mask { + type binary; + } + } } grouping "tcp-match-fields" { @@ -247,13 +271,19 @@ module opendaylight-match-types { type uint32; } - leaf metadata { - type uint64; + container "metadata" { + uses of-metadata; } - leaf tunnel-id { - description "Metadata associated in the logical port"; - type uint64; + container "tunnel" { + leaf tunnel-id { + description "Metadata associated in the logical port"; + type uint64; + } + + leaf tunnel-mask { + type binary; + } } container "ethernet-match" { diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/meter-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/meter-types.yang index 20353af785..148ac9687f 100644 --- a/opendaylight/md-sal/model/model-flow-base/src/main/yang/meter-types.yang +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/meter-types.yang @@ -107,6 +107,10 @@ module opendaylight-meter-types { uses meter-band-type; } + leaf rate { + type uint32; + } + leaf burst-size { type uint32; } diff --git a/opendaylight/md-sal/model/model-flow-base/src/main/yang/table-types.yang b/opendaylight/md-sal/model/model-flow-base/src/main/yang/table-types.yang index 98cf93d4b3..2a16bfcf50 100644 --- a/opendaylight/md-sal/model/model-flow-base/src/main/yang/table-types.yang +++ b/opendaylight/md-sal/model/model-flow-base/src/main/yang/table-types.yang @@ -5,7 +5,7 @@ module opendaylight-table-types { import ietf-inet-types {prefix inet; revision-date "2010-09-24";} import ietf-yang-types {prefix yang; revision-date "2010-09-24";} import opendaylight-flow-types {prefix flow;revision-date 2013-10-26";} - + import opendaylight-action-types {prefix action;} revision "2013-10-26" { description "Initial revision of table service"; @@ -61,25 +61,25 @@ module opendaylight-table-types { case write-actions { container write-actions { - uses flow:action-list; + uses action:action-list; } } case write-actions-miss { container write-actions-miss { - uses flow:action-list; + uses action:action-list; } } case apply-actions { container apply-actions { - uses flow:action-list; + uses action:action-list; } } case apply-actions-miss { container apply-actions-miss { - uses flow:action-list; + uses action:action-list; } } diff --git a/opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-service.yang b/opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-service.yang index 7501d8a579..5a1b007077 100644 --- a/opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-service.yang +++ b/opendaylight/md-sal/model/model-flow-service/src/main/yang/flow-service.yang @@ -6,13 +6,12 @@ module sal-flow { import opendaylight-inventory {prefix inv;revision-date "2013-08-19";} import ietf-inet-types {prefix inet; revision-date "2010-09-24";} import opendaylight-flow-types {prefix types;revision-date "2013-10-26";} - + import flow-capable-transaction {prefix tr;} revision "2013-08-19" { description "Initial revision of flow service"; } - typedef flow-table-ref { type instance-identifier; } @@ -41,18 +40,30 @@ module sal-flow { rpc add-flow { input { uses node-flow; + uses tr:transaction-aware; + } + output { + uses tr:transaction-aware; } } rpc remove-flow { input { uses node-flow; + uses tr:transaction-aware; + } + output { + uses tr:transaction-aware; } } rpc update-flow { input { uses flow-update; + uses tr:transaction-aware; + } + output { + uses tr:transaction-aware; } } -- 2.36.6