From d904bd30445bd0f6d670afd5f5b6f8225410256a Mon Sep 17 00:00:00 2001 From: Prasanna Huddar Date: Sat, 7 Dec 2013 21:40:21 +0530 Subject: [PATCH 1/1] Fixed add/delete/modify RPC for group/flow/remove reach the test provider Signed-off-by: Prasanna Huddar Change-Id: Id62247deda75cc97e447564a7d23535bd57305c5 --- .../consumer/impl/FlowConsumerImpl.java | 486 ++++-------------- .../consumer/impl/GroupConsumerImpl.java | 29 +- .../consumer/impl/MeterConsumerImpl.java | 317 +++--------- 3 files changed, 173 insertions(+), 659 deletions(-) diff --git a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/FlowConsumerImpl.java b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/FlowConsumerImpl.java index 19c366d014..d2f2420a7c 100644 --- a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/FlowConsumerImpl.java +++ b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/FlowConsumerImpl.java @@ -2,50 +2,37 @@ package org.opendaylight.controller.forwardingrulesmanager.consumer.impl; import java.util.ArrayList; import java.util.Collections; -import java.util.EnumSet; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.Future; - -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.DataCommitHandler.DataCommitTransaction; import org.opendaylight.controller.md.sal.common.api.data.DataModification; import org.opendaylight.controller.sal.common.util.Rpcs; -import org.opendaylight.controller.sal.core.IContainer; -import org.opendaylight.controller.sal.utils.ServiceHelper; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.Flows; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.Flow; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.config.rev130819.flows.FlowKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAdded; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowTableRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowUpdated; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotification; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeExperimenterErrorNotification; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SwitchFlowRemoved; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.Tables; +import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.tables.Table; +import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.tables.TableBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.table.config.rev131024.tables.TableKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableRef; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -55,32 +42,13 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class FlowConsumerImpl implements IForwardingRulesManager { +public class FlowConsumerImpl { protected static final Logger logger = LoggerFactory.getLogger(FlowConsumerImpl.class); private final FlowEventListener flowEventListener = new FlowEventListener(); private Registration listener1Reg; private SalFlowService flowService; // private FlowDataListener listener; - private FlowDataCommitHandler commitHandler; - private static ConcurrentHashMap originalSwView; - private static ConcurrentMap installedSwView; - private IClusterContainerServices clusterContainerService = null; - private IContainer container; - private static final String NAMEREGEX = "^[a-zA-Z0-9]+$"; - private static ConcurrentMap staticFlows; - private static ConcurrentMap staticFlowsOrdinal = new ConcurrentHashMap(); - /* - * Inactive flow list. This is for the global instance of FRM It will - * contain all the flow entries which were installed on the global container - * when the first container is created. - */ - private static ConcurrentMap inactiveFlows; - - /* - * /* Per node indexing - */ - private static ConcurrentMap> nodeFlows; - private boolean inContainerMode; // being used by global instance only + private FlowDataCommitHandler commitHandler; public FlowConsumerImpl() { InstanceIdentifier path = InstanceIdentifier.builder(Flows.class).toInstance(); @@ -90,17 +58,7 @@ public class FlowConsumerImpl implements IForwardingRulesManager { logger.error("Consumer SAL Service is down or NULL. FRM may not function as intended"); return; } - - // listener = new FlowDataListener(); - - // if (null == - // FRMConsumerImpl.getDataBrokerService().registerDataChangeListener(path, - // listener)) { - // logger.error("Failed to listen on flow data modifcation events"); - // System.out.println("Consumer SAL Service is down or NULL."); - // return; - // } - + // For switch events listener1Reg = FRMConsumerImpl.getNotificationService().registerNotificationListener(flowEventListener); @@ -110,66 +68,9 @@ public class FlowConsumerImpl implements IForwardingRulesManager { } // addFlowTest(); commitHandler = new FlowDataCommitHandler(); - FRMConsumerImpl.getDataProviderService().registerCommitHandler(path, commitHandler); - clusterContainerService = (IClusterContainerServices) ServiceHelper.getGlobalInstance( - IClusterContainerServices.class, this); - allocateCaches(); - /* - * If we are not the first cluster node to come up, do not initialize - * the static flow entries ordinal - */ - if (staticFlowsOrdinal.size() == 0) { - staticFlowsOrdinal.put(0, Integer.valueOf(0)); - } + FRMConsumerImpl.getDataProviderService().registerCommitHandler(path, commitHandler); } - - private void allocateCaches() { - - if (this.clusterContainerService == null) { - logger.warn("Un-initialized clusterContainerService, can't create cache"); - return; - } - - try { - clusterContainerService.createCache("frm.originalSwView", - EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache("frm.installedSwView", - EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService - .createCache("frm.staticFlows", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache("frm.staticFlowsOrdinal", - EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache("frm.inactiveFlows", - EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache("frm.nodeFlows", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - clusterContainerService.createCache("frm.groupFlows", EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL)); - } catch (CacheConfigException cce) { - logger.error("CacheConfigException"); - } catch (CacheExistException cce) { - logger.error("CacheExistException"); - } - } - - private void addFlowTest() { - try { - NodeRef nodeOne = createNodeRef("foo:node:1"); - AddFlowInputBuilder input1 = new AddFlowInputBuilder(); - - input1.setNode(nodeOne); - AddFlowInput firstMsg = input1.build(); - - if (null == flowService) { - logger.error("ConsumerFlowService is NULL"); - } - @SuppressWarnings("unused") - Future> result1 = flowService.addFlow(firstMsg); - - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - + /** * Adds flow to the southbound plugin and our internal database * @@ -179,42 +80,11 @@ public class FlowConsumerImpl implements IForwardingRulesManager { private void addFlow(InstanceIdentifier path, Flow dataObject) { AddFlowInputBuilder input = new AddFlowInputBuilder(); - + input.fieldsFrom(dataObject); input.setNode((dataObject).getNode()); - input.setPriority((dataObject).getPriority()); - input.setMatch((dataObject).getMatch()); - input.setCookie((dataObject).getCookie()); - input.setInstructions((dataObject).getInstructions()); - input.setBufferId(dataObject.getBufferId()); - input.setTableId(dataObject.getTableId()); - input.setOutPort(dataObject.getOutPort()); - input.setOutGroup(dataObject.getOutGroup()); - input.setIdleTimeout(dataObject.getIdleTimeout()); - input.setHardTimeout(dataObject.getHardTimeout()); - input.setFlowName(dataObject.getFlowName()); - input.setFlags(dataObject.getFlags()); - input.setCookieMask(dataObject.getCookieMask()); - input.setContainerName(dataObject.getContainerName()); - input.setBarrier(dataObject.isBarrier()); - input.setInstallHw(dataObject.isInstallHw()); - input.setStrict(dataObject.isStrict()); - - // updating the staticflow cache - /* - * Commented out... as in many other places... use of ClusteringServices - * is breaking things insufficient time to debug Integer ordinal = - * staticFlowsOrdinal.get(0); staticFlowsOrdinal.put(0, ++ordinal); - * staticFlows.put(ordinal, dataObject); - */ - + input.setFlowTable(new FlowTableRef(createTableInstance(dataObject.getId(), dataObject.getNode()))); // We send flow to the sounthbound plugin - flowService.addFlow(input.build()); - - /* - * Commented out as this will also break due to improper use of - * ClusteringServices updateLocalDatabase((NodeFlow) dataObject, true); - */ } /** @@ -224,41 +94,14 @@ public class FlowConsumerImpl implements IForwardingRulesManager { * @param dataObject */ private void removeFlow(InstanceIdentifier path, Flow dataObject) { - + RemoveFlowInputBuilder input = new RemoveFlowInputBuilder(); + input.fieldsFrom(dataObject); input.setNode((dataObject).getNode()); - input.setPriority((dataObject).getPriority()); - input.setMatch((dataObject).getMatch()); - input.setCookie((dataObject).getCookie()); - input.setInstructions((dataObject).getInstructions()); - input.setBufferId(dataObject.getBufferId()); input.setTableId(dataObject.getTableId()); - input.setOutPort(dataObject.getOutPort()); - input.setOutGroup(dataObject.getOutGroup()); - input.setIdleTimeout(dataObject.getIdleTimeout()); - input.setHardTimeout(dataObject.getHardTimeout()); - input.setFlowName(dataObject.getFlowName()); - input.setFlags(dataObject.getFlags()); - input.setCookieMask(dataObject.getCookieMask()); - input.setContainerName(dataObject.getContainerName()); - input.setBarrier(dataObject.isBarrier()); - input.setInstallHw(dataObject.isInstallHw()); - input.setStrict(dataObject.isStrict()); - // updating the staticflow cache - /* - * Commented out due to problems caused by improper use of - * ClusteringServices Integer ordinal = staticFlowsOrdinal.get(0); - * staticFlowsOrdinal.put(0, ++ordinal); staticFlows.put(ordinal, - * dataObject); - */ - + input.setFlowTable(new FlowTableRef(createTableInstance((long)dataObject.getTableId(), (dataObject).getNode()))); // We send flow to the sounthbound plugin flowService.removeFlow(input.build()); - - /* - * Commented out due to problems caused by improper use of - * ClusteringServices updateLocalDatabase((NodeFlow) dataObject, false); - */ } /** @@ -267,32 +110,19 @@ public class FlowConsumerImpl implements IForwardingRulesManager { * @param path * @param dataObject */ - private void updateFlow(InstanceIdentifier path, Flow dataObject) { + private void updateFlow(InstanceIdentifier path, Flow updatedFlow, Flow originalFlow) { UpdateFlowInputBuilder input = new UpdateFlowInputBuilder(); UpdatedFlowBuilder updatedflowbuilder = new UpdatedFlowBuilder(); - updatedflowbuilder.fieldsFrom(dataObject); - input.setNode(dataObject.getNode()); - input.setUpdatedFlow(updatedflowbuilder.build()); - - // updating the staticflow cache - /* - * Commented out due to problems caused by improper use of - * ClusteringServices. Integer ordinal = staticFlowsOrdinal.get(0); - * staticFlowsOrdinal.put(0, ++ordinal); staticFlows.put(ordinal, - * dataObject); - */ - + updatedflowbuilder.fieldsFrom(updatedFlow); + input.setNode(updatedFlow.getNode()); + input.setUpdatedFlow(updatedflowbuilder.build()); + OriginalFlowBuilder ofb = new OriginalFlowBuilder(originalFlow); + input.setOriginalFlow(ofb.build()); // We send flow to the sounthbound plugin flowService.updateFlow(input.build()); - - /* - * Commented out due to problems caused by improper use of - * ClusteringServices. updateLocalDatabase((NodeFlow) dataObject, true); - */ } - - @SuppressWarnings("unchecked") + private void commitToPlugin(internalTransaction transaction) { Set, DataObject>> createdEntries = transaction.getModification() .getCreatedConfigurationData().entrySet(); @@ -320,16 +150,17 @@ public class FlowConsumerImpl implements IForwardingRulesManager { addFlow(entry.getKey(), (Flow) entry.getValue()); } } - for (@SuppressWarnings("unused") - Entry, DataObject> entry : updatedEntries) { + + for (Entry, DataObject> entry : updatedEntries) { if (entry.getValue() instanceof Flow) { logger.debug("Coming update cc in FlowDatacommitHandler"); - Flow flow = (Flow) entry.getValue(); - boolean status = validate(flow); + Flow updatedFlow = (Flow) entry.getValue(); + Flow originalFlow = (Flow) transaction.modification.getOriginalConfigurationData().get(entry.getKey()); + boolean status = validate(updatedFlow); if (!status) { return; } - updateFlow(entry.getKey(), (Flow) entry.getValue()); + updateFlow(entry.getKey(), updatedFlow, originalFlow); } } @@ -339,21 +170,20 @@ public class FlowConsumerImpl implements IForwardingRulesManager { logger.debug("Coming remove cc in FlowDatacommitHandler"); Flow flow = (Flow) removeValue; boolean status = validate(flow); + if (!status) { return; } + removeFlow(instanceId, (Flow) removeValue); - } } - } - private final class FlowDataCommitHandler implements DataCommitHandler, DataObject> { - + private final class FlowDataCommitHandler implements DataCommitHandler, DataObject> { + @SuppressWarnings("unchecked") - @Override - public DataCommitTransaction requestCommit(DataModification, DataObject> modification) { + public DataCommitTransaction, DataObject> requestCommit(DataModification, DataObject> modification) { // We should verify transaction logger.debug("Coming in FlowDatacommitHandler"); internalTransaction transaction = new internalTransaction(modification); @@ -374,54 +204,23 @@ public class FlowConsumerImpl implements IForwardingRulesManager { public internalTransaction(DataModification, DataObject> modification) { this.modification = modification; } - - Map, Flow> additions = new HashMap<>(); - Map, Flow> updates = new HashMap<>(); - Map, Flow> removals = new HashMap<>(); - + /** * 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() { + void prepareUpdate() { - Set, DataObject>> puts = modification.getUpdatedConfigurationData().entrySet(); - for (Entry, DataObject> entry : puts) { - } - - // removals = modification.getRemovedConfigurationData(); - Set> removedData = modification.getRemovedConfigurationData(); - for (InstanceIdentifier removal : removedData) { - DataObject value = modification.getOriginalConfigurationData().get(removal); - if (value instanceof Flow) { - removals.put(removal, (Flow) value); - } - } - - } - - private void preparePutEntry(InstanceIdentifier key, Flow flow) { - Flow original = originalSwView.get(key); - if (original != null) { - // It is update for us - updates.put(key, flow); - } else { - // It is addition for us - additions.put(key, flow); - } } - + /** * We are OK to go with execution of plan * */ @Override public RpcResult finish() throws IllegalStateException { - - commitToPlugin(this); - // We return true if internal transaction is successful. - // return Rpcs.getRpcResult(true, null, Collections.emptySet()); + commitToPlugin(this); return Rpcs.getRpcResult(true, null, Collections. emptySet()); } @@ -431,26 +230,47 @@ public class FlowConsumerImpl implements IForwardingRulesManager { * */ @Override - public RpcResult rollback() throws IllegalStateException { - // NOOP - we did not modified any internal state during - // requestCommit phase - // return Rpcs.getRpcResult(true, null, Collections.emptySet()); + public RpcResult rollback() throws IllegalStateException { + rollBackFlows(modification); return Rpcs.getRpcResult(true, null, Collections. emptySet()); - } + } + } - private boolean flowEntryExists(Flow flow) { - // Flow name has to be unique on per table id basis - for (ConcurrentMap.Entry entry : originalSwView.entrySet()) { - if (entry.getValue().getFlowName().equals(flow.getFlowName()) - && entry.getValue().getTableId().equals(flow.getTableId())) { - return true; - } - } - return false; + private void rollBackFlows(DataModification, DataObject> modification) { + Set, DataObject>> createdEntries = modification.getCreatedConfigurationData().entrySet(); + + /* + * This little dance is because updatedEntries contains both created and modified entries + * The reason I created a new HashSet is because the collections we are returned are immutable. + */ + Set, DataObject>> updatedEntries = new HashSet, DataObject>>(); + updatedEntries.addAll(modification.getUpdatedConfigurationData().entrySet()); + updatedEntries.removeAll(createdEntries); + + Set> removeEntriesInstanceIdentifiers = modification.getRemovedConfigurationData(); + for (Entry, DataObject> entry : createdEntries) { + if(entry.getValue() instanceof Flow) { + removeFlow(entry.getKey(),(Flow) entry.getValue()); // because we are rolling back, remove what we would have added. } } + + for (Entry, DataObject> entry : updatedEntries) { + if(entry.getValue() instanceof Flow) { + Flow updatedFlow = (Flow) entry.getValue(); + Flow originalFlow = (Flow) modification.getOriginalConfigurationData().get(entry.getKey()); + updateFlow(entry.getKey(), updatedFlow ,originalFlow);// because we are rolling back, replace the updated with the original + } + } + + for (InstanceIdentifier instanceId : removeEntriesInstanceIdentifiers ) { + DataObject removeValue = (Flow) modification.getOriginalConfigurationData().get(instanceId); + if(removeValue instanceof Flow) { + addFlow(instanceId,(Flow) removeValue);// because we are rolling back, add what we would have removed. + } + } +} final class FlowEventListener implements SalFlowListener { List addedFlows = new ArrayList<>(); @@ -489,58 +309,18 @@ public class FlowConsumerImpl implements IForwardingRulesManager { // TODO Auto-generated method stub } - } - // Commented out DataChangeListene - to be used by Stats - - // final class FlowDataListener implements DataChangeListener { - // private SalFlowService flowService; - // - // public FlowDataListener() { - // - // } - // - // @Override - // public void onDataChanged( - // DataChangeEvent, DataObject> change) { - // System.out.println("Coming in onDataChange.............."); - // @SuppressWarnings("unchecked") - // Collection additions = (Collection) - // change.getCreatedConfigurationData(); - // // we can check for getCreated, getDeleted or getUpdated from DataChange - // Event class - // for (DataObject dataObject : additions) { - // if (dataObject instanceof NodeFlow) { - // NodeRef nodeOne = createNodeRef("foo:node:1"); - // // validating the dataObject here - // AddFlowInputBuilder input = new AddFlowInputBuilder(); - // input.setNode(((NodeFlow) dataObject).getNode()); - // input.setNode(nodeOne); - // // input.setPriority(((NodeFlow) dataObject).getPriority()); - // //input.setMatch(((NodeFlow) dataObject).getMatch()); - // //input.setFlowTable(((NodeFlow) dataObject).getFlowTable()); - // //input.setCookie(((NodeFlow) dataObject).getCookie()); - // //input.setAction(((NodeFlow) dataObject).getAction()); - // - // @SuppressWarnings("unused") - // Future> result = - // flowService.addFlow(input.build()); - // } - // } - // } - // } - public boolean validate(Flow flow) { - String msg = ""; // Specific part of warn/error log boolean result = true; // flow Name validation - if (flow.getFlowName() == null || flow.getFlowName().trim().isEmpty() || !flow.getFlowName().matches(NAMEREGEX)) { + if (!FRMUtil.isNameValid(flow.getFlowName())) { msg = "Invalid Flow name"; result = false; } + // Node Validation if (result == true && flow.getNode() == null) { msg = "Node is null"; @@ -556,20 +336,7 @@ public class FlowConsumerImpl implements IForwardingRulesManager { result = false; } } - - // Presence check - /* - * This is breaking due to some improper use of caches... - * - * if (flowEntryExists(flow)) { String error = - * "Entry with this name on specified table already exists"; - * logger.warn( - * "Entry with this name on specified table already exists: {}" , - * entry); logger.error(error); return; } if - * (originalSwView.containsKey(entry)) { logger.warn( - * "Operation Rejected: A flow with same match and priority exists on the target node" - * ); logger.trace("Aborting to install {}", entry); continue; } - */ + if (!FRMUtil.validateMatch(flow)) { logger.error("Not a valid Match"); result = false; @@ -584,92 +351,15 @@ public class FlowConsumerImpl implements IForwardingRulesManager { } return result; } - - private static void updateLocalDatabase(NodeFlow entry, boolean add) { - - updateSwViewes(entry, add); - - updateNodeFlowsDB(entry, add); - - } - - /* - * Update the node mapped flows database - */ - private static void updateSwViewes(NodeFlow entry, boolean add) { - if (add) { - FlowConsumerImpl.originalSwView.put((FlowKey) entry, (Flow) entry); - installedSwView.put((FlowKey) entry, (Flow) entry); - } else { - originalSwView.remove(entry); - installedSwView.remove(entry); - - } - } - - @Override - public List get() { - - List orderedList = new ArrayList(); - ConcurrentMap flowMap = staticFlows; - int maxKey = staticFlowsOrdinal.get(0).intValue(); - for (int i = 0; i <= maxKey; i++) { - Flow entry = flowMap.get(i); - if (entry != null) { - orderedList.add(entry); - } - } - return orderedList; - } - - @Override - public DataObject getWithName(String name, org.opendaylight.controller.sal.core.Node n) { - if (this instanceof FlowConsumerImpl) { - for (ConcurrentMap.Entry flowEntry : staticFlows.entrySet()) { - Flow flow = flowEntry.getValue(); - if (flow.getNode().equals(n) && flow.getFlowName().equals(name)) { - - return flowEntry.getValue(); - } - } - } - return null; - } - - /* - * Update the node mapped flows database - */ - private static void updateNodeFlowsDB(NodeFlow entry, boolean add) { - Node node = (Node) entry.getNode(); - - List nodeIndeces = nodeFlows.get(node); - if (nodeIndeces == null) { - if (!add) { - return; - } else { - nodeIndeces = new ArrayList(); - } - } - - if (add) { - nodeIndeces.add((Flow) entry); - } else { - nodeIndeces.remove(entry); - } - - // Update cache across cluster - if (nodeIndeces.isEmpty()) { - nodeFlows.remove(node); - } else { - nodeFlows.put(node, nodeIndeces); - } - } - - private static NodeRef createNodeRef(String string) { - NodeKey key = new NodeKey(new NodeId(string)); - InstanceIdentifier path = InstanceIdentifier.builder().node(Nodes.class).node(Node.class, key) - .toInstance(); - - return new NodeRef(path); + + private InstanceIdentifier createTableInstance(Long tableId, NodeRef nodeRef) { + Table table; + InstanceIdentifier tableInstance; + TableBuilder builder = new TableBuilder(); + builder.setId(tableId); + builder.setKey(new TableKey(tableId, nodeRef)); + table = builder.build(); + tableInstance = InstanceIdentifier.builder(Tables.class).child(Table.class, table.getKey()).toInstance(); + return tableInstance; } } \ No newline at end of file diff --git a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/GroupConsumerImpl.java b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/GroupConsumerImpl.java index 6fbbd4d6e2..f4064f22ce 100644 --- a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/GroupConsumerImpl.java +++ b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/GroupConsumerImpl.java @@ -132,25 +132,22 @@ public class GroupConsumerImpl { * @param dataObject */ private void updateGroup(InstanceIdentifier path, - Group originalGroupDataObject, Group updatedGroupDataObject) { - - GroupKey groupKey = updatedGroupDataObject.getKey(); - // Node nodeInstanceID = path.firstIdentifierOf("Node"); + Group updatedGroupDataObject, Group originalGroupDataObject) { UpdatedGroupBuilder updateGroupBuilder = null; Status groupOperationStatus = validateGroup(updatedGroupDataObject); - + if (!groupOperationStatus.isSuccess()) { logger.error("Group data object validation failed %s" + updatedGroupDataObject.getGroupName()); return; } - UpdateGroupInputBuilder groupInputBuilder = new UpdateGroupInputBuilder(); + UpdateGroupInputBuilder groupInputBuilder = new UpdateGroupInputBuilder(); + updateGroupBuilder = new UpdatedGroupBuilder(updatedGroupDataObject); + updateGroupBuilder.setGroupId(new GroupId(updatedGroupDataObject.getId())); groupInputBuilder.setNode(updatedGroupDataObject.getNode()); - updateGroupBuilder = new UpdatedGroupBuilder(updatedGroupDataObject); - updateGroupBuilder.setGroupId(new GroupId(updatedGroupDataObject.getId())); groupInputBuilder.setUpdatedGroup(updateGroupBuilder.build()); OriginalGroupBuilder originalGroupBuilder = new OriginalGroupBuilder(originalGroupDataObject); - groupInputBuilder.setOriginalGroup(originalGroupBuilder.build()); + groupInputBuilder.setOriginalGroup(originalGroupBuilder.build()); groupService.updateGroup(groupInputBuilder.build()); return; } @@ -171,10 +168,8 @@ public class GroupConsumerImpl { } AddGroupInputBuilder groupData = new AddGroupInputBuilder(); - groupData.setBuckets(groupAddDataObject.getBuckets()); - groupData.setContainerName(groupAddDataObject.getContainerName()); - groupData.setGroupId(new GroupId(groupAddDataObject.getId())); - groupData.setGroupType(groupAddDataObject.getGroupType()); + groupData.fieldsFrom(groupAddDataObject); + groupData.setGroupId(new GroupId(groupAddDataObject.getId())); groupData.setNode(groupAddDataObject.getNode()); groupService.addGroup(groupData.build()); return; @@ -196,11 +191,9 @@ public class GroupConsumerImpl { } RemoveGroupInputBuilder groupData = new RemoveGroupInputBuilder(); - groupData.setBuckets(groupRemoveDataObject.getBuckets()); - groupData.setContainerName(groupRemoveDataObject.getContainerName()); - groupData.setGroupId(new GroupId(groupRemoveDataObject.getId())); - groupData.setGroupType(groupRemoveDataObject.getGroupType()); - groupData.setNode(groupRemoveDataObject.getNode()); + groupData.fieldsFrom(groupRemoveDataObject); + groupData.setGroupId(new GroupId(groupRemoveDataObject.getId())); + groupData.setNode(groupRemoveDataObject.getNode()); groupService.removeGroup(groupData.build()); return; } diff --git a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/MeterConsumerImpl.java b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/MeterConsumerImpl.java index 42d0897fb1..bf8c8b7f05 100644 --- a/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/MeterConsumerImpl.java +++ b/opendaylight/md-sal/forwardingrules-manager/src/main/java/org/opendaylight/controller/forwardingrulesmanager/consumer/impl/MeterConsumerImpl.java @@ -27,6 +27,13 @@ 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.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.OriginalGroupBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.Meters; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.meters.Meter; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.config.rev131024.meters.MeterKey; @@ -38,6 +45,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.Rem 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.service.rev130918.meter.update.OriginalMeterBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.BandType; @@ -53,35 +61,17 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class MeterConsumerImpl implements IForwardingRulesManager { +public class MeterConsumerImpl { protected static final Logger logger = LoggerFactory.getLogger(MeterConsumerImpl.class); private final MeterEventListener meterEventListener = new MeterEventListener(); private Registration meterListener; private SalMeterService meterService; private MeterDataCommitHandler commitHandler; - private ConcurrentMap originalSwMeterView; - @SuppressWarnings("unused") - private ConcurrentMap installedSwMeterView; - @SuppressWarnings("unused") - private ConcurrentMap> nodeMeters; - @SuppressWarnings("unused") - private ConcurrentMap inactiveMeters; - @SuppressWarnings("unused") - private IContainer container; - private IClusterContainerServices clusterMeterContainerService = null; - public MeterConsumerImpl() { InstanceIdentifier path = InstanceIdentifier.builder(Meters.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."); @@ -100,110 +90,7 @@ public class MeterConsumerImpl implements IForwardingRulesManager { 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 * @@ -213,11 +100,9 @@ public class MeterConsumerImpl implements IForwardingRulesManager { private Status addMeter(InstanceIdentifier path, Meter meterAddDataObject) { MeterKey meterKey = meterAddDataObject.getKey(); - if (null != meterKey && validateMeter(meterAddDataObject, FRMUtil.operation.ADD).isSuccess()) { + if (null != meterKey && validateMeter(meterAddDataObject).isSuccess()) { AddMeterInputBuilder meterBuilder = new AddMeterInputBuilder(); - meterBuilder.setContainerName(meterAddDataObject.getContainerName()); - meterBuilder.setFlags(meterAddDataObject.getFlags()); - meterBuilder.setMeterBandHeaders(meterAddDataObject.getMeterBandHeaders()); + meterBuilder.fieldsFrom(meterAddDataObject); meterBuilder.setMeterId(new MeterId(meterAddDataObject.getId())); meterBuilder.setNode(meterAddDataObject.getNode()); meterService.addMeter(meterBuilder.build()); @@ -235,16 +120,19 @@ public class MeterConsumerImpl implements IForwardingRulesManager { * * @param dataObject */ - private Status updateMeter(InstanceIdentifier path, Meter meterUpdateDataObject) { - MeterKey meterKey = meterUpdateDataObject.getKey(); + private Status updateMeter(InstanceIdentifier path, + Meter updatedMeter, Meter originalMeter) { UpdatedMeterBuilder updateMeterBuilder = null; - if (null != meterKey && validateMeter(meterUpdateDataObject, FRMUtil.operation.UPDATE).isSuccess()) { UpdateMeterInputBuilder updateMeterInputBuilder = new UpdateMeterInputBuilder(); + if (validateMeter(updatedMeter).isSuccess()) { + UpdateMeterInputBuilder updateMeterInputBuilder = new UpdateMeterInputBuilder(); + updateMeterInputBuilder.setNode(updatedMeter.getNode()); updateMeterBuilder = new UpdatedMeterBuilder(); - updateMeterBuilder.fieldsFrom(meterUpdateDataObject); - updateMeterBuilder.setMeterId(new MeterId(meterUpdateDataObject.getId())); - + updateMeterBuilder.fieldsFrom(updatedMeter); + updateMeterBuilder.setMeterId(new MeterId(updatedMeter.getId())); updateMeterInputBuilder.setUpdatedMeter(updateMeterBuilder.build()); + OriginalMeterBuilder originalMeterBuilder = new OriginalMeterBuilder(originalMeter); + updateMeterInputBuilder.setOriginalMeter(originalMeterBuilder.build()); meterService.updateMeter(updateMeterInputBuilder.build()); } else { return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed"); @@ -263,14 +151,11 @@ public class MeterConsumerImpl implements IForwardingRulesManager { private Status removeMeter(InstanceIdentifier path, Meter meterRemoveDataObject) { MeterKey meterKey = meterRemoveDataObject.getKey(); - if (null != meterKey && validateMeter(meterRemoveDataObject, FRMUtil.operation.DELETE).isSuccess()) { + if (null != meterKey && validateMeter(meterRemoveDataObject).isSuccess()) { RemoveMeterInputBuilder meterBuilder = new RemoveMeterInputBuilder(); - meterBuilder.setContainerName(meterRemoveDataObject.getContainerName()); - meterBuilder.setNode(meterRemoveDataObject.getNode()); - meterBuilder.setFlags(meterRemoveDataObject.getFlags()); - meterBuilder.setMeterBandHeaders(meterRemoveDataObject.getMeterBandHeaders()); - meterBuilder.setMeterId(new MeterId(meterRemoveDataObject.getId())); - meterBuilder.setNode(meterRemoveDataObject.getNode()); + meterBuilder.fieldsFrom(meterRemoveDataObject); + meterBuilder.setNode(meterRemoveDataObject.getNode()); + meterBuilder.setMeterId(new MeterId(meterRemoveDataObject.getId())); meterService.removeMeter(meterBuilder.build()); } else { return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed"); @@ -279,22 +164,11 @@ public class MeterConsumerImpl implements IForwardingRulesManager { return new Status(StatusCode.SUCCESS); } - public Status validateMeter(Meter meter, FRMUtil.operation operation) { - String containerName; + public Status validateMeter(Meter meter) { String meterName; Status returnStatus = null; 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); @@ -303,7 +177,7 @@ public class MeterConsumerImpl implements IForwardingRulesManager { } for (int i = 0; i < meter.getMeterBandHeaders().getMeterBandHeader().size(); i++) { - if (!meter.getFlags().isMeterBurst()) { + if (null != meter.getFlags() && !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, @@ -315,7 +189,7 @@ public class MeterConsumerImpl implements IForwardingRulesManager { if (null != returnStatus && !returnStatus.isSuccess()) { return returnStatus; - } else { + } else if (null != meter.getMeterBandHeaders()) { BandType setBandType = null; DscpRemark dscpRemark = null; for (int i = 0; i < meter.getMeterBandHeaders().getMeterBandHeader().size(); i++) { @@ -338,6 +212,47 @@ public class MeterConsumerImpl implements IForwardingRulesManager { return new Status(StatusCode.SUCCESS); } + private RpcResult commitToPlugin(InternalTransaction transaction) { + DataModification, DataObject> modification = transaction.modification; + //get created entries + Set, DataObject>> createdEntries = + modification.getCreatedConfigurationData().entrySet(); + + //get updated entries + Set, DataObject>> updatedEntries = + new HashSet, DataObject>>(); + + updatedEntries.addAll(modification.getUpdatedConfigurationData().entrySet()); + updatedEntries.removeAll(createdEntries); + + //get removed entries + Set> removeEntriesInstanceIdentifiers = + modification.getRemovedConfigurationData(); + + for (Entry, DataObject> entry : createdEntries) { + if(entry.getValue() instanceof Meter) { + addMeter(entry.getKey(), (Meter)entry.getValue()); + } + } + + for (Entry, DataObject> entry : updatedEntries) { + if(entry.getValue() instanceof Meter) { + Meter originalMeter = (Meter) modification.getOriginalConfigurationData().get(entry.getKey()); + Meter updatedMeter = (Meter) entry.getValue(); + updateMeter(entry.getKey(), originalMeter, updatedMeter); + } + } + + for (InstanceIdentifier instanceId : removeEntriesInstanceIdentifiers ) { + DataObject removeValue = modification.getOriginalConfigurationData().get(instanceId); + if(removeValue instanceof Meter) { + removeMeter(instanceId, (Meter)removeValue); + } + } + + return Rpcs.getRpcResult(true, null, Collections.emptySet()); + } + final class InternalTransaction implements DataCommitTransaction, DataObject> { private final DataModification, DataObject> modification; @@ -351,38 +266,13 @@ public class MeterConsumerImpl implements IForwardingRulesManager { 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>> addMeter = modification.getCreatedConfigurationData().entrySet(); - for (Entry, DataObject> entry : addMeter) { - if (entry.getValue() instanceof Meter) { - Meter meter = (Meter) entry.getValue(); - additions.put(entry.getKey(), meter); - } - - } + void prepareUpdate() { - Set, DataObject>> updateMeter = modification.getUpdatedConfigurationData().entrySet(); - for (Entry, DataObject> entry : updateMeter) { - if (entry.getValue() instanceof Meter) { - Meter meter = (Meter) entry.getValue(); - ///will be fixed once getUpdatedConfigurationData returns only updated data not created data with it. - if (!additions.containsKey(entry.getKey())) { - updates.put(entry.getKey(), meter); - } - } - } - - removals = modification.getRemovedConfigurationData(); } /** @@ -392,9 +282,7 @@ public class MeterConsumerImpl implements IForwardingRulesManager { @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()); + RpcResult rpcStatus = commitToPlugin(this); return rpcStatus; } @@ -404,43 +292,13 @@ public class MeterConsumerImpl implements IForwardingRulesManager { * */ @Override - public RpcResult rollback() throws IllegalStateException { - // NOOP - we did not modified any internal state during - // requestCommit phase - // return Rpcs.getRpcResult(true, null, Collections.emptySet()); + public RpcResult rollback() throws IllegalStateException { return Rpcs.getRpcResult(true, null, Collections.emptySet()); } } - private RpcResult commitToPlugin(InternalTransaction transaction) { - for (Entry, Meter> entry : transaction.additions.entrySet()) { - - if (!addMeter(entry.getKey(), entry.getValue()).isSuccess()) { - return Rpcs.getRpcResult(false, null, Collections.emptySet()); - } - } - for (Entry, Meter> entry : transaction.updates.entrySet()) { - - if (!updateMeter(entry.getKey(), entry.getValue()).isSuccess()) { - return Rpcs.getRpcResult(false, null, Collections.emptySet()); - } - } - - for (InstanceIdentifier meterId : transaction.removals) { - DataObject removeValue = transaction.getModification().getOriginalConfigurationData().get(meterId); - - if(removeValue instanceof Meter) { - if(!removeMeter(meterId, (Meter)removeValue).isSuccess()) { - return Rpcs.getRpcResult(false, null, Collections.emptySet()); - } - } - } - - return Rpcs.getRpcResult(true, null, Collections.emptySet()); - } - private final class MeterDataCommitHandler implements DataCommitHandler, DataObject> { @Override public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction, DataObject> requestCommit( @@ -475,32 +333,5 @@ public class MeterConsumerImpl implements IForwardingRulesManager { // TODO Auto-generated method stub } - } - - @Override - public List get() { - - List orderedList = new ArrayList(); - Collection meterList = originalSwMeterView.values(); - for (Iterator iterator = meterList.iterator(); iterator.hasNext();) { - orderedList.add(iterator.next()); - } - return orderedList; - } - - @Override - public DataObject getWithName(String name, Node n) { - if (this instanceof MeterConsumerImpl) { - Collection meterList = originalSwMeterView.values(); - for (Iterator iterator = meterList.iterator(); iterator.hasNext();) { - Meter meter = iterator.next(); - if (meter.getNode().equals(n) && meter.getMeterName().equals(name)) { - - return meter; - } - } - } - - return null; - } + } } -- 2.36.6