From b38840f0ca28b5968bf3841e7bde37d8904ca878 Mon Sep 17 00:00:00 2001 From: Tomas Cere Date: Thu, 28 May 2015 09:56:12 +0200 Subject: [PATCH] BUG 2610: Delete config:service instance via restconf Adds support for removing service instances to config subsystem. Change-Id: I92211a67d1e74ca4421bd0158f2c3600fabc18cc Signed-off-by: Tomas Cere --- .../mapping/config/Services.java | 29 ++++++++++++++----- .../operations/editconfig/EditConfig.java | 14 ++++++--- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java index a49eda31f1..74655f938f 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Services.java @@ -23,11 +23,13 @@ import org.opendaylight.controller.netconf.api.xml.XmlNetconfConstants; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.ObjectNameAttributeReadingStrategy; import org.opendaylight.controller.netconf.util.xml.XmlElement; import org.opendaylight.controller.netconf.util.xml.XmlUtil; +import org.opendaylight.yangtools.yang.data.api.ModifyAction; import org.w3c.dom.Document; import org.w3c.dom.Element; public final class Services { + private static final String EMPTY_PROVIDER = ""; private static final String PROVIDER_KEY = "provider"; private static final String NAME_KEY = "name"; public static final String TYPE_KEY = "type"; @@ -68,9 +70,11 @@ public final class Services { } String refName = refEntry.getKey(); - - ServiceInstance serviceInstance = ServiceInstance.fromString(refEntry.getValue()); - refNameToInstance.put(refName, serviceInstance); + //we want to compare reference not value of the provider + refNameToInstance.put(refName, refEntry.getValue() == EMPTY_PROVIDER + //provider name cannot be EMPTY_PROVIDER instance unless we are executing delete + ? ServiceInstance.EMPTY_SERVICE_INSTANCE + : ServiceInstance.fromString(refEntry.getValue())); } } @@ -114,12 +118,21 @@ public final class Services { XmlElement nameElement = instance.getOnlyChildElement(NAME_KEY); String refName = nameElement.getTextContent(); - XmlElement providerElement = instance.getOnlyChildElement(PROVIDER_KEY); - String providerName = providerElement.getTextContent(); + if (!ModifyAction.DELETE.toString().toLowerCase().equals( + instance.getAttribute( + XmlNetconfConstants.OPERATION_ATTR_KEY, + XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0))) + { + XmlElement providerElement = instance.getOnlyChildElement(PROVIDER_KEY); + String providerName = providerElement.getTextContent(); - instance.checkUnrecognisedElements(nameElement, providerElement); + instance.checkUnrecognisedElements(nameElement, providerElement); - innerMap.put(refName, providerName); + innerMap.put(refName, providerName); + } else { + //since this is a delete we dont have a provider name - we want empty service instance + innerMap.put(refName, EMPTY_PROVIDER); + } } } @@ -161,6 +174,8 @@ public final class Services { } public static final class ServiceInstance { + public static final ServiceInstance EMPTY_SERVICE_INSTANCE = new ServiceInstance("", ""); + public ServiceInstance(String moduleName, String instanceName) { this.moduleName = moduleName; this.instanceName = instanceName; diff --git a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java index 7948bb6f42..ab2a081fb3 100644 --- a/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java +++ b/opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java @@ -36,6 +36,7 @@ import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementDefinition; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementResolved; import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Services; +import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Services.ServiceInstance; import org.opendaylight.controller.netconf.confignetconfconnector.operations.AbstractConfigNetconfOperation; import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfigXmlParser.EditConfigExecution; import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreContext; @@ -155,11 +156,16 @@ public class EditConfig extends AbstractConfigNetconfOperation { for (Map.Entry refNameToServiceEntry : refNameToInstance.entrySet()) { ObjectName on = refNameToServiceEntry.getValue().getObjectName(ta.getTransactionName()); try { - ObjectName saved = ta.saveServiceReference(qnameOfService, refNameToServiceEntry.getKey(), on); - LOG.debug("Saving service {} with on {} under name {} with service on {}", qnameOfService, - on, refNameToServiceEntry.getKey(), saved); + if (ServiceInstance.EMPTY_SERVICE_INSTANCE == refNameToServiceEntry.getValue()) { + ta.removeServiceReference(qnameOfService, refNameToServiceEntry.getKey()); + LOG.debug("Removing service {} with name {}", qnameOfService, refNameToServiceEntry.getKey()); + } else { + ObjectName saved = ta.saveServiceReference(qnameOfService, refNameToServiceEntry.getKey(), on); + LOG.debug("Saving service {} with on {} under name {} with service on {}", qnameOfService, + on, refNameToServiceEntry.getKey(), saved); + } } catch (InstanceNotFoundException e) { - throw new NetconfDocumentedException(String.format("Unable to save ref name " + refNameToServiceEntry.getKey() + " for instance " + on, e), + throw new NetconfDocumentedException(String.format("Unable to edit ref name " + refNameToServiceEntry.getKey() + " for instance " + on, e), ErrorType.application, ErrorTag.operation_failed, ErrorSeverity.error); -- 2.36.6