X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fforwardingrules-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fforwardingrulesmanager%2Fconsumer%2Fimpl%2FMeterConsumerImpl.java;h=bf8c8b7f05b912b3075c81a52a1f978fb76a284f;hp=bd0ceb3fea8011aaa575dea0e71e4cbb8a1032c9;hb=d904bd30445bd0f6d670afd5f5b6f8225410256a;hpb=e7c8982a45c9ee5789d7ba25bb0324065efbe23e 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 bd0ceb3fea..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 @@ -2,6 +2,7 @@ package org.opendaylight.controller.forwardingrulesmanager.consumer.impl; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; @@ -26,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; @@ -33,10 +41,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.Add 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.RemoveMeterInputBuilder; 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; 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; @@ -45,39 +56,22 @@ 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.RpcError; 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; - private ConcurrentMap installedSwMeterView; - - private ConcurrentMap> nodeMeters; - private ConcurrentMap inactiveMeters; - - private IClusterContainerServices clusterMeterContainerService = null; - private IContainer container; - public MeterConsumerImpl() { - InstanceIdentifier path = InstanceIdentifier.builder(Meters.class).child(Meter.class) - .toInstance(); + 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."); @@ -96,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 * @@ -208,22 +99,14 @@ 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 (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 { + + if (null != meterKey && validateMeter(meterAddDataObject).isSuccess()) { + AddMeterInputBuilder meterBuilder = new AddMeterInputBuilder(); + meterBuilder.fieldsFrom(meterAddDataObject); + meterBuilder.setMeterId(new MeterId(meterAddDataObject.getId())); + meterBuilder.setNode(meterAddDataObject.getNode()); + meterService.addMeter(meterBuilder.build()); + } else { return new Status(StatusCode.BADREQUEST, "Meter Key or attribute validation failed"); } @@ -237,31 +120,20 @@ 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()) { - - if (originalSwMeterView.containsKey(meterKey)) { - originalSwMeterView.remove(meterKey); - originalSwMeterView.put(meterKey, meterUpdateDataObject); - } - - if (meterUpdateDataObject.isInstall()) { - UpdateMeterInputBuilder updateMeterInputBuilder = new UpdateMeterInputBuilder(); - updateMeterBuilder = new UpdatedMeterBuilder(); - updateMeterBuilder.fieldsFrom(meterUpdateDataObject); - updateMeterInputBuilder.setUpdatedMeter(updateMeterBuilder.build()); - - if (installedSwMeterView.containsKey(meterKey)) { - installedSwMeterView.remove(meterKey); - installedSwMeterView.put(meterKey, meterUpdateDataObject); - } - - meterService.updateMeter(updateMeterInputBuilder.build()); - } - + + if (validateMeter(updatedMeter).isSuccess()) { + UpdateMeterInputBuilder updateMeterInputBuilder = new UpdateMeterInputBuilder(); + updateMeterInputBuilder.setNode(updatedMeter.getNode()); + updateMeterBuilder = new UpdatedMeterBuilder(); + 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"); } @@ -276,18 +148,15 @@ public class MeterConsumerImpl implements IForwardingRulesManager { * * @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(); - - installedSwMeterView.put(meterKey, meterUpdateDataObject); - meterService.updateMeter(updateMeterBuilder.build()); - } - - originalSwMeterView.put(meterKey, meterUpdateDataObject); + private Status removeMeter(InstanceIdentifier path, Meter meterRemoveDataObject) { + MeterKey meterKey = meterRemoveDataObject.getKey(); + + if (null != meterKey && validateMeter(meterRemoveDataObject).isSuccess()) { + RemoveMeterInputBuilder meterBuilder = new RemoveMeterInputBuilder(); + 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"); } @@ -295,23 +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; - 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); @@ -319,20 +176,8 @@ public class MeterConsumerImpl implements IForwardingRulesManager { 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 (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, @@ -344,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++) { @@ -367,47 +212,48 @@ public class MeterConsumerImpl implements IForwardingRulesManager { 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) { + 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()); } - - 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> { + + final class InternalTransaction implements DataCommitTransaction, DataObject> { private final DataModification, DataObject> modification; @@ -416,45 +262,17 @@ public class MeterConsumerImpl implements IForwardingRulesManager { return modification; } - public internalTransaction(DataModification, DataObject> 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); - } + void prepareUpdate() { + } /** @@ -464,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; } @@ -476,23 +292,19 @@ 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()); - return Rpcs.getRpcResult(true, null, null); + public RpcResult rollback() throws IllegalStateException { + 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( DataModification, DataObject> modification) { // We should verify transaction - System.out.println("Coming in MeterDataCommitHandler"); - internalTransaction transaction = new internalTransaction(modification); + InternalTransaction transaction = new InternalTransaction(modification); transaction.prepareUpdate(); return transaction; } @@ -521,31 +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; - } + } }