diff options
Diffstat (limited to 'datafile-dmaap-client/src')
26 files changed, 396 insertions, 639 deletions
diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/ErrorData.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/ErrorData.java deleted file mode 100644 index c62f349b..00000000 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/ErrorData.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. 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.onap.dcaegen2.collectors.datafile.ftp; - -import java.util.ArrayList; -import java.util.List; - -public class ErrorData { - private List<String> errorMessages = new ArrayList<>(); - private List<Throwable> errorCauses = new ArrayList<>(); - - public void addError(String errorMessage, Throwable errorCause) { - errorMessages.add(errorMessage); - errorCauses.add(errorCause); - } - - @Override - public String toString() { - StringBuilder message = new StringBuilder(); - for (int i = 0; i < errorMessages.size(); i++) { - message.append(errorMessages.get(i)); - if (errorCauses.get(i) != null) { - message.append(" Cause: ").append(errorCauses.get(i)); - } - if (i < errorMessages.size() -1) { - message.append("\n"); - } - } - return message.toString(); - } -} diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FTPSClientWrapper.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FTPSClientWrapper.java index 4b7cc01a..29160c94 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FTPSClientWrapper.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FTPSClientWrapper.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 @@ -18,11 +18,10 @@ package org.onap.dcaegen2.collectors.datafile.ftp; import java.io.IOException; import java.io.OutputStream; - import javax.net.ssl.KeyManager; import javax.net.ssl.TrustManager; - import org.apache.commons.net.ftp.FTPSClient; +import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException; public class FTPSClientWrapper implements IFTPSClient { private FTPSClient ftpsClient = new FTPSClient(); @@ -88,8 +87,14 @@ public class FTPSClientWrapper implements IFTPSClient { } @Override - public boolean retrieveFile(String remote, OutputStream local) throws IOException { - return ftpsClient.retrieveFile(remote, local); + public void retrieveFile(String remote, OutputStream local) throws DatafileTaskException { + try { + if (!ftpsClient.retrieveFile(remote, local)) { + throw new DatafileTaskException("could not retrieve file"); + } + } catch (IOException e) { + throw new DatafileTaskException(e); + } } @Override diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectClient.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectClient.java index 42addbf8..f330b673 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectClient.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectClient.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 @@ -16,37 +16,12 @@ package org.onap.dcaegen2.collectors.datafile.ftp; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.nio.file.Path; +import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException; /** * @author <a href="mailto:henrik.b.andersson@est.tech">Henrik Andersson</a> */ -public abstract class FileCollectClient { - protected static final Logger logger = LoggerFactory.getLogger(FtpsClient.class); - - protected FileServerData fileServerData; - protected String remoteFile; - protected String localFile; - protected ErrorData errorData; - - public FileCollectResult collectFile(FileServerData fileServerData, String remoteFile, String localFile) { - logger.trace("collectFile called with fileServerData: {}, remoteFile: {}, localFile: {}", fileServerData, - remoteFile, localFile); - - this.fileServerData = fileServerData; - this.remoteFile = remoteFile; - this.localFile = localFile; - - return retryCollectFile(); - } - - public abstract FileCollectResult retryCollectFile(); - - protected void addError(String errorMessage, Throwable errorCause) { - if (errorData == null) { - errorData = new ErrorData(); - } - errorData.addError(errorMessage, errorCause); - } +public interface FileCollectClient { + public void collectFile(String remoteFile, Path localFile) throws DatafileTaskException; } diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectResult.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectResult.java deleted file mode 100644 index fa1d4310..00000000 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectResult.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. 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.onap.dcaegen2.collectors.datafile.ftp; - -public class FileCollectResult { - private boolean result; - private ErrorData errorData; - - public FileCollectResult() { - this.result = true; - } - - public FileCollectResult(ErrorData errorData) { - this.errorData = errorData; - result = false; - } - - public boolean downloadSuccessful() { - return result; - } - - public String getErrorData() { - if (errorData != null) { - return errorData.toString(); - } - return ""; - } - - @Override - public String toString() { - return "FileCollectResult: " - + (downloadSuccessful() ? "successful!" : "unsuccessful! Error data: " + getErrorData()); - } -} diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileServerData.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileServerData.java index d4eca4d7..b080c320 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileServerData.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FileServerData.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 @@ -16,6 +16,8 @@ package org.onap.dcaegen2.collectors.datafile.ftp; +import java.util.Optional; + import org.immutables.value.Value; /** @@ -27,5 +29,5 @@ public interface FileServerData { public String serverAddress(); public String userId(); public String password(); - public int port(); + public Optional<Integer> port(); } diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FtpsClient.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FtpsClient.java index 0d055fc1..461b2200 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FtpsClient.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/FtpsClient.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 @@ -19,17 +19,20 @@ package org.onap.dcaegen2.collectors.datafile.ftp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Path; +import java.nio.file.Paths; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; +import java.util.Optional; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPReply; +import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException; import org.onap.dcaegen2.collectors.datafile.io.FileSystemResourceWrapper; import org.onap.dcaegen2.collectors.datafile.io.FileWrapper; import org.onap.dcaegen2.collectors.datafile.io.IFile; import org.onap.dcaegen2.collectors.datafile.io.IFileSystemResource; import org.onap.dcaegen2.collectors.datafile.io.IOutputStream; -import org.onap.dcaegen2.collectors.datafile.io.OutputStreamWrapper; import org.onap.dcaegen2.collectors.datafile.ssl.IKeyManagerUtils; import org.onap.dcaegen2.collectors.datafile.ssl.IKeyManagerUtils.KeyManagerException; import org.onap.dcaegen2.collectors.datafile.ssl.IKeyStore; @@ -37,118 +40,106 @@ import org.onap.dcaegen2.collectors.datafile.ssl.ITrustManagerFactory; import org.onap.dcaegen2.collectors.datafile.ssl.KeyManagerUtilsWrapper; import org.onap.dcaegen2.collectors.datafile.ssl.KeyStoreWrapper; import org.onap.dcaegen2.collectors.datafile.ssl.TrustManagerFactoryWrapper; -import org.springframework.stereotype.Component; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Gets file from xNF with FTPS protocol. * * @author <a href="mailto:martin.c.yan@est.tech">Martin Yan</a> */ -@Component -public class FtpsClient extends FileCollectClient { +public class FtpsClient implements FileCollectClient { + private static final Logger logger = LoggerFactory.getLogger(FtpsClient.class); private String keyCertPath; private String keyCertPassword; - private String trustedCAPath; + private Path trustedCAPath; private String trustedCAPassword; - private IFTPSClient realFtpsClient; - private IKeyManagerUtils kmu; + private IFTPSClient realFtpsClient = new FTPSClientWrapper(); + private IKeyManagerUtils keyManagerUtils = new KeyManagerUtilsWrapper(); private IKeyStore keyStore; private ITrustManagerFactory trustManagerFactory; - private IFile lf; - private IFileSystemResource fileResource; - private IOutputStream os; + private IFile localFile = new FileWrapper(); + private IFileSystemResource fileSystemResource = new FileSystemResourceWrapper(); + private IOutputStream outputStream; private boolean keyManagerSet = false; private boolean trustManagerSet = false; + private final FileServerData fileServerData; - @Override - public FileCollectResult retryCollectFile() { - logger.trace("retryCollectFile called"); - - FileCollectResult fileCollectResult; - IFTPSClient ftps = getFtpsClient(); + public FtpsClient(FileServerData fileServerData) { + this.fileServerData = fileServerData; + } - ftps.setNeedClientAuth(true); + @Override + public void collectFile(String remoteFile, Path localFile) throws DatafileTaskException { + logger.trace("collectFile called"); - if (setUpKeyManager(ftps) && setUpTrustedCA(ftps) && setUpConnection(ftps)) { - if (getFileFromxNF(ftps)) { - fileCollectResult = new FileCollectResult(); - } else { - fileCollectResult = new FileCollectResult(errorData); - } - } else { - fileCollectResult = new FileCollectResult(errorData); + try { + realFtpsClient.setNeedClientAuth(true); + setUpKeyManager(realFtpsClient); + setUpTrustedCA(realFtpsClient); + setUpConnection(realFtpsClient); + getFileFromxNF(realFtpsClient, remoteFile, localFile); + } catch (IOException e) { + logger.trace("", e); + throw new DatafileTaskException("Could not open connection: " + e); + } catch (KeyManagerException e) { + logger.trace("", e); + throw new DatafileTaskException(e); + } finally { + closeDownConnection(realFtpsClient); } - closeDownConnection(ftps); - logger.trace("retryCollectFile left with result: {}", fileCollectResult); - return fileCollectResult; + logger.trace("collectFile fetched: {}", localFile); } - private boolean setUpKeyManager(IFTPSClient ftps) { - boolean result = true; + private void setUpKeyManager(IFTPSClient ftps) throws KeyManagerException { if (keyManagerSet) { logger.trace("keyManager already set!"); - return result; - } - try { - IKeyManagerUtils keyManagerUtils = getKeyManagerUtils(); + } else { keyManagerUtils.setCredentials(keyCertPath, keyCertPassword); ftps.setKeyManager(keyManagerUtils.getClientKeyManager()); keyManagerSet = true; - } catch (KeyManagerException e) { - addError("Unable to use own key store " + keyCertPath, e); - result = false; } logger.trace("complete setUpKeyManager"); - return result; } - private boolean setUpTrustedCA(IFTPSClient ftps) { - boolean result = true; + private void setUpTrustedCA(IFTPSClient ftps) throws DatafileTaskException { if (trustManagerSet) { logger.trace("trustManager already set!"); - return result; - } - try { - IFileSystemResource fileSystemResource = getFileSystemResource(); - fileSystemResource.setPath(trustedCAPath); - InputStream fis = fileSystemResource.getInputStream(); - IKeyStore ks = getKeyStore(); - ks.load(fis, trustedCAPassword.toCharArray()); - fis.close(); - ITrustManagerFactory tmf = getTrustManagerFactory(); - tmf.init(ks.getKeyStore()); - ftps.setTrustManager(tmf.getTrustManagers()[0]); - trustManagerSet = true; - - } catch (Exception e) { - addError("Unable to trust xNF's CA, " + trustedCAPath, e); - result = false; + } else { + try { + fileSystemResource.setPath(trustedCAPath); + InputStream fis = fileSystemResource.getInputStream(); + IKeyStore ks = getKeyStore(); + ks.load(fis, trustedCAPassword.toCharArray()); + fis.close(); + ITrustManagerFactory tmf = getTrustManagerFactory(); + tmf.init(ks.getKeyStore()); + ftps.setTrustManager(tmf.getTrustManagers()[0]); + trustManagerSet = true; + } catch (Exception e) { + throw new DatafileTaskException("Unable to trust xNF's CA, " + trustedCAPath + " " + e); + } } logger.trace("complete setUpTrustedCA"); - return result; } - private boolean setUpConnection(IFTPSClient ftps) { - boolean result = true; - try { - if (ftps.isConnected()) { - addError( - "Looks like previous ftp connection is still in use, will retry in 1 minute. " + fileServerData, - null); - return false; - } - ftps.connect(fileServerData.serverAddress(), fileServerData.port()); + private int getPort(Optional<Integer> port) { + final int FTPS_DEFAULT_PORT = 21; + return port.isPresent() ? port.get() : FTPS_DEFAULT_PORT; + } + + private void setUpConnection(IFTPSClient ftps) throws DatafileTaskException, IOException { + if (!ftps.isConnected()) { + ftps.connect(fileServerData.serverAddress(), getPort(fileServerData.port())); logger.trace("after ftp connect"); - boolean loginSuccesful = ftps.login(fileServerData.userId(), fileServerData.password()); - if (!loginSuccesful) { - closeDownConnection(ftps); - addError("Unable to log in to xNF. " + fileServerData, null); - return false; + + if (!ftps.login(fileServerData.userId(), fileServerData.password())) { + throw new DatafileTaskException("Unable to log in to xNF. " + fileServerData.serverAddress()); } - if (loginSuccesful && FTPReply.isPositiveCompletion(ftps.getReplyCode())) { + if (FTPReply.isPositiveCompletion(ftps.getReplyCode())) { ftps.enterLocalPassiveMode(); ftps.setFileType(FTP.BINARY_FILE_TYPE); // Set protection buffer size @@ -157,54 +148,29 @@ public class FtpsClient extends FileCollectClient { ftps.execPROT("P"); ftps.setBufferSize(1024 * 1024); } else { - closeDownConnection(ftps); - addError("Unable to connect to xNF. " + fileServerData + " xNF reply code: " + ftps.getReplyCode(), - null); - return false; + throw new DatafileTaskException("Unable to connect to xNF. " + fileServerData.serverAddress() + + " xNF reply code: " + ftps.getReplyCode()); } - } catch (Exception e) { - logger.trace("connect to ftp server failed.", e); - addError("Unable to connect to xNF. Data: " + fileServerData, e); - closeDownConnection(ftps); - return false; } logger.trace("setUpConnection successfully!"); - return result; } - private boolean getFileFromxNF(IFTPSClient ftps) { + private void getFileFromxNF(IFTPSClient ftps, String remoteFileName, Path localFileName) + throws IOException, DatafileTaskException { logger.trace("starting to getFile"); - boolean result = true; - IFile outfile = getFile(); - try { - outfile.setPath(localFile); - outfile.createNewFile(); - - IOutputStream outputStream = getOutputStream(); - OutputStream output = outputStream.getOutputStream(outfile.getFile()); - logger.trace("begin to retrieve from xNF."); - result = ftps.retrieveFile(remoteFile, output); - logger.trace("end retrieve from xNF."); - if (!result) { - output.close(); - logger.debug("Unable to retrieve file from xNF. Cause unknown!"); - addError("Unable to retrieve file from xNF. Cause unknown!", null); - return result; - } - output.close(); - logger.debug("File {} Download Successfull from xNF", localFile); - } catch (IOException ex) { - addError("Unable to collect file from xNF. Data: " + fileServerData, ex); - try { - outfile.delete(); - } catch (Exception e) { - logger.trace("Unable to delete file {}.", localFile, e); - } - return false; - } - return result; + + this.localFile.setPath(localFileName); + this.localFile.createNewFile(); + + OutputStream output = this.outputStream.getOutputStream(this.localFile.getFile()); + logger.trace("begin to retrieve from xNF."); + ftps.retrieveFile(remoteFileName, output); + logger.trace("end retrieve from xNF."); + output.close(); + logger.debug("File {} Download Successfull from xNF", localFileName); } + private void closeDownConnection(IFTPSClient ftps) { logger.trace("starting to closeDownConnection"); if (ftps != null && ftps.isConnected()) { @@ -232,7 +198,7 @@ public class FtpsClient extends FileCollectClient { } public void setTrustedCAPath(String trustedCAPath) { - this.trustedCAPath = trustedCAPath; + this.trustedCAPath = Paths.get(trustedCAPath); } public void setTrustedCAPassword(String trustedCAPassword) { @@ -246,21 +212,6 @@ public class FtpsClient extends FileCollectClient { return trustManagerFactory; } - private IFTPSClient getFtpsClient() { - if (realFtpsClient == null) { - realFtpsClient = new FTPSClientWrapper(); - } - return realFtpsClient; - } - - private IKeyManagerUtils getKeyManagerUtils() { - if (kmu == null) { - kmu = new KeyManagerUtilsWrapper(); - } - - return kmu; - } - private IKeyStore getKeyStore() throws KeyStoreException { if (keyStore == null) { keyStore = new KeyStoreWrapper(); @@ -269,54 +220,31 @@ public class FtpsClient extends FileCollectClient { return keyStore; } - private IFile getFile() { - if (lf == null) { - lf = new FileWrapper(); - } - - return lf; - } - - private IOutputStream getOutputStream() { - if (os == null) { - os = new OutputStreamWrapper(); - } - - return os; - } - - private IFileSystemResource getFileSystemResource() { - if (fileResource == null) { - fileResource = new FileSystemResourceWrapper(); - } - return fileResource; - } - - protected void setFtpsClient(IFTPSClient ftpsClient) { + void setFtpsClient(IFTPSClient ftpsClient) { this.realFtpsClient = ftpsClient; } - protected void setKeyManagerUtils(IKeyManagerUtils keyManagerUtils) { - this.kmu = keyManagerUtils; + void setKeyManagerUtils(IKeyManagerUtils keyManagerUtils) { + this.keyManagerUtils = keyManagerUtils; } - protected void setKeyStore(IKeyStore keyStore) { + void setKeyStore(IKeyStore keyStore) { this.keyStore = keyStore; } - protected void setTrustManagerFactory(ITrustManagerFactory tmf) { + void setTrustManagerFactory(ITrustManagerFactory tmf) { trustManagerFactory = tmf; } - protected void setFile(IFile file) { - lf = file; + void setFile(IFile file) { + localFile = file; } - protected void setOutputStream(IOutputStream outputStream) { - os = outputStream; + void setOutputStream(IOutputStream outputStream) { + this.outputStream = outputStream; } - protected void setFileSystemResource(IFileSystemResource fileSystemResource) { - fileResource = fileSystemResource; + void setFileSystemResource(IFileSystemResource fileSystemResource) { + this.fileSystemResource = fileSystemResource; } } diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/IFTPSClient.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/IFTPSClient.java index 1a581636..3dcaa656 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/IFTPSClient.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/IFTPSClient.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 @@ -18,9 +18,9 @@ package org.onap.dcaegen2.collectors.datafile.ftp; import java.io.IOException; import java.io.OutputStream; - import javax.net.ssl.KeyManager; import javax.net.ssl.TrustManager; +import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException; public interface IFTPSClient { public void setNeedClientAuth(boolean isNeedClientAuth); @@ -51,7 +51,7 @@ public interface IFTPSClient { public void execPROT(String prot) throws IOException; - public boolean retrieveFile(String remote, OutputStream local) throws IOException; + public void retrieveFile(String remote, OutputStream local) throws DatafileTaskException; void setTimeout(Integer t); } diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/Scheme.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/Scheme.java new file mode 100644 index 00000000..d469da66 --- /dev/null +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/Scheme.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 Nordix Foundation. 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.onap.dcaegen2.collectors.datafile.ftp; + +import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException; + +/** + * Enum specifying the schemes that DFC support for downloading files. + * + * @author <a href="mailto:henrik.b.andersson@est.tech">Henrik Andersson</a> + * + */ +public enum Scheme { + FTPS, SFTP; + + /** + * Get a <code>Scheme</code> from a string. + * + * @param schemeString the string to convert to <code>Scheme</code>. + * @return The corresponding <code>Scheme</code> + * @throws Exception if the value of the string doesn't match any defined scheme. + */ + public static Scheme getSchemeFromString(String schemeString) throws DatafileTaskException { + Scheme result; + if ("FTPS".equalsIgnoreCase(schemeString) || "FTPES".equalsIgnoreCase(schemeString)) { + result = Scheme.FTPS; + } else if ("SFTP".equalsIgnoreCase(schemeString)) { + result = Scheme.SFTP; + } else { + throw new DatafileTaskException("DFC does not support protocol " + schemeString + + ". Supported protocols are FTPES , FTPS, and SFTP"); + } + return result; + } +} diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/SftpClient.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/SftpClient.java index e8fc695a..0c6491b8 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/SftpClient.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/ftp/SftpClient.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 @@ -21,10 +21,13 @@ import com.jcraft.jsch.ChannelSftp; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; -import com.jcraft.jsch.SftpException; -import org.apache.commons.io.FilenameUtils; -import org.springframework.stereotype.Component; +import java.nio.file.Path; +import java.util.Optional; + +import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Gets file from xNF with SFTP protocol. @@ -32,65 +35,52 @@ import org.springframework.stereotype.Component; * @author <a href="mailto:martin.c.yan@est.tech">Martin Yan</a> * */ -@Component -public class SftpClient extends FileCollectClient { - @Override - public FileCollectResult retryCollectFile() { - logger.trace("retryCollectFile called"); +public class SftpClient implements FileCollectClient { + private static final Logger logger = LoggerFactory.getLogger(SftpClient.class); + private final FileServerData fileServerData; - FileCollectResult result; - Session session = setUpSession(fileServerData); + public SftpClient(FileServerData fileServerData) { + this.fileServerData = fileServerData; + } - if (session != null) { - ChannelSftp sftpChannel = getChannel(session, fileServerData); - if (sftpChannel != null) { - try { - sftpChannel.get(remoteFile, localFile); - result = new FileCollectResult(); - logger.debug("File {} Download Successfull from xNF", FilenameUtils.getName(localFile)); - } catch (SftpException e) { - addError("Unable to get file from xNF. Data: " + fileServerData, e); - result = new FileCollectResult(errorData); - } + @Override + public void collectFile(String remoteFile, Path localFile) throws DatafileTaskException { + logger.trace("collectFile called"); - sftpChannel.exit(); - } else { - result = new FileCollectResult(errorData); - } + try { + Session session = setUpSession(fileServerData); + ChannelSftp sftpChannel = getChannel(session); + sftpChannel.get(remoteFile, localFile.toString()); + logger.debug("File {} Download Successfull from xNF", localFile.getFileName()); + sftpChannel.exit(); session.disconnect(); - } else { - result = new FileCollectResult(errorData); + } catch (Exception e) { + throw new DatafileTaskException("Unable to get file from xNF. Data: " + fileServerData + e); } - logger.trace("retryCollectFile left with result: {}", result); - return result; + + logger.trace("collectFile OK"); + } - private Session setUpSession(FileServerData fileServerData) { + private int getPort(Optional<Integer> port) { + final int FTPS_DEFAULT_PORT = 22; + return port.isPresent() ? port.get() : FTPS_DEFAULT_PORT; + } + + private Session setUpSession(FileServerData fileServerData) throws JSchException { JSch jsch = new JSch(); - Session session = null; - try { - session = jsch.getSession(fileServerData.userId(), fileServerData.serverAddress(), fileServerData.port()); - session.setConfig("StrictHostKeyChecking", "no"); - session.setPassword(fileServerData.password()); - session.connect(); - } catch (JSchException e) { - addError("Unable to set up SFTP connection to xNF. Data: " + fileServerData, e); - session = null; - } + Session session = + jsch.getSession(fileServerData.userId(), fileServerData.serverAddress(), getPort(fileServerData.port())); + session.setConfig("StrictHostKeyChecking", "no"); + session.setPassword(fileServerData.password()); + session.connect(); return session; } - private ChannelSftp getChannel(Session session, FileServerData fileServerData) { - ChannelSftp sftpChannel = null; - try { - Channel channel; - channel = session.openChannel("sftp"); - channel.connect(); - sftpChannel = (ChannelSftp) channel; - } catch (JSchException e) { - addError("Unable to get sftp channel to xNF. Data: " + fileServerData, e); - } - return sftpChannel; + private ChannelSftp getChannel(Session session) throws JSchException { + Channel channel = session.openChannel("sftp"); + channel.connect(); + return (ChannelSftp) channel; } } diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/FileSystemResourceWrapper.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/FileSystemResourceWrapper.java index 95de2de8..5295b124 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/FileSystemResourceWrapper.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/FileSystemResourceWrapper.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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. @@ -20,14 +20,14 @@ package org.onap.dcaegen2.collectors.datafile.io; import java.io.IOException; import java.io.InputStream; - +import java.nio.file.Path; import org.springframework.core.io.FileSystemResource; public class FileSystemResourceWrapper implements IFileSystemResource { private FileSystemResource realResource; @Override - public void setPath(String path) { + public void setPath(Path path) { realResource = new FileSystemResource(path); } @Override diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/FileWrapper.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/FileWrapper.java index 32b6c72f..203a5985 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/FileWrapper.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/FileWrapper.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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. @@ -20,13 +20,14 @@ package org.onap.dcaegen2.collectors.datafile.io; import java.io.File; import java.io.IOException; +import java.nio.file.Path; public class FileWrapper implements IFile { private File file; @Override - public void setPath(String path) { - file = new File(path); + public void setPath(Path path) { + file = path.toFile(); } @Override diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IFile.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IFile.java index a7094f69..2b95842f 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IFile.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IFile.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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. @@ -20,9 +20,10 @@ package org.onap.dcaegen2.collectors.datafile.io; import java.io.File; import java.io.IOException; +import java.nio.file.Path; public interface IFile { - public void setPath(String path); + public void setPath(Path path); public boolean createNewFile() throws IOException; diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IFileSystemResource.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IFileSystemResource.java index db303969..23f14a33 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IFileSystemResource.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IFileSystemResource.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 @@ -18,10 +18,11 @@ package org.onap.dcaegen2.collectors.datafile.io; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Path; public interface IFileSystemResource { - public void setPath(String filePath); + public void setPath(Path filePath); public InputStream getInputStream() throws IOException; } diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IOutputStream.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IOutputStream.java index 1ef790c0..8015ea76 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IOutputStream.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/IOutputStream.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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. diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/OutputStreamWrapper.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/OutputStreamWrapper.java index 830a571c..88787826 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/OutputStreamWrapper.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/io/OutputStreamWrapper.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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. diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/DmaapReactiveWebClient.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/DmaapReactiveWebClient.java index 2e9c8488..e99b8114 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/DmaapReactiveWebClient.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/DmaapReactiveWebClient.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 NOKIA Intellectual Property, 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018 NOKIA Intellectual Property, 2018-2019 Nordix Foundation. 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 diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/HttpUtils.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/HttpUtils.java index 2b44233f..1e1187ac 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/HttpUtils.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/HttpUtils.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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. diff --git a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/producer/DmaapProducerReactiveHttpClient.java b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/producer/DmaapProducerReactiveHttpClient.java index b3c8c3ef..bced3d85 100644 --- a/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/producer/DmaapProducerReactiveHttpClient.java +++ b/datafile-dmaap-client/src/main/java/org/onap/dcaegen2/collectors/datafile/service/producer/DmaapProducerReactiveHttpClient.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 NOKIA Intellectual Property, 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018 NOKIA Intellectual Property, 2018-2019 Nordix Foundation. 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 @@ -23,6 +23,11 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; import java.util.concurrent.Future; import javax.net.ssl.SSLContext; @@ -36,17 +41,16 @@ import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.apache.http.impl.nio.client.HttpAsyncClients; import org.apache.http.ssl.SSLContextBuilder; - import org.onap.dcaegen2.collectors.datafile.io.FileSystemResourceWrapper; import org.onap.dcaegen2.collectors.datafile.io.IFileSystemResource; import org.onap.dcaegen2.collectors.datafile.model.CommonFunctions; import org.onap.dcaegen2.collectors.datafile.model.ConsumerDmaapModel; -import org.onap.dcaegen2.collectors.datafile.service.HttpUtils; import org.onap.dcaegen2.collectors.datafile.web.PublishRedirectStrategy; import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.DmaapPublisherConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.web.util.DefaultUriBuilderFactory; import reactor.core.publisher.Flux; @@ -73,7 +77,7 @@ public class DmaapProducerReactiveHttpClient { private final String user; private final String pwd; - private IFileSystemResource fileResource; + private IFileSystemResource fileResource = new FileSystemResourceWrapper(); private CloseableHttpAsyncClient webClient; /** @@ -97,10 +101,10 @@ public class DmaapProducerReactiveHttpClient { * @param consumerDmaapModel - object which will be sent to DMaaP DataRouter * @return status code of operation */ - public Flux<String> getDmaapProducerResponse(ConsumerDmaapModel consumerDmaapModel) { + public Flux<HttpStatus> getDmaapProducerResponse(ConsumerDmaapModel consumerDmaapModel) { logger.trace("Entering getDmaapProducerResponse with {}", consumerDmaapModel); try { - logger.trace("Starting to publish to DR"); + logger.trace("Starting to publish to DR {}", consumerDmaapModel.getInternalLocation()); webClient = getWebClient(); webClient.start(); @@ -114,20 +118,10 @@ public class DmaapProducerReactiveHttpClient { HttpResponse response = future.get(); logger.trace(response.toString()); webClient.close(); - handleHttpResponse(response); - return Flux.just(response.toString()); + return Flux.just(HttpStatus.valueOf(response.getStatusLine().getStatusCode())); } catch (Exception e) { - logger.error("Unable to send file to DataRouter. Data: {}", consumerDmaapModel, e); - return Flux.empty(); - } - } - - private void handleHttpResponse(HttpResponse response) { - int statusCode = response.getStatusLine().getStatusCode(); - if (HttpUtils.isSuccessfulResponseCode(statusCode)) { - logger.trace("Publish to DR successful!"); - } else { - logger.error("Publish to DR unsuccessful, response code: " + statusCode); + logger.error("Unable to send file to DataRouter. Data: {}", consumerDmaapModel.getInternalLocation(), e); + return Flux.error(e); } } @@ -142,28 +136,20 @@ public class DmaapProducerReactiveHttpClient { private void prepareHead(ConsumerDmaapModel model, HttpPut put) { put.addHeader(HttpHeaders.CONTENT_TYPE, dmaapContentType); - JsonElement metaData = new JsonParser().parse(new CommonFunctions().createJsonBody(model)); + JsonElement metaData = new JsonParser().parse(CommonFunctions.createJsonBody(model)); String name = metaData.getAsJsonObject().remove(NAME_JSON_TAG).getAsString(); metaData.getAsJsonObject().remove(INTERNAL_LOCATION_JSON_TAG); put.addHeader(X_DMAAP_DR_META, metaData.toString()); put.setURI(getUri(name)); } - private void prepareBody(ConsumerDmaapModel model, HttpPut put) { - String fileLocation = model.getInternalLocation(); - IFileSystemResource fileSystemResource = getFileSystemResource(); - fileSystemResource.setPath(fileLocation); - InputStream fileInputStream = null; - try { - fileInputStream = fileSystemResource.getInputStream(); - } catch (IOException e) { - logger.error("Unable to get stream from filesystem.", e); - } - try { - put.setEntity(new ByteArrayEntity(IOUtils.toByteArray(fileInputStream))); - } catch (IOException e) { - logger.error("Unable to set put request body from ByteArray.", e); - } + private void prepareBody(ConsumerDmaapModel model, HttpPut put) throws IOException { + Path fileLocation = Paths.get(model.getInternalLocation()); + this.fileResource.setPath(fileLocation); + InputStream fileInputStream = fileResource.getInputStream(); + + put.setEntity(new ByteArrayEntity(IOUtils.toByteArray(fileInputStream))); + } private URI getUri(String fileName) { @@ -172,27 +158,19 @@ public class DmaapProducerReactiveHttpClient { .path(path).build(); } - private IFileSystemResource getFileSystemResource() { - if (fileResource == null) { - fileResource = new FileSystemResourceWrapper(); - } - return fileResource; - } - - protected void setFileSystemResource(IFileSystemResource fileSystemResource) { + void setFileSystemResource(IFileSystemResource fileSystemResource) { fileResource = fileSystemResource; } - protected CloseableHttpAsyncClient getWebClient() { + protected CloseableHttpAsyncClient getWebClient() + throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException { if (webClient != null) { return webClient; } SSLContext sslContext = null; - try { - sslContext = new SSLContextBuilder().loadTrustMaterial(null, (certificate, authType) -> true).build(); - } catch (Exception e) { - logger.trace("Unable to get sslContext.", e); - } + + sslContext = new SSLContextBuilder().loadTrustMaterial(null, (certificate, authType) -> true).build(); + //@formatter:off return HttpAsyncClients.custom() .setSSLContext(sslContext) @@ -205,4 +183,4 @@ public class DmaapProducerReactiveHttpClient { protected void setWebClient(CloseableHttpAsyncClient client) { this.webClient = client; } -} +}
\ No newline at end of file diff --git a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/ErrorDataTest.java b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/ErrorDataTest.java deleted file mode 100644 index b4edf82c..00000000 --- a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/ErrorDataTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. 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.onap.dcaegen2.collectors.datafile.ftp; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.Test; - -public class ErrorDataTest { - - @Test - public void emptyData() { - ErrorData dataUnderTest = new ErrorData(); - - assertEquals("", dataUnderTest.toString()); - } - - @Test - public void withData() { - ErrorData dataUnderTest = new ErrorData(); - dataUnderTest.addError("Error", null); - dataUnderTest.addError("Null", new NullPointerException("Null")); - - assertEquals("Error\nNull Cause: java.lang.NullPointerException: Null", dataUnderTest.toString()); - } -} - diff --git a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectResultTest.java b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectResultTest.java deleted file mode 100644 index 38d24233..00000000 --- a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/FileCollectResultTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. 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.onap.dcaegen2.collectors.datafile.ftp; - -import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - -import org.junit.jupiter.api.Test; - -public class FileCollectResultTest { - - @Test - public void successfulResult() { - FileCollectResult resultUnderTest = new FileCollectResult(); - assertTrue(resultUnderTest.downloadSuccessful()); - assertEquals("FileCollectResult: successful!", resultUnderTest.toString()); - } - - @Test - public void unSuccessfulResult() { - ErrorData errorData = new ErrorData(); - errorData.addError("Error", null); - errorData.addError("Null", new NullPointerException()); - FileCollectResult resultUnderTest = new FileCollectResult(errorData); - assertFalse(resultUnderTest.downloadSuccessful()); - assertEquals("FileCollectResult: unsuccessful! Error data: " + errorData.toString(), - resultUnderTest.toString()); - } -} diff --git a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/FtpsClientTest.java b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/FtpsClientTest.java index c134b79c..c4577262 100644 --- a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/FtpsClientTest.java +++ b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/FtpsClientTest.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 @@ -16,8 +16,7 @@ package org.onap.dcaegen2.collectors.datafile.ftp; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; @@ -29,6 +28,8 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Path; +import java.nio.file.Paths; import java.security.GeneralSecurityException; import java.security.KeyStore; import java.security.KeyStoreException; @@ -40,6 +41,7 @@ import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPReply; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException; import org.onap.dcaegen2.collectors.datafile.io.IFile; import org.onap.dcaegen2.collectors.datafile.io.IFileSystemResource; import org.onap.dcaegen2.collectors.datafile.io.IOutputStream; @@ -51,12 +53,12 @@ import org.springframework.http.HttpStatus; public class FtpsClientTest { private static final String REMOTE_FILE_PATH = "/dir/sample.txt"; - private static final String LOCAL_FILE_PATH = "target/sample.txt"; + private static final Path LOCAL_FILE_PATH = Paths.get("target/sample.txt"); private static final String XNF_ADDRESS = "127.0.0.1"; private static final int PORT = 8021; private static final String FTP_KEY_PATH = "ftpKeyPath"; private static final String FTP_KEY_PASSWORD = "ftpKeyPassword"; - private static final String TRUSTED_CA_PATH = "trustedCAPath"; + private static final Path TRUSTED_CA_PATH = Paths.get("trustedCAPath"); private static final String TRUSTED_CA_PASSWORD = "trustedCAPassword"; private static final String USERNAME = "bob"; @@ -74,7 +76,14 @@ public class FtpsClientTest { private IOutputStream outputStreamMock = mock(IOutputStream.class); private InputStream inputStreamMock = mock(InputStream.class); - FtpsClient clientUnderTest = new FtpsClient(); + FtpsClient clientUnderTest = new FtpsClient(createFileServerData()); + + + private ImmutableFileServerData createFileServerData() { + return ImmutableFileServerData.builder().serverAddress(XNF_ADDRESS) + .userId(USERNAME).password(PASSWORD).port(PORT).build(); + } + @BeforeEach protected void setUp() throws Exception { @@ -88,7 +97,7 @@ public class FtpsClientTest { clientUnderTest.setKeyCertPath(FTP_KEY_PATH); clientUnderTest.setKeyCertPassword(FTP_KEY_PASSWORD); - clientUnderTest.setTrustedCAPath(TRUSTED_CA_PATH); + clientUnderTest.setTrustedCAPath(TRUSTED_CA_PATH.toString()); clientUnderTest.setTrustedCAPassword(TRUSTED_CA_PASSWORD); } @@ -104,15 +113,10 @@ public class FtpsClientTest { when(localFileMock.getFile()).thenReturn(fileMock); OutputStream osMock = mock(OutputStream.class); when(outputStreamMock.getOutputStream(fileMock)).thenReturn(osMock); - when(ftpsClientMock.retrieveFile(REMOTE_FILE_PATH, osMock)).thenReturn(true); when(ftpsClientMock.isConnected()).thenReturn(false, true); - ImmutableFileServerData fileServerData = ImmutableFileServerData.builder().serverAddress(XNF_ADDRESS) - .userId(USERNAME).password(PASSWORD).port(PORT).build(); - - FileCollectResult result = clientUnderTest.collectFile(fileServerData, REMOTE_FILE_PATH, LOCAL_FILE_PATH); + clientUnderTest.collectFile(REMOTE_FILE_PATH, LOCAL_FILE_PATH); - assertTrue(result.downloadSuccessful()); verify(ftpsClientMock).setNeedClientAuth(true); verify(keyManagerUtilsMock).setCredentials(FTP_KEY_PATH, FTP_KEY_PASSWORD); verify(ftpsClientMock).setKeyManager(keyManagerMock); @@ -143,16 +147,14 @@ public class FtpsClientTest { public void collectFileFaultyOwnKey_shouldFail() throws Exception { doThrow(new IKeyManagerUtils.KeyManagerException(new GeneralSecurityException())).when(keyManagerUtilsMock) .setCredentials(FTP_KEY_PATH, FTP_KEY_PASSWORD); + when(ftpsClientMock.isConnected()).thenReturn(false); - ImmutableFileServerData fileServerData = ImmutableFileServerData.builder().serverAddress(XNF_ADDRESS) - .userId(USERNAME).password(PASSWORD).port(PORT).build(); - - FileCollectResult result = clientUnderTest.collectFile(fileServerData, REMOTE_FILE_PATH, LOCAL_FILE_PATH); + assertThatThrownBy(() -> clientUnderTest.collectFile(REMOTE_FILE_PATH, LOCAL_FILE_PATH)) + .hasMessage("org.onap.dcaegen2.collectors.datafile.ssl.IKeyManagerUtils$KeyManagerException: java.security.GeneralSecurityException"); - assertFalse(result.downloadSuccessful()); verify(ftpsClientMock).setNeedClientAuth(true); verify(keyManagerUtilsMock).setCredentials(FTP_KEY_PATH, FTP_KEY_PASSWORD); - verify(ftpsClientMock, times(1)).isConnected(); + verify(ftpsClientMock).isConnected(); verifyNoMoreInteractions(ftpsClientMock); } @@ -164,21 +166,8 @@ public class FtpsClientTest { doThrow(new KeyStoreException()).when(trustManagerFactoryMock).init(keyStoreMock); - ImmutableFileServerData fileServerData = ImmutableFileServerData.builder().serverAddress(XNF_ADDRESS) - .userId(USERNAME).password(PASSWORD).port(PORT).build(); - - FileCollectResult result = clientUnderTest.collectFile(fileServerData, REMOTE_FILE_PATH, LOCAL_FILE_PATH); - - assertFalse(result.downloadSuccessful()); - verify(ftpsClientMock).setNeedClientAuth(true); - verify(keyManagerUtilsMock).setCredentials(FTP_KEY_PATH, FTP_KEY_PASSWORD); - verify(ftpsClientMock).setKeyManager(keyManagerMock); - verify(fileResourceMock).setPath(TRUSTED_CA_PATH); - verify(keyStoreWrapperMock).load(inputStreamMock, TRUSTED_CA_PASSWORD.toCharArray()); - verify(inputStreamMock, times(1)).close(); - verify(trustManagerFactoryMock).init(keyStoreMock); - verify(ftpsClientMock, times(1)).isConnected(); - verifyNoMoreInteractions(ftpsClientMock); + assertThatThrownBy(() -> clientUnderTest.collectFile(REMOTE_FILE_PATH, LOCAL_FILE_PATH)) + .hasMessage("Unable to trust xNF's CA, trustedCAPath java.security.KeyStoreException"); } @Test @@ -189,12 +178,9 @@ public class FtpsClientTest { when(trustManagerFactoryMock.getTrustManagers()).thenReturn(new TrustManager[] {trustManagerMock}); when(ftpsClientMock.login(USERNAME, PASSWORD)).thenReturn(false); - ImmutableFileServerData fileServerData = ImmutableFileServerData.builder().serverAddress(XNF_ADDRESS) - .userId(USERNAME).password(PASSWORD).port(PORT).build(); + assertThatThrownBy(() -> clientUnderTest.collectFile(REMOTE_FILE_PATH, LOCAL_FILE_PATH)) + .hasMessage("Unable to log in to xNF. 127.0.0.1"); - FileCollectResult result = clientUnderTest.collectFile(fileServerData, REMOTE_FILE_PATH, LOCAL_FILE_PATH); - - assertFalse(result.downloadSuccessful()); verify(ftpsClientMock).setNeedClientAuth(true); verify(keyManagerUtilsMock).setCredentials(FTP_KEY_PATH, FTP_KEY_PASSWORD); verify(ftpsClientMock).setKeyManager(keyManagerMock); @@ -205,8 +191,6 @@ public class FtpsClientTest { verify(ftpsClientMock).setTrustManager(trustManagerMock); verify(ftpsClientMock).connect(XNF_ADDRESS, PORT); verify(ftpsClientMock).login(USERNAME, PASSWORD); - verify(ftpsClientMock, times(3)).isConnected(); - verifyNoMoreInteractions(ftpsClientMock); } @Test @@ -218,12 +202,9 @@ public class FtpsClientTest { when(ftpsClientMock.login(USERNAME, PASSWORD)).thenReturn(true); when(ftpsClientMock.getReplyCode()).thenReturn(FTPReply.BAD_COMMAND_SEQUENCE); - ImmutableFileServerData fileServerData = ImmutableFileServerData.builder().serverAddress(XNF_ADDRESS) - .userId(USERNAME).password(PASSWORD).port(PORT).build(); - - FileCollectResult result = clientUnderTest.collectFile(fileServerData, REMOTE_FILE_PATH, LOCAL_FILE_PATH); + assertThatThrownBy(() -> clientUnderTest.collectFile(REMOTE_FILE_PATH, LOCAL_FILE_PATH)) + .hasMessage("Unable to connect to xNF. 127.0.0.1 xNF reply code: 503"); - assertFalse(result.downloadSuccessful()); verify(ftpsClientMock).setNeedClientAuth(true); verify(keyManagerUtilsMock).setCredentials(FTP_KEY_PATH, FTP_KEY_PASSWORD); verify(ftpsClientMock).setKeyManager(keyManagerMock); @@ -235,7 +216,7 @@ public class FtpsClientTest { verify(ftpsClientMock).connect(XNF_ADDRESS, PORT); verify(ftpsClientMock).login(USERNAME, PASSWORD); verify(ftpsClientMock, times(2)).getReplyCode(); - verify(ftpsClientMock, times(3)).isConnected(); + verify(ftpsClientMock, times(2)).isConnected(); verifyNoMoreInteractions(ftpsClientMock); } @@ -248,12 +229,9 @@ public class FtpsClientTest { doThrow(new IOException()).when(ftpsClientMock).connect(XNF_ADDRESS, PORT); - ImmutableFileServerData fileServerData = ImmutableFileServerData.builder().serverAddress(XNF_ADDRESS) - .userId(USERNAME).password(PASSWORD).port(PORT).build(); + assertThatThrownBy(() -> clientUnderTest.collectFile(REMOTE_FILE_PATH, LOCAL_FILE_PATH)) + .hasMessage("Could not open connection: java.io.IOException"); - FileCollectResult result = clientUnderTest.collectFile(fileServerData, REMOTE_FILE_PATH, LOCAL_FILE_PATH); - - assertFalse(result.downloadSuccessful()); verify(ftpsClientMock).setNeedClientAuth(true); verify(keyManagerUtilsMock).setCredentials(FTP_KEY_PATH, FTP_KEY_PASSWORD); verify(ftpsClientMock).setKeyManager(keyManagerMock); @@ -263,7 +241,7 @@ public class FtpsClientTest { verify(trustManagerFactoryMock).init(keyStoreMock); verify(ftpsClientMock).setTrustManager(trustManagerMock); verify(ftpsClientMock).connect(XNF_ADDRESS, PORT); - verify(ftpsClientMock, times(3)).isConnected(); + verify(ftpsClientMock, times(2)).isConnected(); verifyNoMoreInteractions(ftpsClientMock); } @@ -278,33 +256,9 @@ public class FtpsClientTest { doThrow(new IOException()).when(localFileMock).createNewFile(); - ImmutableFileServerData fileServerData = ImmutableFileServerData.builder().serverAddress(XNF_ADDRESS) - .userId(USERNAME).password(PASSWORD).port(PORT).build(); - - FileCollectResult result = clientUnderTest.collectFile(fileServerData, REMOTE_FILE_PATH, LOCAL_FILE_PATH); + assertThatThrownBy(() -> clientUnderTest.collectFile(REMOTE_FILE_PATH, LOCAL_FILE_PATH)) + .hasMessage("Could not open connection: java.io.IOException"); - assertFalse(result.downloadSuccessful()); - verify(localFileMock, times(1)).delete(); - verify(ftpsClientMock).setNeedClientAuth(true); - verify(keyManagerUtilsMock).setCredentials(FTP_KEY_PATH, FTP_KEY_PASSWORD); - verify(ftpsClientMock).setKeyManager(keyManagerMock); - verify(fileResourceMock).setPath(TRUSTED_CA_PATH); - verify(keyStoreWrapperMock).load(inputStreamMock, TRUSTED_CA_PASSWORD.toCharArray()); - verify(inputStreamMock, times(1)).close(); - verify(trustManagerFactoryMock).init(keyStoreMock); - verify(ftpsClientMock).setTrustManager(trustManagerMock); - verify(ftpsClientMock).connect(XNF_ADDRESS, PORT); - verify(ftpsClientMock).login(USERNAME, PASSWORD); - verify(ftpsClientMock).getReplyCode(); - verify(ftpsClientMock, times(1)).enterLocalPassiveMode(); - verify(ftpsClientMock).execPBSZ(0); - verify(ftpsClientMock).execPROT("P"); - verify(ftpsClientMock).setFileType(FTP.BINARY_FILE_TYPE); - verify(ftpsClientMock).setBufferSize(1024 * 1024); - verify(localFileMock).setPath(LOCAL_FILE_PATH); - verify(localFileMock, times(1)).createNewFile(); - verify(ftpsClientMock, times(2)).isConnected(); - verifyNoMoreInteractions(ftpsClientMock); } @Test @@ -319,14 +273,11 @@ public class FtpsClientTest { when(localFileMock.getFile()).thenReturn(fileMock); OutputStream osMock = mock(OutputStream.class); when(outputStreamMock.getOutputStream(fileMock)).thenReturn(osMock); - when(ftpsClientMock.retrieveFile(REMOTE_FILE_PATH, osMock)).thenReturn(false); - - ImmutableFileServerData fileServerData = ImmutableFileServerData.builder().serverAddress(XNF_ADDRESS) - .userId(USERNAME).password(PASSWORD).port(PORT).build(); + doThrow(new DatafileTaskException("problemas")).when(ftpsClientMock).retrieveFile(REMOTE_FILE_PATH, osMock); - FileCollectResult result = clientUnderTest.collectFile(fileServerData, REMOTE_FILE_PATH, LOCAL_FILE_PATH); + assertThatThrownBy(() -> clientUnderTest.collectFile(REMOTE_FILE_PATH, LOCAL_FILE_PATH)) + .hasMessage("problemas"); - assertFalse(result.downloadSuccessful()); verify(ftpsClientMock).setNeedClientAuth(true); verify(keyManagerUtilsMock).setCredentials(FTP_KEY_PATH, FTP_KEY_PASSWORD); verify(ftpsClientMock).setKeyManager(keyManagerMock); diff --git a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/SchemeTest.java b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/SchemeTest.java new file mode 100644 index 00000000..162a0e78 --- /dev/null +++ b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/SchemeTest.java @@ -0,0 +1,51 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2019 Nordix Foundation. 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.onap.dcaegen2.collectors.datafile.ftp; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; +import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException; + +/** + * @author <a href="mailto:henrik.b.andersson@est.tech">Henrik Andersson</a> + * + */ +public class SchemeTest { + @Test + public void getSchemeFromString_properScheme() throws DatafileTaskException { + + Scheme actualScheme = Scheme.getSchemeFromString("FTPES"); + assertEquals(Scheme.FTPS, actualScheme); + + actualScheme = Scheme.getSchemeFromString("FTPS"); + assertEquals(Scheme.FTPS, actualScheme); + + actualScheme = Scheme.getSchemeFromString("SFTP"); + assertEquals(Scheme.SFTP, actualScheme); + } + + @Test + public void getSchemeFromString_invalidScheme() { + assertTrue(assertThrows(DatafileTaskException.class, () -> Scheme.getSchemeFromString("invalid")).getMessage() + .startsWith("DFC does not support protocol invalid")); + } +} diff --git a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/SftpClientTest.java b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/SftpClientTest.java index e9e68bb8..7f32e8c3 100644 --- a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/SftpClientTest.java +++ b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/ftp/SftpClientTest.java @@ -1,27 +1,25 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 + * 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 + * 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. + * 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.onap.dcaegen2.collectors.datafile.ftp; import static java.nio.charset.StandardCharsets.UTF_8; + import static org.apache.commons.io.IOUtils.toByteArray; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import com.github.stefanbirkner.fakesftpserver.rule.FakeSftpServerRule; @@ -31,19 +29,21 @@ import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import com.jcraft.jsch.SftpException; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import org.junit.Rule; import org.junit.Test; +import org.onap.dcaegen2.collectors.datafile.exceptions.DatafileTaskException; public class SftpClientTest { private static final String USERNAME = "bob"; private static final String PASSWORD = "123"; private static final String DUMMY_CONTENT = "dummy content"; - private static final String LOCAL_DUMMY_FILE = "target/dummy.txt"; + private static final Path LOCAL_DUMMY_FILE = Paths.get("target/dummy.txt"); private static final String REMOTE_DUMMY_FILE = "/dummy_directory/dummy_file.txt"; private static final JSch JSCH = new JSch(); private static final int TIMEOUT = 2000; @@ -52,49 +52,53 @@ public class SftpClientTest { public final FakeSftpServerRule sftpServer = new FakeSftpServerRule().addUser(USERNAME, PASSWORD); @Test - public void collectFile_withOKresponse() throws IOException, JSchException, SftpException { - SftpClient sftpClient = new SftpClient(); - sftpServer.putFile(REMOTE_DUMMY_FILE, DUMMY_CONTENT, UTF_8); - byte[] file = downloadFile(sftpServer, REMOTE_DUMMY_FILE); + public void collectFile_withOKresponse() throws DatafileTaskException, IOException, JSchException, SftpException, Exception { FileServerData expectedFileServerData = ImmutableFileServerData.builder().serverAddress("127.0.0.1") .userId(USERNAME).password(PASSWORD).port(sftpServer.getPort()).build(); - sftpClient.collectFile(expectedFileServerData, REMOTE_DUMMY_FILE, - LOCAL_DUMMY_FILE); - byte[] localFile = Files.readAllBytes(new File(LOCAL_DUMMY_FILE).toPath()); + SftpClient sftpClient = new SftpClient(expectedFileServerData); + sftpServer.putFile(REMOTE_DUMMY_FILE, DUMMY_CONTENT, UTF_8); + byte[] file = downloadFile(sftpServer, REMOTE_DUMMY_FILE); + + sftpClient.collectFile(REMOTE_DUMMY_FILE, LOCAL_DUMMY_FILE); + byte[] localFile = Files.readAllBytes(LOCAL_DUMMY_FILE.toFile().toPath()); assertThat(new String(file, UTF_8)).isEqualTo(DUMMY_CONTENT); assertThat(new String(localFile, UTF_8)).isEqualTo(DUMMY_CONTENT); } @Test public void collectFile_withWrongUserName_shouldFail() throws IOException, JSchException, SftpException { - SftpClient sftpClient = new SftpClient(); - sftpServer.putFile(REMOTE_DUMMY_FILE, DUMMY_CONTENT, UTF_8); - byte[] file = downloadFile(sftpServer, REMOTE_DUMMY_FILE); FileServerData expectedFileServerData = ImmutableFileServerData.builder().serverAddress("127.0.0.1") .userId("Wrong").password(PASSWORD).port(sftpServer.getPort()).build(); - FileCollectResult actualResult = sftpClient.collectFile(expectedFileServerData, REMOTE_DUMMY_FILE, - LOCAL_DUMMY_FILE); + SftpClient sftpClient = new SftpClient(expectedFileServerData); + sftpServer.putFile(REMOTE_DUMMY_FILE, DUMMY_CONTENT, UTF_8); - assertFalse(actualResult.downloadSuccessful()); - String expectedErrorMessage = "Unable to set up SFTP connection to xNF. Data: " - + "FileServerData{serverAddress=127.0.0.1, userId=Wrong, password=123, port="; - assertTrue(actualResult.getErrorData().toString().startsWith(expectedErrorMessage)); + String errorMessage = ""; + try { + sftpClient.collectFile(REMOTE_DUMMY_FILE, LOCAL_DUMMY_FILE); + } catch (Exception e) { + errorMessage = e.getMessage(); + } + + assertTrue(errorMessage.contains("Auth fail")); } @Test public void collectFile_withWrongFileName_shouldFail() throws IOException, JSchException, SftpException { - SftpClient sftpClient = new SftpClient(); - sftpServer.putFile(REMOTE_DUMMY_FILE, DUMMY_CONTENT, UTF_8); - byte[] file = downloadFile(sftpServer, REMOTE_DUMMY_FILE); FileServerData expectedFileServerData = ImmutableFileServerData.builder().serverAddress("127.0.0.1") .userId(USERNAME).password(PASSWORD).port(sftpServer.getPort()).build(); - FileCollectResult actualResult = sftpClient.collectFile(expectedFileServerData, "wrong", - LOCAL_DUMMY_FILE); + SftpClient sftpClient = new SftpClient(expectedFileServerData); + sftpServer.putFile(REMOTE_DUMMY_FILE, DUMMY_CONTENT, UTF_8); + + String errorMessage = ""; + try { + sftpClient.collectFile("wrong", LOCAL_DUMMY_FILE); + } catch (Exception e) { + errorMessage = e.getMessage(); + } - assertFalse(actualResult.downloadSuccessful()); String expectedErrorMessage = "Unable to get file from xNF. Data: FileServerData{serverAddress=127.0.0.1, " + "userId=bob, password=123, port="; - assertTrue(actualResult.getErrorData().toString().startsWith(expectedErrorMessage)); + assertTrue(errorMessage.startsWith(expectedErrorMessage)); } private static Session connectToServer(FakeSftpServerRule sftpServer) throws JSchException { @@ -133,5 +137,4 @@ public class SftpClientTest { session.disconnect(); } } - } diff --git a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/DmaapReactiveWebClientTest.java b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/DmaapReactiveWebClientTest.java index 128f78f5..54db7401 100644 --- a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/DmaapReactiveWebClientTest.java +++ b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/DmaapReactiveWebClientTest.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 diff --git a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/HttpUtilsTest.java b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/HttpUtilsTest.java index 4a9f9c1f..c973a120 100644 --- a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/HttpUtilsTest.java +++ b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/HttpUtilsTest.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018-2019 Nordix Foundation. 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 @@ -16,9 +16,9 @@ package org.onap.dcaegen2.collectors.datafile.service; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; class HttpUtilsTest { diff --git a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/producer/DmaapProducerReactiveHttpClientTest.java b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/producer/DmaapProducerReactiveHttpClientTest.java index beac4ee8..a0d3673d 100644 --- a/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/producer/DmaapProducerReactiveHttpClientTest.java +++ b/datafile-dmaap-client/src/test/java/org/onap/dcaegen2/collectors/datafile/service/producer/DmaapProducerReactiveHttpClientTest.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START====================================================================== - * Copyright (C) 2018 NOKIA Intellectual Property, 2018 Nordix Foundation. All rights reserved. + * Copyright (C) 2018 NOKIA Intellectual Property, 2018-2019 Nordix Foundation. 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 @@ -29,6 +29,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.nio.file.Paths; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -41,7 +42,6 @@ import org.apache.http.entity.ByteArrayEntity; import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import org.onap.dcaegen2.collectors.datafile.io.IFileSystemResource; import org.onap.dcaegen2.collectors.datafile.model.CommonFunctions; import org.onap.dcaegen2.collectors.datafile.model.ConsumerDmaapModel; @@ -49,6 +49,7 @@ import org.onap.dcaegen2.collectors.datafile.model.ImmutableConsumerDmaapModel; import org.onap.dcaegen2.collectors.datafile.service.HttpUtils; import org.onap.dcaegen2.services.sdk.rest.services.dmaap.client.config.DmaapPublisherConfiguration; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.web.util.DefaultUriBuilderFactory; import reactor.test.StepVerifier; @@ -122,17 +123,17 @@ class DmaapProducerReactiveHttpClientTest { void getHttpResponse_Success() throws Exception { mockWebClientDependantObject(true); - URI expectedUri = new DefaultUriBuilderFactory().builder().scheme(HTTPS_SCHEME).host(HOST).port(PORT) - .path(PUBLISH_TOPIC + URI_SEPARATOR + DEFAULT_FEED_ID + URI_SEPARATOR + FILE_NAME).build(); - HttpPut httpPut = new HttpPut(); httpPut.addHeader(HttpHeaders.CONTENT_TYPE, APPLICATION_OCTET_STREAM_CONTENT_TYPE); - JsonElement metaData = new JsonParser().parse(new CommonFunctions().createJsonBody(consumerDmaapModel)); + URI expectedUri = new DefaultUriBuilderFactory().builder().scheme(HTTPS_SCHEME).host(HOST).port(PORT) + .path(PUBLISH_TOPIC + URI_SEPARATOR + DEFAULT_FEED_ID + URI_SEPARATOR + FILE_NAME).build(); + httpPut.setURI(expectedUri); + + JsonElement metaData = new JsonParser().parse(CommonFunctions.createJsonBody(consumerDmaapModel)); metaData.getAsJsonObject().remove(NAME_JSON_TAG).getAsString(); metaData.getAsJsonObject().remove(INTERNAL_LOCATION_JSON_TAG); httpPut.addHeader(X_DMAAP_DR_META, metaData.toString()); - httpPut.setURI(expectedUri); String plainCreds = "dradmin" + ":" + "dradmin"; byte[] plainCredsBytes = plainCreds.getBytes(StandardCharsets.ISO_8859_1); @@ -142,9 +143,9 @@ class DmaapProducerReactiveHttpClientTest { fileStream.reset(); StepVerifier.create(dmaapProducerReactiveHttpClient.getDmaapProducerResponse(consumerDmaapModel)) - .expectNext(responseMock.toString()).verifyComplete(); + .expectNext(HttpStatus.OK).verifyComplete(); - verify(fileSystemResourceMock).setPath("target/" + FILE_NAME); + verify(fileSystemResourceMock).setPath(Paths.get("target/" + FILE_NAME)); InputStream fileInputStream = fileSystemResourceMock.getInputStream(); httpPut.setEntity(new ByteArrayEntity(IOUtils.toByteArray(fileInputStream))); } @@ -153,7 +154,8 @@ class DmaapProducerReactiveHttpClientTest { void getHttpResponse_Fail() throws Exception { mockWebClientDependantObject(false); StepVerifier.create(dmaapProducerReactiveHttpClient.getDmaapProducerResponse(consumerDmaapModel)) - .verifyComplete(); + .expectError() + .verify(); } private void mockWebClientDependantObject(boolean success) |