diff options
Diffstat (limited to 'appc-dg/appc-dg-shared/appc-dg-netconf')
16 files changed, 1972 insertions, 0 deletions
diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/.gitignore b/appc-dg/appc-dg-shared/appc-dg-netconf/.gitignore new file mode 100644 index 000000000..b83d22266 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/.settings/org.eclipse.wst.common.project.facet.core.xml b/appc-dg/appc-dg-shared/appc-dg-netconf/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 000000000..f4ef8aa0a --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<faceted-project> + <installed facet="java" version="1.8"/> +</faceted-project> diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/pom.xml b/appc-dg/appc-dg-shared/appc-dg-netconf/pom.xml new file mode 100644 index 000000000..c9ec4d9b8 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/pom.xml @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.openecomp.appc</groupId> + <artifactId>appc-dg-shared</artifactId> + <version>1.0.0</version> + </parent> + <artifactId>appc-dg-netconf</artifactId> + <packaging>bundle</packaging> + + <dependencies> + <dependency> + <groupId>org.openecomp.appc</groupId> + <artifactId>appc-common</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.openecomp.appc</groupId> + <artifactId>appc-netconf-adapter-bundle</artifactId> + <version>${project.version}</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.openecomp.appc</groupId> + <artifactId>appc-dg-common</artifactId> + <version>${project.version}</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.openecomp.sdnc.core</groupId> + <artifactId>sli-common</artifactId> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.openecomp.sdnc.core</groupId> + <artifactId>sli-provider</artifactId> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <scope>test</scope> + + </dependency> + <dependency> + <groupId>org.powermock</groupId> + <artifactId>powermock-api-mockito</artifactId> + <version>1.6.2</version> + <scope>test</scope> + + </dependency> + <dependency> + <groupId>org.powermock</groupId> + <artifactId>powermock-module-junit4</artifactId> + <version>1.6.2</version> + <scope>test</scope> + </dependency> + + + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <extensions>true</extensions> + <configuration> + <instructions> + <Bundle-SymbolicName>appc-dg-netconf</Bundle-SymbolicName> + <Export-Package>org.openecomp.appc.dg.netconf</Export-Package> + <Private-Package>org.openecomp.appc.dg.netconf.impl.*</Private-Package> + <Import-Package>!org.apache.log,!org.apache.commons.logging,!groovy.lang,!javax.jms,!org.codehaus.commons.compiler,!org.codehaus.groovy.*,!org.codehaus.janino,!com.ibm.icu.*,!com.sun.faces.*,!org.jasypt.*,*</Import-Package> + <Embed-Dependency>appc-common,eelf-core,logback-core,logback-classic;scope=compile|runtime;inline=false</Embed-Dependency> + <Embed-Transitive>true</Embed-Transitive> + </instructions> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfClientPlugin.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfClientPlugin.java new file mode 100644 index 000000000..3b75f4070 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfClientPlugin.java @@ -0,0 +1,39 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf; + +import java.util.Map; + +import org.openecomp.appc.exceptions.APPCException; +import org.openecomp.sdnc.sli.SvcLogicContext; +import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; + + + +public interface NetconfClientPlugin extends SvcLogicJavaPlugin { + void configure(Map<String, String> params, SvcLogicContext ctx) throws APPCException; + void operationStateValidation(Map<String, String> params, SvcLogicContext ctx) throws APPCException; + void modifyConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException; + void backupConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException; + void getConfig(Map<String, String> params, SvcLogicContext ctx) throws APPCException; + void getRunningConfig(Map<String, String> params, SvcLogicContext ctx) throws APPCException; +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfDBPlugin.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfDBPlugin.java new file mode 100644 index 000000000..a48be94c7 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/NetconfDBPlugin.java @@ -0,0 +1,37 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf; + +import java.util.Map; + +import org.openecomp.appc.exceptions.APPCException; +import org.openecomp.sdnc.sli.SvcLogicContext; +import org.openecomp.sdnc.sli.SvcLogicJavaPlugin; + + + +public interface NetconfDBPlugin extends SvcLogicJavaPlugin { + void retrieveDSConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException; + void retrieveVMDSConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException; + void retrieveConfigFile(Map<String, String> params, SvcLogicContext ctx) throws APPCException; + void retrieveConnectionDetails(Map<String, String> params, SvcLogicContext ctx) throws APPCException; +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImpl.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImpl.java new file mode 100644 index 000000000..d063b5d28 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImpl.java @@ -0,0 +1,316 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.openecomp.appc.adapter.netconf.*; +import org.openecomp.appc.adapter.netconf.util.Constants; +import org.openecomp.appc.dg.netconf.NetconfClientPlugin; +import org.openecomp.appc.exceptions.APPCException; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.openecomp.sdnc.sli.SvcLogicContext; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; + +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; + + + +public class NetconfClientPluginImpl implements NetconfClientPlugin { + + private static final String NETCONF_CLIENT_FACTORY_NAME = "org.openecomp.appc.adapter.netconf.NetconfClientFactory"; + private static ObjectMapper mapper = new ObjectMapper(); + private static EELFLogger logger = EELFManager.getInstance().getApplicationLogger(); + + private NetconfDataAccessService dao; + private NetconfClientFactory clientFactory; + + public NetconfClientPluginImpl() { + BundleContext bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); + ServiceReference srefNetconfClientFactory = bctx.getServiceReference(NetconfClientFactory.class); + clientFactory = (NetconfClientFactory) bctx.getService(srefNetconfClientFactory); + } + + public void setDao(NetconfDataAccessService dao) { + this.dao = dao; + this.dao.setSchema(Constants.NETCONF_SCHEMA); + } + + public void configure(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + + try { + NetconfClient client = clientFactory.GetNetconfClient(NetconfClientType.SSH); + try { + NetconfConnectionDetails connectionDetails = mapper.readValue(params.get("connection-details"), NetconfConnectionDetails.class); + String netconfMessage = params.get("file-content"); + client.connect(connectionDetails); + client.configure(netconfMessage); + } catch (IOException e) { + logger.error("Error " + e.getMessage()); + throw new APPCException(e); + } finally { + client.disconnect(); + } + } catch (Exception e) { + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage()); + logger.error("Error " + e.getMessage()); + throw e; + } + } + + @Override + public void operationStateValidation(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + if (logger.isTraceEnabled()) { + logger.trace("Entering to operationStateValidation with params = "+ ObjectUtils.toString(params)+", SvcLogicContext = "+ObjectUtils.toString(ctx)); + } + try{ + String paramName = Constants.VNF_TYPE_FIELD_NAME; + String vfType = params.get(paramName); + validateMandatoryParam(paramName, vfType); + VnfType vnfType = VnfType.getVnfType(vfType); + + paramName = Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME; + String vnfHostIpAddress = params.get(paramName); + validateMandatoryParam(paramName, vnfHostIpAddress); + + //get connectionDetails + String connectionDetailsStr = params.get(Constants.CONNECTION_DETAILS_FIELD_NAME); + NetconfConnectionDetails connectionDetails = null; + if(StringUtils.isEmpty(connectionDetailsStr)){ + connectionDetails = retrieveConnectionDetails(vnfType); + connectionDetails.setHost(vnfHostIpAddress); + ctx.setAttribute(Constants.CONNECTION_DETAILS_FIELD_NAME, mapper.writeValueAsString(connectionDetails)); + }else{ + connectionDetails = mapper.readValue(connectionDetailsStr, NetconfConnectionDetails.class); + } + if(connectionDetails == null){ + throw new IllegalStateException("missing connectionDetails for VnfType:"+vnfType.name()); + } + + //get operationsStateNetconfMessage + OperationalStateValidator operationalStateValidator = OperationalStateValidatorFactory.getOperationalStateValidator(vnfType); + String configurationFileName = operationalStateValidator.getConfigurationFileName(); + String operationsStateNetconfMessage = null; + if(!StringUtils.isEmpty(configurationFileName)){ + operationsStateNetconfMessage = retrieveConfigurationFileContent(configurationFileName); + } + + //connect checK Opertaions state and dissconnect + NetconfClient client = clientFactory.GetNetconfClient(NetconfClientType.SSH); + try { + client.connect(connectionDetails); + String response = null; + if(!StringUtils.isEmpty(operationsStateNetconfMessage)) { + response = client.exchangeMessage(operationsStateNetconfMessage); + } + operationalStateValidator.validateResponse(response); + } finally { + client.disconnect(); + } + } catch (APPCException e) { + logger.error(e.getMessage()); + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.toString()); + throw e; + } + catch (Exception e) { + logger.error(e.toString()); + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.toString()); + throw new APPCException(e); + } + } + + @Override + public void modifyConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + this.configure(params, ctx); + } + + @Override + public void backupConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + + NetconfClient client = null; + try { + if (logger.isDebugEnabled()) { + logger.debug("Entered backup to DEVICE_INTERFACE_LOG"); + } + + client = clientFactory.GetNetconfClient(NetconfClientType.SSH); + //get connection details + NetconfConnectionDetails connectionDetails = mapper.readValue(params.get("connection-details"), NetconfConnectionDetails.class); + //connect the client and get configuration + client.connect(connectionDetails); + String configuration = client.getConfiguration(); + + //store configuration in database + dao.logDeviceInteraction(null,null,getCurrentDateTime(),configuration); + + } catch (Exception e) { + logger.error("Error " + e.getMessage()); + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage()); + throw new APPCException(e); + } finally { + //disconnect the client + if(client != null) { + client.disconnect(); + } + } + } + + @Override + public void getConfig(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + NetconfClient client = null; + String confId=params.get("conf-id"); + if(confId.equalsIgnoreCase("current")){ + try { + if (logger.isDebugEnabled()) { + logger.debug("Entered getConfig to DEVICE_INTERFACE_LOG"); + } + //get netconf client to get configuration + BundleContext bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); + ServiceReference sref = bctx.getServiceReference(NETCONF_CLIENT_FACTORY_NAME); + NetconfClientFactory clientFactory = (NetconfClientFactory) bctx.getService(sref); + client = clientFactory.GetNetconfClient(NetconfClientType.SSH); + //get connection details + NetconfConnectionDetails connectionDetails = mapper.readValue(params.get("connection-details"), NetconfConnectionDetails.class); + //connect the client and get configuration + client.connect(connectionDetails); + String configuration = client.getConfiguration(); + if(configuration !=null){ + // logger.info("*************************************Configuration Output*************************************"); + // logger.info(configuration); + String fullConfig = ctx.getAttribute("fullConfig"); + fullConfig = fullConfig==null?"":fullConfig; + ctx.setAttribute("fullConfig",fullConfig + configuration); + + ctx.setAttribute("getConfig_Result","Success"); + String entityName=ctx.getAttribute("entity");//VM name + if(entityName!=null){ + ctx.setAttribute(entityName+".Configuration",configuration); + } + }else{ + ctx.setAttribute("getConfig_Result","failure"); + } + //store configuration in database + /*NetconfJDBC dsImpl = new NetconfJDBCImpl(); + dsImpl.logDeviceInteraction(null,null,getCurrentDateTime(),configuration);*/ + + } catch (Exception e) { + ctx.setAttribute("getConfig_Result","failure"); + logger.error("Error " + e.getMessage()); + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage()); + throw new APPCException(e); + } finally { + //disconnect the client + if(client != null) { + client.disconnect(); + } + } + }else{ + logger.info("Current Conf id value is not supported"); + } + + } + + + @Override + public void getRunningConfig(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + NetconfClient client = null; + try { + logger.info("Entered getRunningConfig to DEVICE_INTERFACE_LOG"); + //get netconf client to get configuration + BundleContext bctx = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); + ServiceReference sref = bctx.getServiceReference(NETCONF_CLIENT_FACTORY_NAME); + NetconfClientFactory clientFactory = (NetconfClientFactory) bctx.getService(sref); + client = clientFactory.GetNetconfClient(NetconfClientType.SSH); + //get connection details + NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails(); + connectionDetails.setHost(params.get("host-ip-address")); + connectionDetails.setUsername(params.get("user-name")); + connectionDetails.setPassword(params.get("password")); + connectionDetails.setPort(!("".equalsIgnoreCase(params.get("port-number")))?Integer.parseInt(params.get("port-number")):NetconfConnectionDetails.DEFAULT_PORT); + //connect the client and get configuration + client.connect(connectionDetails); + String configuration = client.getConfiguration(); + if(configuration !=null){ + // logger.info("*************************************Configuration Output*************************************"); + ctx.setAttribute("running-config", configuration); + + ctx.setAttribute("getRunningConfig_Result","Success"); + }else{ + ctx.setAttribute("getRunningConfig_Result","failure"); + } + } catch (Exception e) { + ctx.setAttribute("getRunningConfig_Result","failure"); + logger.error("Error " + e.getMessage()); + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage()); + throw new APPCException(e); + } finally { + //disconnect the client + if(client != null) { + client.disconnect(); + } + } + } + + private String getCurrentDateTime() { + + DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + Date date = new Date(); + return dateFormat.format(date); + } + + private int getPort(String s) { + int port = 830; + if((s != null) && !s.isEmpty()) { + port = Integer.parseInt(s); + } + return port; + } + + void validateMandatoryParam(String paramName, String paramValue) { + if(StringUtils.isEmpty(paramValue)){ + throw new IllegalArgumentException("input "+paramName+" param is empty"); + } + } + + public NetconfConnectionDetails retrieveConnectionDetails( VnfType vnfType) throws APPCException{ + + NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails(); + if (!dao.retrieveNetconfConnectionDetails(vnfType.getFamilyType().name(), connectionDetails)) { + logger.error("Missing configuration for " + vnfType.getFamilyType().name()); + throw new APPCException("Missing configuration for " + vnfType.getFamilyType().name() + " in " + Constants.DEVICE_AUTHENTICATION_TABLE_NAME); + } + return connectionDetails; + } + + public String retrieveConfigurationFileContent(String configFileName){ + return dao.retrieveConfigFileName(configFileName); + } + +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImpl.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImpl.java new file mode 100644 index 000000000..6fdfcc14c --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImpl.java @@ -0,0 +1,122 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.util.Map; + +import org.openecomp.appc.adapter.netconf.NetconfConnectionDetails; +import org.openecomp.appc.adapter.netconf.NetconfDataAccessService; +import org.openecomp.appc.adapter.netconf.exception.DataAccessException; +import org.openecomp.appc.adapter.netconf.util.Constants; +import org.openecomp.appc.dg.netconf.NetconfDBPlugin; +import org.openecomp.appc.exceptions.APPCException; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.openecomp.sdnc.sli.SvcLogicContext; + +public class NetconfDBPluginImpl implements NetconfDBPlugin { + + private static EELFLogger logger = EELFManager.getInstance().getApplicationLogger(); + private static ObjectMapper mapper = new ObjectMapper(); + + // populated by blueprint framework + private NetconfDataAccessService daoService; + + public void setDaoService(NetconfDataAccessService daoService) { + this.daoService = daoService; + this.daoService.setSchema(Constants.NETCONF_SCHEMA); + } + + public NetconfDBPluginImpl() { + } + + public void retrieveDSConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + + try { + String fileContent = daoService.retrieveConfigFileName(params.get(Constants.CONFIGURATION_FILE_FIELD_NAME)); + ctx.setAttribute(Constants.FILE_CONTENT_FIELD_NAME, fileContent); + } catch(DataAccessException e) { + logger.error("Error " + e.getMessage()); + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage()); + throw e; + } + + getConnection(params, ctx); + } + + @Override + public void retrieveVMDSConfiguration(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + logger.info("Setting entity value :" +params.get(Constants.RESOURCEKEY)); + ctx.setAttribute("entity", params.get(Constants.RESOURCEKEY)); + NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails(); + try { + if (!daoService.retrieveNetconfConnectionDetails(params.get(Constants.RESOURCEKEY), connectionDetails)) { + ctx.setAttribute("retrieveVMDSConfiguration_Result","failure"); + logger.error("Missing configuration for " + params.get(Constants.VNF_TYPE_FIELD_NAME)); + throw new APPCException("Missing configuration for " + params.get(Constants.VNF_TYPE_FIELD_NAME) + " in " + Constants.DEVICE_AUTHENTICATION_TABLE_NAME); + } + // fileContent = dsImpl.retrieveConfigFileName(params.get(Constants.CONFIGURATION_FILE_FIELD_NAME)); + // ctx.setAttribute(Constants.FILE_CONTENT_FIELD_NAME, fileContent); + ctx.setAttribute(Constants.CONNECTION_DETAILS_FIELD_NAME, mapper.writeValueAsString(connectionDetails)); + ctx.setAttribute("retrieveVMDSConfiguration_Result","success"); + } catch(APPCException e) { + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage()); + throw e; + } catch(DataAccessException | JsonProcessingException e) { + logger.error("Error " + e.getMessage()); + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage()); + throw new APPCException(e); + } + } + + @Override + public void retrieveConfigFile(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + String fileContent = daoService.retrieveConfigFileName(params.get(Constants.CONFIGURATION_FILE_FIELD_NAME)); + ctx.setAttribute(Constants.FILE_CONTENT_FIELD_NAME, fileContent); + } + + public void retrieveConnectionDetails(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + getConnection(params, ctx); + } + + private void getConnection(Map<String, String> params, SvcLogicContext ctx) throws APPCException { + NetconfConnectionDetails connectionDetails = new NetconfConnectionDetails(); + try { + if (!daoService.retrieveNetconfConnectionDetails(params.get(Constants.VNF_TYPE_FIELD_NAME), connectionDetails)) { + logger.error("Missing configuration for " + params.get(Constants.VNF_TYPE_FIELD_NAME)); + throw new APPCException("Missing configuration for " + params.get(Constants.VNF_TYPE_FIELD_NAME) + " in " + Constants.DEVICE_AUTHENTICATION_TABLE_NAME); + } + connectionDetails.setHost(params.get(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME)); + ctx.setAttribute(Constants.CONNECTION_DETAILS_FIELD_NAME, mapper.writeValueAsString(connectionDetails)); + } catch(APPCException e) { + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage()); + throw e; + } catch(DataAccessException | JsonProcessingException e) { + logger.error("Error " + e.getMessage()); + ctx.setAttribute(Constants.DG_OUTPUT_STATUS_MESSAGE, e.getMessage()); + throw new APPCException(e); + } + } +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/resources/OSGI-INF/blueprint/blueprint.xml new file mode 100644 index 000000000..0b58ce0af --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/main/resources/OSGI-INF/blueprint/blueprint.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ============LICENSE_START======================================================= + openECOMP : APP-C + ================================================================================ + Copyright (C) 2017 AT&T Intellectual Property. All rights + reserved. + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ============LICENSE_END========================================================= + --> + +<!-- + Starter Blueprint Camel Definition appc-aai-adapter-blueprint +--> +<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> + + <reference id="DataAccessServiceRef" availability="mandatory" activation="eager" interface="org.openecomp.appc.adapter.netconf.NetconfDataAccessService" /> + + + <bean id="NetconfDBPluginBean" class="org.openecomp.appc.dg.netconf.impl.NetconfDBPluginImpl" scope="singleton"> + <property name="daoService" ref="DataAccessServiceRef" /> + </bean> + <service id="NetconfDBPlugin" interface="org.openecomp.appc.dg.netconf.NetconfDBPlugin" ref="NetconfDBPluginBean"/> + + <bean id="NetconfClientPluginBean" class="org.openecomp.appc.dg.netconf.impl.NetconfClientPluginImpl" scope="singleton"> + <property name="dao" ref="DataAccessServiceRef" /> + </bean> + <service id="NetconfClientPlugin" interface="org.openecomp.appc.dg.netconf.NetconfClientPlugin" ref="NetconfClientPluginBean"/> + +</blueprint> diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/DAOServiceMock.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/DAOServiceMock.java new file mode 100644 index 000000000..38d74c300 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/DAOServiceMock.java @@ -0,0 +1,97 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import java.util.HashMap; + +import org.openecomp.appc.adapter.netconf.ConnectionDetails; +import org.openecomp.appc.adapter.netconf.NetconfConnectionDetails; +import org.openecomp.appc.adapter.netconf.NetconfDataAccessService; +import org.openecomp.appc.adapter.netconf.exception.DataAccessException; +import org.openecomp.sdnc.sli.resource.dblib.DbLibService; + +class DAOServiceMock implements NetconfDataAccessService { + + private String configFile; + private ConnectionDetails connection; + private HashMap<String, String> backupConf; + + @Override + public void setSchema(String schema) { + } + + @Override + public void setDbLibService(DbLibService dbLibService) { + } + + void setConfigFile(String configFile) { + this.configFile = configFile; + } + + public HashMap<String, String> getBackupConf() { + return backupConf; + } + + public void setConnection(ConnectionDetails connection) { + this.connection = connection; + } + + @Override + public String retrieveConfigFileName(String xmlID) throws DataAccessException { + if (!xmlID.equals("wrong")) { + return configFile; + } else { + throw new DataAccessException(); + } + } + + @Override + public boolean retrieveConnectionDetails(String vnfType, ConnectionDetails connectionDetails) throws + DataAccessException { + return false; + } + + @Override + public boolean retrieveNetconfConnectionDetails(String vnfType, NetconfConnectionDetails connectionDetails) throws + DataAccessException { + if (vnfType.equals("VNF")) { + connectionDetails.setHost(connection.getHost()); + connectionDetails.setPassword(connection.getPassword()); + connectionDetails.setPort(connection.getPort()); + connectionDetails.setUsername(connection.getUsername()); + + return true; + } else { + return false; + } + } + + @Override + public boolean logDeviceInteraction(String instanceId, String requestId, String creationDate, String logText) throws + DataAccessException { + this.backupConf = new HashMap<>(); + backupConf.put("creationDate", creationDate); + backupConf.put("logText", logText); + return true; + } + +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/MockOperationalStateValidatorImpl.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/MockOperationalStateValidatorImpl.java new file mode 100644 index 000000000..7109fe8e8 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/MockOperationalStateValidatorImpl.java @@ -0,0 +1,61 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import org.openecomp.appc.adapter.netconf.OperationalStateValidator; +import org.openecomp.appc.adapter.netconf.VnfType; +import org.openecomp.appc.exceptions.APPCException; + + +public class MockOperationalStateValidatorImpl implements OperationalStateValidator { + + private boolean validated; + private String configurationFileName; + + public boolean isValidated() { + return validated; + } + + @Override + public VnfType getVnfType() { + return null; + } + + @Override + public String getConfigurationFileName() { + return configurationFileName; + } + + @Override + public void validateResponse(String response) throws APPCException { + if (response.equals("wrong")) { + throw new APPCException(); + } else { + this.validated = true; + } + + } + + public void setConfigurationFileName(String configurationFileName) { + this.configurationFileName = configurationFileName; + } +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientFactoryMock.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientFactoryMock.java new file mode 100644 index 000000000..73dba9a29 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientFactoryMock.java @@ -0,0 +1,43 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import org.openecomp.appc.adapter.netconf.NetconfClient; +import org.openecomp.appc.adapter.netconf.NetconfClientFactory; +import org.openecomp.appc.adapter.netconf.NetconfClientType; +import org.openecomp.appc.adapter.netconf.jsch.NetconfClientJsch; +import org.openecomp.appc.adapter.netconf.odlconnector.NetconfClientRestconfImpl; + + +public class NetconfClientFactoryMock extends NetconfClientFactory { + + private final NetconfClientJschMock jschClient = new NetconfClientJschMock(); + + @Override + public NetconfClient GetNetconfClient(NetconfClientType type){ + + return jschClient; + + } +} + + diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientJschMock.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientJschMock.java new file mode 100644 index 000000000..5c01724f1 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientJschMock.java @@ -0,0 +1,100 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import org.openecomp.appc.adapter.netconf.NetconfClient; +import org.openecomp.appc.adapter.netconf.NetconfConnectionDetails; +import org.openecomp.appc.exceptions.APPCException; + + +public class NetconfClientJschMock implements NetconfClient { + + private boolean connection; + private String lastMessage; + private String answer = "answer"; + private String configuration; + private NetconfConnectionDetails lastConnectionDetails; + + public boolean isConnection() { + return connection; + } + + public String getLastMessage() { + return lastMessage; + } + + public String getAnswer() { + return answer; + } + + public String getConf() { + return configuration; + } + + public void setConf(String configuration) { + this.configuration = configuration; + } + + public void setAnswer(String answer) { + this.answer = answer; + } + + public NetconfConnectionDetails getLastConnectionDetails() { + return lastConnectionDetails; + } + + @Override + public void connect(NetconfConnectionDetails connectionDetails) throws APPCException { + this.connection = true; + this.lastConnectionDetails = connectionDetails; + + } + + @Override + public String exchangeMessage(String message) throws APPCException { + if (connection) { + this.lastMessage = message; + return answer; + } else return null; + } + + @Override + public void configure(String configuration) throws APPCException { + if (connection) { + this.configuration = configuration; + } + + } + + @Override + public String getConfiguration() throws APPCException { + if (connection) { + return configuration; + } else return null; + } + + @Override + public void disconnect() throws APPCException { + this.connection = false; + + } +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImplTest.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImplTest.java new file mode 100644 index 000000000..b3bb4858a --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfClientPluginImplTest.java @@ -0,0 +1,678 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Matchers; +import org.mockito.Mockito; +import org.openecomp.appc.adapter.netconf.*; +import org.openecomp.appc.adapter.netconf.util.Constants; +import org.openecomp.appc.dg.netconf.impl.NetconfClientPluginImpl; +import org.openecomp.appc.exceptions.APPCException; +import org.openecomp.sdnc.sli.SvcLogicContext; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; +import org.osgi.framework.ServiceReference; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.lang.reflect.Field; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import static org.powermock.api.mockito.PowerMockito.when; + + + +@RunWith(PowerMockRunner.class) +@PrepareForTest({OperationalStateValidatorFactory.class, NetconfClientPluginImpl.class, FrameworkUtil.class, ObjectMapper.class}) + +public class NetconfClientPluginImplTest { + private NetconfClientPluginImpl netconfClientPlugin; + private NetconfDataAccessService dao; + private NetconfClientFactory clientFactory; + private Map<String, String> params; + + private final BundleContext bundleContext = Mockito.mock(BundleContext.class); + private final Bundle bundleService = Mockito.mock(Bundle.class); + private final ServiceReference sref1 = Mockito.mock(ServiceReference.class); + private final ServiceReference sref2 = Mockito.mock(ServiceReference.class); + private final ServiceReference sref3 = Mockito.mock(ServiceReference.class); + private static final String DG_OUTPUT_STATUS_MESSAGE = "output.status.message"; + + + String host = "http://www.test.com"; + String host1 = "http://www.test1.com"; + String vnfType = "VNF"; + int port = 8080; + String username = "test"; + String password = "test"; + String connectionDetails = "{\"host\":\"" + host + "\",\"port\":" + port + ",\"username\":\"" + username + "\",\"password\":\"" + password + "\",\"capabilities\":null,\"additionalProperties\":null}"; + String fileContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + + "<rpc message-id=\"101\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" + + "\t<get-config>\n" + + "\t\t<source>\n" + + "\t\t\t<running/>\n" + + "\t\t </source>\n" + + "\t</get-config>\n" + + "</rpc>'"; + String operationalState = "<rpc message-id=\"101\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" + + " <get>\n" + + " <filter>\n" + + " <ManagedElement xmlns=\"urn:org:openecomp:appc:Test\">\n" + + " <VnfFunction xmlns=\"urn:org:openecomop:appc:Test\">\n" + + " <ProcessorManagement>\n" + + " <MatedPair>\n" + + " <operationalState/>\n" + + " <PayloadProcessor>\n" + + " <operationalState/>\n" + + " </PayloadProcessor>\n" + + " </MatedPair>\n" + + " <SystemController>\n" + + " <operationalState/>\n" + + " </SystemController>\n" + + " </ProcessorManagement>\n" + + " </VnfFunction>\n" + + " </ManagedElement>\n" + + " </filter>\n" + + " </get>\n" + + "</rpc>\n"; + + + @Before + public void setUp() throws NoSuchFieldException, IllegalAccessException { + clientFactory = new NetconfClientFactoryMock(); + + } + + + @Test + public void testConfigure() throws Exception { + + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + + params = new HashMap<>(); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails); + params.put(Constants.FILE_CONTENT_FIELD_NAME, fileContent); + + netconfClientPlugin.configure(params, ctx); + + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + + try { + Assert.assertEquals("wrong configuration", fileContent, client.getConf()); + Assert.assertEquals("wrong host", host, client.getLastConnectionDetails().getHost()); + Assert.assertEquals("wrong port", port, client.getLastConnectionDetails().getPort()); + Assert.assertEquals("wrong username", username, client.getLastConnectionDetails().getUsername()); + Assert.assertEquals("wrong password", password, client.getLastConnectionDetails().getPassword()); + Assert.assertFalse(client.isConnection()); + } catch (Exception e) { + Assert.fail("failed with because of " + e.getCause()); + } + + + } + + + @Test + public void testConfigureNegativeIOException() throws Exception { + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + + params = new HashMap<>(); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, "{" + connectionDetails); + params.put(Constants.FILE_CONTENT_FIELD_NAME, fileContent); + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + + + try { + netconfClientPlugin.configure(params, ctx); + Assert.assertTrue(false); + } catch (APPCException e) { + Assert.assertNull(client.getLastConnectionDetails()); + Assert.assertNull(client.getConf()); + } + + } + + @Test + public void testOperationStateValidation() throws Exception { + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + DAOServiceMock daoServiceMock = (DAOServiceMock) dao; + daoServiceMock.setConfigFile(fileContent); + + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setAnswer(operationalState); + + + params = new HashMap<>(); + params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType); + params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails); + MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl(); + validatorMock.setConfigurationFileName("VnfGetRunningConfig"); + + PowerMockito.mockStatic(OperationalStateValidatorFactory.class); + when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock); + + netconfClientPlugin.operationStateValidation(params, ctx); + + Assert.assertTrue("validation process failed", validatorMock.isValidated()); + Assert.assertEquals(fileContent, client.getLastMessage()); + } + + + @Test + public void testOperationStateValidationNegativeJsonProcessingNullIllegalStateException() throws Exception { + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + DAOServiceMock daoServiceMock = (DAOServiceMock) dao; + daoServiceMock.setConfigFile(fileContent); + + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setAnswer(operationalState); + + params = new HashMap<>(); + params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType); + params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails); + MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl(); + validatorMock.setConfigurationFileName("VnfGetRunningConfig"); + + PowerMockito.mockStatic(OperationalStateValidatorFactory.class); + when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock); + substituteMapper(true); + + try { + netconfClientPlugin.operationStateValidation(params, ctx); + substituteMapper(false); + } catch (APPCException e) { + substituteMapper(false); + Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE)); + Assert.assertFalse(validatorMock.isValidated()); + Assert.assertNull(client.getLastMessage()); + } + } + + @Test + public void testOperationStateValidationNegativeConnectionDetailsAreNullNullPointerException() throws Exception { + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + DAOServiceMock daoServiceMock = (DAOServiceMock) dao; + daoServiceMock.setConfigFile(fileContent); + + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setAnswer(operationalState); + + + params = new HashMap<>(); + params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType); + params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, null); + MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl(); + validatorMock.setConfigurationFileName("VnfGetRunningConfig"); + + PowerMockito.mockStatic(OperationalStateValidatorFactory.class); + when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock); + ObjectMapper mapper = PowerMockito.mock(ObjectMapper.class); + final NetconfConnectionDetails netconfConnectionDetails = null; + when(mapper.readValue(Matchers.anyString(), Matchers.any(Class.class))).thenReturn(netconfConnectionDetails); + + + try { + netconfClientPlugin.operationStateValidation(params, ctx); + Assert.assertTrue(false); + } catch (APPCException e) { + Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE)); + Assert.assertFalse("validation process failed", validatorMock.isValidated()); + + } + } + + + @Test + public void testOperationStateValidationNegativeAppcException() throws Exception { + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + DAOServiceMock daoServiceMock = (DAOServiceMock) dao; + daoServiceMock.setConfigFile(fileContent); + + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setAnswer("wrong"); + + + params = new HashMap<>(); + params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType); + params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails); + MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl(); + validatorMock.setConfigurationFileName("VnfGetRunningConfig"); + + PowerMockito.mockStatic(OperationalStateValidatorFactory.class); + when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock); + + + try { + netconfClientPlugin.operationStateValidation(params, ctx); + Assert.assertTrue(false); + } catch (APPCException e) { + Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE)); + Assert.assertFalse("validation process failed", validatorMock.isValidated()); + + } + } + + + @Test + public void testOperationStateValidatioConnectionDetailsInParamsAreEmpty() throws Exception { + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + DAOServiceMock daoServiceMock = (DAOServiceMock) dao; + daoServiceMock.setConfigFile(fileContent); + + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setAnswer(operationalState); + ((DAOServiceMock) dao).setConnection(getConnectionDetails()); + + + params = new HashMap<>(); + params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType); + params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, ""); + MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl(); + validatorMock.setConfigurationFileName("VnfGetRunningConfig"); + + PowerMockito.mockStatic(OperationalStateValidatorFactory.class); + when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock); + + netconfClientPlugin.operationStateValidation(params, ctx); + + Assert.assertTrue("validation process failed", validatorMock.isValidated()); + Assert.assertEquals(fileContent, client.getLastMessage()); + } + + @Test + public void testOperationStateValidatioConnectionDetailsInParamsAreNull() throws Exception { + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + DAOServiceMock daoServiceMock = (DAOServiceMock) dao; + daoServiceMock.setConfigFile(fileContent); + + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setAnswer(operationalState); + ((DAOServiceMock) dao).setConnection(getConnectionDetails()); + + + params = new HashMap<>(); + params.put(Constants.VNF_TYPE_FIELD_NAME, vnfType); + params.put(Constants.VNF_HOST_IP_ADDRESS_FIELD_NAME, host1); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, null); + MockOperationalStateValidatorImpl validatorMock = new MockOperationalStateValidatorImpl(); + validatorMock.setConfigurationFileName("VnfGetRunningConfig"); + + PowerMockito.mockStatic(OperationalStateValidatorFactory.class); + when(OperationalStateValidatorFactory.getOperationalStateValidator(Matchers.any(VnfType.class))).thenReturn(validatorMock); + + netconfClientPlugin.operationStateValidation(params, ctx); + + Assert.assertTrue("validation process failed", validatorMock.isValidated()); + Assert.assertEquals(fileContent, client.getLastMessage()); + } + + + @Test + public void testBackupConfiguration() throws Exception { + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + params = new HashMap<>(); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails); + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setConf(fileContent); + netconfClientPlugin.backupConfiguration(params, ctx); + + DAOServiceMock mockdao = (DAOServiceMock) dao; + DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); + Date date = new Date(); + String creationDateExpected = dateFormat.format(date); + String creationDateActual = mockdao.getBackupConf().get("creationDate").substring(0, 10); + + + Assert.assertEquals("wrong configuration in db", fileContent, mockdao.getBackupConf().get("logText")); + Assert.assertEquals(creationDateExpected, creationDateActual); + + + } + + + @Test + public void testBackupConfigurationNegativeDgErrorFieldName() throws Exception { + shortInit(); + SvcLogicContext ctx = new SvcLogicContext(); + params = new HashMap<>(); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, "{" + connectionDetails); + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setConf(fileContent); + try { + netconfClientPlugin.backupConfiguration(params, ctx); + Assert.assertTrue(false); + } catch (APPCException e) { + Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE)); + + DAOServiceMock mockdao = (DAOServiceMock) dao; + Assert.assertNull(mockdao.getBackupConf()); + } + + } + + @Test + public void testGetConfig() throws Exception { + fullInit(); + String entity = "123"; + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("entity", entity); + + params = new HashMap<>(); + params.put("conf-id", "current"); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails); + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setConf(fileContent); + + + netconfClientPlugin.getConfig(params, ctx); + + Assert.assertEquals("Success", ctx.getAttribute("getConfig_Result")); + Assert.assertEquals(fileContent, ctx.getAttribute("fullConfig")); + Assert.assertNotNull(ctx.getAttribute(entity + ".Configuration")); + Assert.assertEquals(fileContent, ctx.getAttribute(entity + ".Configuration")); + } + + + @Test + public void testGetConfigNegativeConfigurationNull() throws Exception { + fullInit(); + String entity = "123"; + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("entity", entity); + + params = new HashMap<>(); + params.put("conf-id", "current"); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails); + + + netconfClientPlugin.getConfig(params, ctx); + + Assert.assertEquals("failure", ctx.getAttribute("getConfig_Result")); + Assert.assertNull(ctx.getAttribute("fullConfig")); + Assert.assertNull(ctx.getAttribute(entity + ".Configuration")); + Assert.assertNull(ctx.getAttribute(entity + ".Configuration")); + } + + + @Test + public void testGetConfigNegativeNotSupportedConfId() throws Exception { + fullInit(); + String entity = "123"; + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("entity", entity); + + params = new HashMap<>(); + params.put("conf-id", "current1"); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, connectionDetails); + + + netconfClientPlugin.getConfig(params, ctx); + + Assert.assertNull(ctx.getAttribute("getConfig_Result")); + Assert.assertNull(ctx.getAttribute("fullConfig")); + Assert.assertNull(ctx.getAttribute(entity + ".Configuration")); + Assert.assertNull(ctx.getAttribute(entity + ".Configuration")); + } + + @Test + public void testGetConfigNegativeWronjJsonConnectionDetailsException() throws Exception { + fullInit(); + String entity = "123"; + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("entity", entity); + + params = new HashMap<>(); + params.put("conf-id", "current"); + params.put(Constants.CONNECTION_DETAILS_FIELD_NAME, "{" + connectionDetails); + + + try { + netconfClientPlugin.getConfig(params, ctx); + Assert.assertTrue(false); + } catch (APPCException e) { + Assert.assertEquals("failure", ctx.getAttribute("getConfig_Result")); + Assert.assertNull(ctx.getAttribute("fullConfig")); + Assert.assertNull(ctx.getAttribute(entity + ".Configuration")); + Assert.assertNull(ctx.getAttribute(entity + ".Configuration")); + Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE)); + } + + + } + + @Test + public void testGetRunningConfig() throws Exception { + fullInit(); + SvcLogicContext ctx = new SvcLogicContext(); + params = new HashMap<>(); + params.put("host-ip-address", host); + params.put("user-name", username); + params.put("password", password); + params.put("port-number", String.valueOf(port)); + + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setConf(fileContent); + + netconfClientPlugin.getRunningConfig(params, ctx); + + Assert.assertEquals("Success", ctx.getAttribute("getRunningConfig_Result")); + Assert.assertEquals(fileContent, ctx.getAttribute("running-config")); + Assert.assertEquals("success", ctx.getStatus()); + } + + @Test + public void testGetRunningConfigWithoutPortNumberDgErrorFieldNameException() throws Exception { + fullInit(); + SvcLogicContext ctx = new SvcLogicContext(); + params = new HashMap<>(); + params.put("host-ip-address", host); + params.put("user-name", username); + params.put("password", password); + + NetconfClientJschMock client = (NetconfClientJschMock) clientFactory.GetNetconfClient(NetconfClientType.SSH); + client.setConf(fileContent); + + try { + netconfClientPlugin.getRunningConfig(params, ctx); + Assert.assertTrue(false); + } catch (APPCException e) { + Assert.assertEquals("failure", ctx.getAttribute("getRunningConfig_Result")); + Assert.assertNull(ctx.getAttribute("running-config")); + Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE)); + } + + + } + + @Test + public void testGetRunningConfigNegativeConfigurationNull() throws Exception { + fullInit(); + SvcLogicContext ctx = new SvcLogicContext(); + params = new HashMap<>(); + params.put("host-ip-address", host); + params.put("user-name", username); + params.put("password", password); + params.put("port-number", String.valueOf(port)); + + netconfClientPlugin.getRunningConfig(params, ctx); + + Assert.assertEquals("failure", ctx.getAttribute("getRunningConfig_Result")); + Assert.assertNull(ctx.getAttribute("running-config")); + } + + @Test + public void testValidateMandatoryParamNegativeEmptyParamValue() throws Exception { + shortInit(); + String paramName = "test"; + String paramValue = ""; + + try { + netconfClientPlugin.validateMandatoryParam(paramName, paramValue); + Assert.assertTrue(false); + } catch (Exception e) { + Assert.assertTrue(true); + } + } + + @Test + public void testRetrieveConnectionDetails() throws Exception { + shortInit(); + DAOServiceMock daoServiceMock = (DAOServiceMock) dao; + daoServiceMock.setConfigFile(fileContent); + ConnectionDetails connectionDetails1 = getConnectionDetails(); + daoServiceMock.setConnection(connectionDetails1); + + NetconfConnectionDetails connectionDetailsActual = netconfClientPlugin.retrieveConnectionDetails(VnfType.VNF); + + + Assert.assertEquals("wrong host", connectionDetails1.getHost(), connectionDetailsActual.getHost()); + Assert.assertEquals("wrong password", connectionDetails1.getPassword(), connectionDetailsActual.getPassword()); + Assert.assertEquals("wrong port", connectionDetails1.getPort(), connectionDetailsActual.getPort()); + Assert.assertEquals("wrong usename", connectionDetails1.getUsername(), connectionDetailsActual.getUsername()); + } + + + @Test + public void testRetrieveConnectionDetailsNegativeMissingConfiguration() throws Exception { + shortInit(); + DAOServiceMock daoServiceMock = (DAOServiceMock) dao; + daoServiceMock.setConfigFile(fileContent); + ConnectionDetails connectionDetails1 = getConnectionDetails(); + daoServiceMock.setConnection(connectionDetails1); + + NetconfConnectionDetails connectionDetailsActual = null; + try { + connectionDetailsActual = netconfClientPlugin.retrieveConnectionDetails(VnfType.MOCK); + Assert.assertTrue(false); + } catch (APPCException e) { + Assert.assertNull(connectionDetailsActual); + } + + + } + + @Test + public void testRetrieveConfigurationFileContent() throws Exception { + shortInit(); + + DAOServiceMock daoServiceMock = (DAOServiceMock) dao; + daoServiceMock.setConfigFile(fileContent); + + Assert.assertEquals("wrong config in a database", fileContent, netconfClientPlugin.retrieveConfigurationFileContent("VnfGetRunningConfig")); + } + + private ConnectionDetails getConnectionDetails() { + + ConnectionDetails connectionDetails = new ConnectionDetails(); + connectionDetails.setPassword(password); + connectionDetails.setPort(port); + connectionDetails.setUsername(username); + connectionDetails.setHost(host); + return connectionDetails; + } + + + private void initDao() throws NoSuchFieldException, IllegalAccessException { + dao = new DAOServiceMock(); + PowerMockito.mockStatic(FrameworkUtil.class); + when(FrameworkUtil.getBundle(Matchers.any(Class.class))).thenReturn(bundleService); + when(bundleService.getBundleContext()).thenReturn(bundleContext); + when(bundleContext.getServiceReference(NetconfDataAccessService.class)).thenReturn(sref1); + when(bundleContext.getService(sref1)).thenReturn(dao); + + + } + + private void fullInit() throws NoSuchFieldException, IllegalAccessException { + initClientFactory(); + initClientFactory2(); + initDao(); + netconfClientPlugin = new NetconfClientPluginImpl(); + netconfClientPlugin.setDao(this.dao); + } + + private void shortInit() throws NoSuchFieldException, IllegalAccessException { + initClientFactory(); + initDao(); + netconfClientPlugin = new NetconfClientPluginImpl(); + netconfClientPlugin.setDao(this.dao); + } + + private void initClientFactory() throws NoSuchFieldException, IllegalAccessException { + + PowerMockito.mockStatic(FrameworkUtil.class); + when(FrameworkUtil.getBundle(Matchers.any(Class.class))).thenReturn(bundleService); + when(bundleService.getBundleContext()).thenReturn(bundleContext); + when(bundleContext.getServiceReference(NetconfClientFactory.class)).thenReturn(sref2); + when(bundleContext.getService(sref2)).thenReturn(clientFactory); + + } + + private void initClientFactory2() { + PowerMockito.mockStatic(FrameworkUtil.class); + when(FrameworkUtil.getBundle(Matchers.any(Class.class))).thenReturn(bundleService); + when(bundleService.getBundleContext()).thenReturn(bundleContext); + when(bundleContext.getServiceReference(Matchers.anyString())).thenReturn(sref3); + when(bundleContext.getService(sref3)).thenReturn(clientFactory); + } + + private void substituteMapper(boolean command) throws NoSuchFieldException, IllegalAccessException { + ObjectMapper mapper = new ObjectMapperMock(); + ObjectMapper mapper2 = new ObjectMapper(); + Field field = NetconfClientPluginImpl.class.getDeclaredField("mapper"); + field.setAccessible(true); + if (command) { + field.set(netconfClientPlugin, mapper); + } else { + field.set(netconfClientPlugin, mapper2); + } + } + +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImplTest.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImplTest.java new file mode 100644 index 000000000..a591648c4 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/NetconfDBPluginImplTest.java @@ -0,0 +1,250 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.*; +import org.openecomp.appc.adapter.netconf.ConnectionDetails; +import org.openecomp.appc.adapter.netconf.NetconfConnectionDetails; +import org.openecomp.appc.adapter.netconf.NetconfDataAccessService; +import org.openecomp.appc.adapter.netconf.exception.DataAccessException; +import org.openecomp.appc.dg.netconf.impl.NetconfDBPluginImpl; +import org.openecomp.appc.exceptions.APPCException; +import org.openecomp.sdnc.sli.SvcLogicContext; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.Map; + +import static org.powermock.api.support.SuppressCode.suppressConstructor; + +public class NetconfDBPluginImplTest { + private NetconfDBPluginImpl netconfDBPlugin; + private NetconfDataAccessService daoService; + private DAOServiceMock daoMock; + private Map<String, String> params; + private static final String DG_OUTPUT_STATUS_MESSAGE = "output.status.message"; + String host = "http://www.test.com"; + String host1 = "http://www.test1.com"; + int port = 8080; + String username = "test"; + String password = "test"; + String configContent = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + + "<rpc message-id=\"101\" xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n" + + "\t<get-config>\n" + + "\t\t<source>\n" + + "\t\t\t<running/>\n" + + "\t\t </source>\n" + + "\t</get-config>\n" + + "</rpc>'"; + + + @Test + public void testRetrieveDSConfiguration() throws Exception { + init(); + params = new HashMap<>(); + params.put("org.openecomp.appc.vftype", "VNF"); + params.put("configuration-file-name", "VnfGetRunningConfig"); + SvcLogicContext ctx = new SvcLogicContext(); + netconfDBPlugin.retrieveDSConfiguration(params, ctx); + + Assert.assertEquals("lack of success of status", "success", ctx.getStatus()); + Assert.assertEquals("wrong config file content", configContent, ctx.getAttribute("file-content")); + } + + + @Test + public void testRetrieveDSConfigurationNegativeErrorFieldNameDaoException() throws Exception { + init(); + SvcLogicContext ctx = new SvcLogicContext(); + params = new HashMap<>(); + params.put("configuration-file-name", "wrong"); + + try { + netconfDBPlugin.retrieveDSConfiguration(params, ctx); + } catch (DataAccessException e) { + //Assert.assertNotNull(ctx.getAttribute("org.openecomp.appc.dg.error")); + Assert.assertNull(ctx.getAttribute("file-content")); + } + + + } + + @Test + public void testRetrieveVMDSConfiguration() throws Exception { + init(); + params = new HashMap<>(); + params.put("resourceKey", "VNF"); + SvcLogicContext ctx = new SvcLogicContext(); + netconfDBPlugin.retrieveVMDSConfiguration(params, ctx); + + Assert.assertEquals("lack of success of retrieveVMDSConfiguration_Result", "success", ctx.getAttribute("retrieveVMDSConfiguration_Result")); + Assert.assertEquals("wrong entity", "VNF", ctx.getAttribute("entity")); + assertConnectionDetails(ctx, host); + } + + @Test + public void testRetrieveVMDSConfigurationNegativeMissingConfiguration() throws Exception { + init(); + SvcLogicContext ctx = new SvcLogicContext(); + params = new HashMap<>(); + params.put("resourceKey", "MOCK"); + + try { + netconfDBPlugin.retrieveVMDSConfiguration(params, ctx); + Assert.assertTrue(false); + } catch (APPCException e) { + + Assert.assertEquals("failure", ctx.getAttribute("retrieveVMDSConfiguration_Result")); + } + } + + + @Test + public void testRetrieveVMDSConfigurationNegativeJsonProcessingException() throws Exception { + + SvcLogicContext ctx = new SvcLogicContext(); + params = new HashMap<>(); + params.put("resourceKey", "VNF"); + + init(); + substituteMapper(true); + try { + netconfDBPlugin.retrieveVMDSConfiguration(params, ctx); + substituteMapper(false); + Assert.assertTrue(false); + + } catch (APPCException e) { + substituteMapper(false); + Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE)); + + } + + } + + @Test + public void testRetrieveConfigFile() throws Exception { + init(); + SvcLogicContext ctx = new SvcLogicContext(); + params = new HashMap<>(); + params.put("configuration-file-name", "VnfGetRunningConfig"); + netconfDBPlugin.retrieveConfigFile(params, ctx); + + Assert.assertEquals("lack of success of status", "success", ctx.getStatus()); + Assert.assertEquals("wrong config file content", configContent, ctx.getAttribute("file-content")); + } + + @Test + public void testRetrieveConnectionDetails() throws Exception { + init(); + params = new HashMap<>(); + params.put("org.openecomp.appc.vftype", "VNF"); + params.put("vnf-host-ip-address", host1); + SvcLogicContext ctx = new SvcLogicContext(); + netconfDBPlugin.retrieveConnectionDetails(params, ctx); + + assertConnectionDetails(ctx, host1); + } + + @Test + public void testRetrieveConnectionDetailsNegativeJsonProcessingException() throws Exception { + init(); + params = new HashMap<>(); + params.put("org.openecomp.appc.vftype", "MOCK"); + params.put("vnf-host-ip-address", host1); + SvcLogicContext ctx = new SvcLogicContext(); + + try { + netconfDBPlugin.retrieveConnectionDetails(params, ctx); + Assert.assertTrue(false); + } catch (APPCException e) { + Assert.assertNull(ctx.getAttribute("connection-details")); + Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE)); + } + + } + + + @Test + public void testRetrieveConnectionDetailsNegativeMissingConfiguration() throws Exception { + init(); + params = new HashMap<>(); + params.put("org.openecomp.appc.vftype", "VNF"); + params.put("vnf-host-ip-address", host1); + SvcLogicContext ctx = new SvcLogicContext(); + substituteMapper(true); + + try { + netconfDBPlugin.retrieveConnectionDetails(params, ctx); + substituteMapper(false); + Assert.assertTrue(false); + } catch (APPCException e) { + substituteMapper(false); + Assert.assertNull(ctx.getAttribute("connection-details")); + Assert.assertNotNull(ctx.getAttribute(DG_OUTPUT_STATUS_MESSAGE)); + } + + } + + private void assertConnectionDetails(SvcLogicContext ctx, String host) throws IOException { + String sConnectionDetails = ctx.getAttribute("connection-details"); + NetconfConnectionDetails connectionDetails = new ObjectMapper().readValue(sConnectionDetails, NetconfConnectionDetails.class); + Assert.assertEquals(host, connectionDetails.getHost()); + Assert.assertEquals(port, connectionDetails.getPort()); + Assert.assertEquals(username, connectionDetails.getUsername()); + Assert.assertEquals(password, connectionDetails.getPassword()); + Assert.assertNull(connectionDetails.getCapabilities()); + Assert.assertNull(connectionDetails.getAdditionalProperties()); + } + + private void init() { + netconfDBPlugin = new NetconfDBPluginImpl(); + daoService = new DAOServiceMock(); + netconfDBPlugin.setDaoService(daoService); + daoMock = (DAOServiceMock) daoService; + daoMock.setConfigFile(configContent); + daoMock.setConnection(getConnectionDetails()); + + } + + private ConnectionDetails getConnectionDetails() { + ConnectionDetails connectionDetails = new ConnectionDetails(); + connectionDetails.setHost(host); + connectionDetails.setUsername(username); + connectionDetails.setPort(port); + connectionDetails.setPassword(password); + return connectionDetails; + } + + private void substituteMapper(boolean command) throws NoSuchFieldException, IllegalAccessException { + ObjectMapper mapper = new ObjectMapperMock(); + ObjectMapper mapper2 = new ObjectMapper(); + Field field = NetconfDBPluginImpl.class.getDeclaredField("mapper"); + field.setAccessible(true); + if (command) { + field.set(netconfDBPlugin, mapper); + } else { + field.set(netconfDBPlugin, mapper2); + } + } +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/ObjectMapperMock.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/ObjectMapperMock.java new file mode 100644 index 000000000..6a7da63ee --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/ObjectMapperMock.java @@ -0,0 +1,45 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; + + +public class ObjectMapperMock extends ObjectMapper { + + @Override + public String writeValueAsString(Object var1) throws JsonProcessingException { + throw new JsonProcessingException("") { + }; + + } + + @Override + public <T> T readValue(String var1, Class<T> var2) throws IOException, JsonParseException, JsonMappingException { + return null; + } +} diff --git a/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/OperationStateValidatorFactoryMock.java b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/OperationStateValidatorFactoryMock.java new file mode 100644 index 000000000..1dea8eb86 --- /dev/null +++ b/appc-dg/appc-dg-shared/appc-dg-netconf/src/test/java/org/openecomp/appc/dg/netconf/impl/OperationStateValidatorFactoryMock.java @@ -0,0 +1,47 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : APP-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * reserved. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.appc.dg.netconf.impl; + +import org.apache.commons.lang3.NotImplementedException; +import org.openecomp.appc.adapter.netconf.*; + + +public class OperationStateValidatorFactoryMock extends OperationalStateValidatorFactory { + public static OperationalStateValidator getOperationalStateValidator(String vnfType) { + VnfType vnfTypeEnum = null; + try { + vnfTypeEnum = VnfType.getVnfType(vnfType); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Illegal value in vnfType. vnfType=" + vnfType, e); + } + return getOperationalStateValidator(vnfTypeEnum); + } + + public static OperationalStateValidator getOperationalStateValidator(VnfType vnfType) { + + return new MockOperationalStateValidatorImpl(); + + + } + + +} |