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%2FEditConfig.java;h=1bb1d9bfba7babf8fa2dc504909e4f89b6730530;hb=30c43b1714eff95a8b7b601888fdb03da7150216;hp=de21f310e234ba92424204e1719090caf7d79876;hpb=a92d9d6a21a0f6ca8d2153795721f500eaf29ee9;p=controller.git 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 de21f310e2..1bb1d9bfba 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 @@ -21,8 +21,14 @@ import org.opendaylight.controller.netconf.api.NetconfDocumentedException; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorSeverity; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorTag; import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorType; -import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.*; +import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Config; +import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.InstanceConfig; +import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.InstanceConfigElementResolved; +import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleConfig; +import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementResolved; +import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Services; import org.opendaylight.controller.netconf.confignetconfconnector.operations.AbstractConfigNetconfOperation; +import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfigXmlParser.EditConfigExecution; import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider; import org.opendaylight.controller.netconf.util.xml.XmlElement; import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; @@ -31,6 +37,7 @@ import org.slf4j.LoggerFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; +import javax.management.InstanceNotFoundException; import javax.management.ObjectName; import java.util.HashMap; import java.util.Map; @@ -56,6 +63,7 @@ public class EditConfig extends AbstractConfigNetconfOperation { @VisibleForTesting Element getResponseInternal(final Document document, final EditConfigXmlParser.EditConfigExecution editConfigExecution) throws NetconfDocumentedException { + if (editConfigExecution.shouldTest()) { executeTests(configRegistryClient, editConfigExecution); } @@ -84,9 +92,9 @@ public class EditConfig extends AbstractConfigNetconfOperation { } private void executeTests(ConfigRegistryClient configRegistryClient, - EditConfigXmlParser.EditConfigExecution editConfigExecution) throws NetconfDocumentedException { + EditConfigExecution editConfigExecution) throws NetconfDocumentedException { try { - test(configRegistryClient, editConfigExecution.resolvedXmlElements); + test(configRegistryClient, editConfigExecution, editConfigExecution.getDefaultStrategy()); } catch (IllegalStateException | JmxAttributeValidationException | ValidationException e) { logger.warn("Test phase for {} failed", EditConfigXmlParser.EDIT_CONFIG, e); final Map errorInfo = new HashMap<>(); @@ -98,15 +106,17 @@ public class EditConfig extends AbstractConfigNetconfOperation { } private void test(ConfigRegistryClient configRegistryClient, - Map> resolvedModules) { + EditConfigExecution execution, EditStrategyType editStrategyType) { ObjectName taON = transactionProvider.getTestTransaction(); try { // default strategy = replace wipes config - if (EditStrategyType.defaultStrategy() == EditStrategyType.replace) { + if (editStrategyType == EditStrategyType.replace) { transactionProvider.wipeTestTransaction(taON); } - setOnTransaction(configRegistryClient, resolvedModules, taON); + + setOnTransaction(configRegistryClient, execution.getResolvedXmlElements(), execution.getServices(), taON); + // TODO add service reference persistance testing here transactionProvider.validateTestTransaction(taON); } finally { transactionProvider.abortTestTransaction(taON); @@ -118,14 +128,48 @@ public class EditConfig extends AbstractConfigNetconfOperation { ObjectName taON = transactionProvider.getOrCreateTransaction(); // default strategy = replace wipes config - if (EditStrategyType.defaultStrategy() == EditStrategyType.replace) { + if (editConfigExecution.getDefaultStrategy() == EditStrategyType.replace) { transactionProvider.wipeTransaction(); } - setOnTransaction(configRegistryClient, editConfigExecution.resolvedXmlElements, taON); + + setOnTransaction(configRegistryClient, editConfigExecution.getResolvedXmlElements(), + editConfigExecution.getServices(), taON); + setServicesOnTransaction(configRegistryClient, editConfigExecution.getServices(), taON); + } + + private void setServicesOnTransaction(ConfigRegistryClient configRegistryClient, Services services, + ObjectName taON) { + ConfigTransactionClient ta = configRegistryClient.getConfigTransactionClient(taON); + + Map>> namespaceToServiceNameToRefNameToInstance = services + .getNamespaceToServiceNameToRefNameToInstance(); + + for (String serviceNamespace : namespaceToServiceNameToRefNameToInstance.keySet()) { + for (String serviceName : namespaceToServiceNameToRefNameToInstance.get(serviceNamespace).keySet()) { + + String qnameOfService = getQname(ta, serviceNamespace, serviceName); + Map refNameToInstance = namespaceToServiceNameToRefNameToInstance + .get(serviceNamespace).get(serviceName); + + for (String refName : refNameToInstance.keySet()) { + ObjectName on = refNameToInstance.get(refName).getObjectName(ta.getTransactionName()); + // TODO check for duplicates + try { + ta.saveServiceReference(qnameOfService, refName, on); + } catch (InstanceNotFoundException e) { + throw new IllegalStateException("Unable to save ref name " + refName + " for instance " + on, e); + } + } + } + } + } + + private String getQname(ConfigTransactionClient ta, String namespace, String serviceName) { + return ta.getServiceInterfaceName(namespace, serviceName); } private void setOnTransaction(ConfigRegistryClient configRegistryClient, - Map> resolvedXmlElements, ObjectName taON) { + Map> resolvedXmlElements, Services services, ObjectName taON) { ConfigTransactionClient ta = configRegistryClient.getConfigTransactionClient(taON); for (Multimap modulesToResolved : resolvedXmlElements.values()) { @@ -137,20 +181,24 @@ public class EditConfig extends AbstractConfigNetconfOperation { InstanceConfigElementResolved ice = moduleElementResolved.getInstanceConfigElementResolved(); EditConfigStrategy strategy = ice.getEditStrategy(); - strategy.executeConfiguration(moduleName, instanceName, ice.getConfiguration(), ta); + strategy.executeConfiguration(moduleName, instanceName, ice.getConfiguration(), ta, services); } } } public static Config getConfigMapping(ConfigRegistryClient configRegistryClient, - Map> mBeanEntries) { + Map> mBeanEntries) { Map> factories = transform(configRegistryClient, mBeanEntries); + return new Config(factories); } // TODO refactor - private static Map> transform(final ConfigRegistryClient configRegistryClient, - Map> mBeanEntries) { + private static Map> transform + (final ConfigRegistryClient configRegistryClient, Map> mBeanEntries) { return Maps.transformEntries(mBeanEntries, new Maps.EntryTransformer, Map>() { @@ -160,9 +208,9 @@ public class EditConfig extends AbstractConfigNetconfOperation { new Maps.EntryTransformer() { @Override - public ModuleConfig transformEntry(String key, ModuleMXBeanEntry value) { - return new ModuleConfig(key, new InstanceConfig(configRegistryClient, value - .getAttributes())); + public ModuleConfig transformEntry(String key, ModuleMXBeanEntry moduleMXBeanEntry) { + return new ModuleConfig(key, new InstanceConfig(configRegistryClient, moduleMXBeanEntry + .getAttributes()), moduleMXBeanEntry.getProvidedServices().values()); } }); } @@ -180,11 +228,11 @@ public class EditConfig extends AbstractConfigNetconfOperation { EditConfigXmlParser.EditConfigExecution editConfigExecution; Config cfg = getConfigMapping(configRegistryClient, yangStoreSnapshot.getModuleMXBeanEntryMap()); try { - editConfigExecution = editConfigXmlParser.fromXml(xml, cfg); + editConfigExecution = editConfigXmlParser.fromXml(xml, cfg, transactionProvider, configRegistryClient); } catch (IllegalStateException e) { logger.warn("Error parsing xml", e); final Map errorInfo = new HashMap<>(); - errorInfo.put(ErrorTag.missing_attribute.name(), "Missing value for 'target' attribute"); + errorInfo.put(ErrorTag.missing_attribute.name(), "Error parsing xml: " + e.getMessage()); throw new NetconfDocumentedException(e.getMessage(), ErrorType.rpc, ErrorTag.missing_attribute, ErrorSeverity.error, errorInfo); } catch (final IllegalArgumentException e) {