X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnetconf%2Fconfig-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetconf%2Fconfignetconfconnector%2Foperations%2Feditconfig%2FMergeEditConfigStrategy.java;h=d8ceb311038e6f0602832448a32de27db6d3e664;hb=79202e1fd05d2606b35e163f608fad9cce84b5d4;hp=3e5707cf6ddbc29f842d50fe5cde929458604a91;hpb=567792806ed799ac649cc125bffb4debde40d254;p=controller.git diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/MergeEditConfigStrategy.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/MergeEditConfigStrategy.java index 3e5707cf6d..d8ceb31103 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/MergeEditConfigStrategy.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/MergeEditConfigStrategy.java @@ -8,9 +8,14 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; -import org.opendaylight.controller.config.api.jmx.ObjectNameUtil; +import static java.util.Arrays.asList; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import javax.management.Attribute; +import javax.management.ObjectName; import org.opendaylight.controller.config.util.ConfigTransactionClient; import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.confignetconfconnector.exception.NetconfConfigHandlingException; @@ -19,28 +24,17 @@ import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.management.Attribute; -import javax.management.InstanceNotFoundException; -import javax.management.ObjectName; -import java.util.Map; -import java.util.Map.Entry; - public class MergeEditConfigStrategy extends AbstractEditConfigStrategy { private static final Logger logger = LoggerFactory.getLogger(MergeEditConfigStrategy.class); - private final Multimap providedServices; public MergeEditConfigStrategy() { - this.providedServices = HashMultimap.create(); - } - public MergeEditConfigStrategy(Multimap providedServices) { - this.providedServices = providedServices; } @Override void handleMissingInstance(Map configuration, ConfigTransactionClient ta, - String module, String instance, ServiceRegistryWrapper services) throws NetconfConfigHandlingException { + String module, String instance, ServiceRegistryWrapper services) throws NetconfConfigHandlingException { throw new NetconfConfigHandlingException( String.format("Unable to handle missing instance, no missing instances should appear at this point, missing: %s : %s ", module, @@ -50,31 +44,8 @@ public class MergeEditConfigStrategy extends AbstractEditConfigStrategy { NetconfDocumentedException.ErrorSeverity.error); } - private void addRefNames(ServiceRegistryWrapper services, Multimap providedServices, ConfigTransactionClient ta, ObjectName on) throws InstanceNotFoundException { - for (Entry namespaceToService : providedServices.entries()) { - - if(services.hasRefName(namespaceToService.getKey(), - namespaceToService.getValue(), on)){ - continue; - } - - String refName = services.getNewDefaultRefName(namespaceToService.getKey(), namespaceToService.getValue(), - ObjectNameUtil.getFactoryName(on), ObjectNameUtil.getInstanceName(on)); - ta.saveServiceReference( - ta.getServiceInterfaceName(namespaceToService.getKey(), namespaceToService.getValue()), refName, on); - } - } - @Override void executeStrategy(Map configuration, ConfigTransactionClient ta, ObjectName on, ServiceRegistryWrapper services) throws NetconfConfigHandlingException { - try { - addRefNames(services, providedServices, ta, on); - } catch (InstanceNotFoundException e) { - throw new NetconfConfigHandlingException(String.format("Unable to save default ref name for instance %s. Instance was not found.",e), - NetconfDocumentedException.ErrorType.application, - NetconfDocumentedException.ErrorTag.operation_failed, - NetconfDocumentedException.ErrorSeverity.error); - } for (Entry configAttributeEntry : configuration.entrySet()) { try { @@ -85,10 +56,16 @@ public class MergeEditConfigStrategy extends AbstractEditConfigStrategy { continue; } - Object value = ace.getResolvedValue().get(); - ta.setAttribute(on, ace.getJmxName(), new Attribute(ace.getJmxName(), value)); - logger.debug("Attribute {} set to {} for {}", configAttributeEntry.getKey(), value, on); + Object toBeMergedIn = ace.getResolvedValue().get(); + // Get the existing values so we can merge the new values with them. + Attribute currentAttribute = ta.getAttribute(on, ace.getJmxName()); + Object oldValue = (currentAttribute != null ? currentAttribute.getValue() : null); + // Merge value with currentValue + toBeMergedIn = merge(oldValue, toBeMergedIn); + ta.setAttribute(on, ace.getJmxName(), new Attribute(ace.getJmxName(), toBeMergedIn)); + logger.debug("Attribute {} set to {} for {}", configAttributeEntry.getKey(), toBeMergedIn, on); } catch (Exception e) { + logger.error("Error while merging objectnames of {}", on, e); throw new NetconfConfigHandlingException(String.format("Unable to set attributes for %s, Error with attribute %s : %s ", on, configAttributeEntry.getKey(), @@ -99,4 +76,44 @@ public class MergeEditConfigStrategy extends AbstractEditConfigStrategy { } } } + + /** + * Merge value into current value + * Currently, this is only implemented for arrays of ObjectNames, but that is the + * most common case for which it is needed. + */ + protected Object merge(Object oldValue, Object toBeMergedIn) { + if (oldValue instanceof ObjectName[] && toBeMergedIn instanceof ObjectName[]) { + toBeMergedIn = mergeObjectNameArrays((ObjectName[]) oldValue, (ObjectName[]) toBeMergedIn); + } + return toBeMergedIn; + } + + /** + * Merge value into current values + * This implements for arrays of ObjectNames, but that is the + * most common case for which it is needed. + * + * @param oldValue - the new values to be merged into existing values + * @param toBeMergedIn - the existing values + * + * @return an ObjectName[] consisting the elements of currentValue with an elements from values not already present in currentValue added + * + */ + protected ObjectName[] mergeObjectNameArrays(ObjectName[] oldValue, ObjectName[] toBeMergedIn) { + List newValueList = new ArrayList<>(); + newValueList.addAll(asList(oldValue)); + /* + It is guaranteed that old values do not contain transaction name. + Since toBeMergedIn is filled using service references translated by ServiceRegistryWrapper, it + is also guaranteed that this list will not contain transaction names. + Run through the list of values to be merged. If we don't have them already, add them to the list. + */ + for (ObjectName objName : toBeMergedIn) { + if (!newValueList.contains(objName)) { + newValueList.add(objName); + } + } + return newValueList.toArray(new ObjectName[newValueList.size()]); + } }