Merge "Add declarative acceptance tests"
authorDan Timoney <dtimoney@att.com>
Fri, 9 Aug 2019 21:49:29 +0000 (21:49 +0000)
committerGerrit Code Review <gerrit@onap.org>
Fri, 9 Aug 2019 21:49:29 +0000 (21:49 +0000)
1  2 
components/parent/pom.xml
ms/blueprintsprocessor/parent/pom.xml
ms/controllerblueprints/modules/blueprint-core/src/main/kotlin/org/onap/ccsdk/cds/controllerblueprints/core/utils/BluePrintArchiveUtils.kt
ms/controllerblueprints/parent/pom.xml

      <name>Components Parent</name>
      <packaging>pom</packaging>
      <properties>
 -        <kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
 -        <grpc.version>1.18.0</grpc.version>
 -        <protobuff.java.utils.version>3.6.1</protobuff.java.utils.version>
          <eelf.version>1.0.0</eelf.version>
          <guava.version>27.0.1-jre</guava.version>
          <springfox.swagger2.version>2.9.2</springfox.swagger2.version>
          <h2database.version>1.4.197</h2database.version>
          <onap.logger.slf4j>1.2.2</onap.logger.slf4j>
 -        <mockk.version>1.9</mockk.version>
          <velocity.version>1.7</velocity.version>
          <jinja.version>2.5.1</jinja.version>
      </properties>
                  <artifactId>commons-io</artifactId>
                  <version>2.6</version>
              </dependency>
-             <dependency>
-                 <groupId>org.apache.commons</groupId>
-                 <artifactId>commons-compress</artifactId>
-                 <version>1.15</version>
-             </dependency>
              <dependency>
                  <groupId>org.apache.velocity</groupId>
                  <artifactId>velocity</artifactId>
              <groupId>commons-io</groupId>
              <artifactId>commons-io</artifactId>
          </dependency>
-         <dependency>
-             <groupId>org.apache.commons</groupId>
-             <artifactId>commons-compress</artifactId>
-         </dependency>
          <dependency>
              <groupId>com.jayway.jsonpath</groupId>
              <artifactId>json-path</artifactId>
      <name>Blueprints Processor Parent</name>
      <description>Blueprints Processor Parent</description>
      <properties>
 -        <kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
 -        <grpc.version>1.18.0</grpc.version>
          <sshd.version>2.2.0</sshd.version>
          <jsch.version>0.1.55</jsch.version>
 -        <protobuff.java.utils.version>3.6.1</protobuff.java.utils.version>
          <spring.kafka.version>2.2.6.RELEASE</spring.kafka.version>
          <kafka.version>2.2.0</kafka.version>
          <eelf.version>1.0.0</eelf.version>
@@@ -41,6 -44,7 +41,6 @@@
          <h2database.version>1.4.197</h2database.version>
          <onap.logger.slf4j>1.2.2</onap.logger.slf4j>
          <powermock.version>1.7.4</powermock.version>
 -        <mockk.version>1.9</mockk.version>
          <dmaap.client.version>1.1.5</dmaap.client.version>
          <jinja.version>2.5.1</jinja.version>
          <velocity.version>1.7</velocity.version>
                  <artifactId>commons-io</artifactId>
                  <version>2.6</version>
              </dependency>
-             <dependency>
-                 <groupId>org.apache.commons</groupId>
-                 <artifactId>commons-compress</artifactId>
-                 <version>1.15</version>
-             </dependency>
              <dependency>
                  <groupId>org.apache.velocity</groupId>
                  <artifactId>velocity</artifactId>
              <groupId>commons-io</groupId>
              <artifactId>commons-io</artifactId>
          </dependency>
-         <dependency>
-             <groupId>org.apache.commons</groupId>
-             <artifactId>commons-compress</artifactId>
-         </dependency>
          <dependency>
              <groupId>com.jayway.jsonpath</groupId>
              <artifactId>json-path</artifactId>
@@@ -1,6 -1,7 +1,7 @@@
  /*
   * Copyright © 2017-2018 AT&T Intellectual Property.
   * Modifications Copyright © 2019 Bell Canada.
+  * Modifications Copyright © 2019 Nordix Foundation.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
  
  package org.onap.ccsdk.cds.controllerblueprints.core.utils
  
- import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
- import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
- import org.apache.commons.io.IOUtils
+ import com.google.common.base.Predicates
  import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
  import org.slf4j.LoggerFactory
  import java.io.BufferedInputStream
+ import java.io.ByteArrayOutputStream
  import java.io.File
- import java.io.FileInputStream
+ import java.io.FileOutputStream
  import java.io.IOException
+ import java.io.OutputStream
  import java.nio.charset.Charset
+ import java.nio.file.FileVisitResult
+ import java.nio.file.Files
+ import java.nio.file.Path
+ import java.nio.file.SimpleFileVisitor
+ import java.nio.file.attribute.BasicFileAttributes
+ import java.util.function.Predicate
+ import java.util.zip.Deflater
+ import java.util.zip.ZipEntry
  import java.util.zip.ZipFile
+ import java.util.zip.ZipOutputStream
  
  class BluePrintArchiveUtils {
  
           *
           * @param source the base directory
           * @param destination the output filename
-          * @param absolute store absolute filepath (from directory) or only filename
           * @return True if OK
           */
-         fun compress(source: File, destination: File, absolute: Boolean): Boolean {
+         fun compress(source: File, destination: File): Boolean {
              try {
 +                if(!destination.parentFile.exists()) {
 +                    destination.parentFile.mkdirs()
 +                }
                  destination.createNewFile()
-                 ZipArchiveOutputStream(destination).use {
-                     recurseFiles(source, source, it, absolute)
+                 val ignoreZipFiles = Predicate<Path> { path -> !path.endsWith(".zip") && !path.endsWith(".ZIP") }
+                 FileOutputStream(destination).use { out ->
+                     compressFolder(source.toPath(), out, pathFilter = ignoreZipFiles)
                  }
              } catch (e: Exception) {
                  log.error("Fail to compress folder($source) to path(${destination.path})", e)
          }
  
          /**
-          * Recursive traversal to add files
-          *
-          * @param root
-          * @param file
-          * @param zaos
-          * @param absolute
-          * @throws IOException
+          * In-memory compress an entire folder.
           */
-         @Throws(IOException::class)
-         private fun recurseFiles(root: File, file: File, zaos: ZipArchiveOutputStream,
-                                  absolute: Boolean) {
-             if (file.isDirectory) {
-                 // recursive call
-                 val files = file.listFiles()
-                 for (fileChild in files!!) {
-                     recurseFiles(root, fileChild, zaos, absolute)
-                 }
-             } else if (!file.name.endsWith(".zip") && !file.name.endsWith(".ZIP")) {
-                 val filename = if (absolute) {
-                     file.absolutePath.substring(root.absolutePath.length)
-                 } else {
-                     file.name
-                 }
-                 val zae = ZipArchiveEntry(filename)
-                 zae.size = file.length()
-                 zaos.putArchiveEntry(zae)
-                 FileInputStream(file).use {
-                     IOUtils.copy(it, zaos)
-                     it.close()
-                 }
-                 zaos.closeArchiveEntry()
-             }
+         fun compressToBytes(baseDir: Path, compressionLevel: Int = Deflater.NO_COMPRESSION): ByteArray {
+             return compressFolder(baseDir, ByteArrayOutputStream(), compressionLevel = compressionLevel)
+                     .toByteArray()
          }
  
+         /**
+          * Compress an entire folder.
+          *
+          * @param baseDir path of base folder to be packaged.
+          * @param output the output stream
+          * @param pathFilter filter to ignore files based on its path.
+          * @param compressionLevel the wanted compression level.
+          * @param fixedModificationTime to force every entry to have this modification time.
+          * Useful for reproducible operations, like tests, for example.
+          */
+         private fun <T> compressFolder(baseDir: Path, output: T,
+                                        pathFilter: Predicate<Path> = Predicates.alwaysTrue(),
+                                        compressionLevel: Int = Deflater.DEFAULT_COMPRESSION,
+                                        fixedModificationTime: Long? = null): T
+                 where T : OutputStream {
+             ZipOutputStream(output)
+                     .apply { setLevel(compressionLevel) }
+                     .use { zos ->
+                         Files.walkFileTree(baseDir, object : SimpleFileVisitor<Path>() {
+                             @Throws(IOException::class)
+                             override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult {
+                                 if (pathFilter.test(file)) {
+                                     val zipEntry = ZipEntry(baseDir.relativize(file).toString())
+                                     fixedModificationTime?.let {
+                                         zipEntry.time = it
+                                     }
+                                     zipEntry.time = 0;
+                                     zos.putNextEntry(zipEntry)
+                                     Files.copy(file, zos)
+                                     zos.closeEntry()
+                                 }
+                                 return FileVisitResult.CONTINUE
+                             }
+                             @Throws(IOException::class)
+                             override fun preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult {
+                                 val zipEntry = ZipEntry(baseDir.relativize(dir).toString() + "/")
+                                 fixedModificationTime?.let {
+                                     zipEntry.time = it
+                                 }
+                                 zos.putNextEntry(zipEntry)
+                                 zos.closeEntry()
+                                 return FileVisitResult.CONTINUE
+                             }
+                         })
+                     }
+             return output
+         }
  
          fun deCompress(zipFile: File, targetPath: String): File {
              val zip = ZipFile(zipFile, Charset.defaultCharset())
      <name>Controller Blueprints Parent</name>
      <packaging>pom</packaging>
      <properties>
 -        <kotlin.compiler.jvmTarget>1.8</kotlin.compiler.jvmTarget>
 -        <grpc.version>1.18.0</grpc.version>
 -        <protobuff.java.utils.version>3.6.1</protobuff.java.utils.version>
          <eelf.version>1.0.0</eelf.version>
          <guava.version>27.0.1-jre</guava.version>
          <springfox.swagger2.version>2.9.2</springfox.swagger2.version>
          <h2database.version>1.4.197</h2database.version>
          <onap.logger.slf4j>1.2.2</onap.logger.slf4j>
          <powermock.version>1.7.4</powermock.version>
 -        <mockk.version>1.9</mockk.version>
          <jinja.version>2.5.1</jinja.version>
          <velocity.version>1.7</velocity.version>
      </properties>
                  <artifactId>commons-io</artifactId>
                  <version>2.6</version>
              </dependency>
-             <dependency>
-                 <groupId>org.apache.commons</groupId>
-                 <artifactId>commons-compress</artifactId>
-                 <version>1.15</version>
-             </dependency>
              <dependency>
                  <groupId>org.apache.velocity</groupId>
                  <artifactId>velocity</artifactId>
              <groupId>commons-io</groupId>
              <artifactId>commons-io</artifactId>
          </dependency>
-         <dependency>
-             <groupId>org.apache.commons</groupId>
-             <artifactId>commons-compress</artifactId>
-         </dependency>
          <dependency>
              <groupId>com.jayway.jsonpath</groupId>
              <artifactId>json-path</artifactId>