import com.fasterxml.jackson.databind.node.ObjectNode
import com.fasterxml.jackson.databind.ObjectMapper
import org.onap.ccsdk.cds.blueprintsprocessor.core.api.data.ExecutionServiceInput
-import org.onap.ccsdk.cds.blueprintsprocessor.functions.resource.resolution.storedContentFromResolvedArtifactNB
import org.onap.ccsdk.cds.blueprintsprocessor.rest.BasicAuthRestClientProperties
import org.onap.ccsdk.cds.blueprintsprocessor.rest.RestClientProperties
import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BasicAuthRestClientService
import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.RestLoggerService
import org.onap.ccsdk.cds.blueprintsprocessor.services.execution.AbstractScriptComponentFunction
import org.onap.ccsdk.cds.controllerblueprints.core.utils.JacksonUtils
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.BluePrintArchiveUtils
+import org.onap.ccsdk.cds.controllerblueprints.core.utils.ArchiveType
import org.apache.commons.io.IOUtils
import org.apache.commons.io.FilenameUtils
import org.apache.http.client.entity.EntityBuilder
import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.annotation.JsonProperty
import java.util.ArrayList
+import java.util.LinkedHashMap
import java.io.IOException
import java.io.File
import java.nio.file.Files
import java.nio.charset.Charset
import java.util.Base64
import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
-
-import java.io.BufferedInputStream
-import java.io.FileInputStream
-import java.io.FileOutputStream
-import java.util.zip.GZIPInputStream
+import org.yaml.snakeyaml.Yaml
open class K8sProfileUpload : AbstractScriptComponentFunction() {
override suspend fun processNB(executionRequest: ExecutionServiceInput) {
log.info("executing K8s Profile Upload script")
- val resolution_key = getDynamicProperties("resolution-key").asText()
- log.info("resolution_key: $resolution_key")
val baseK8sApiUrl = getDynamicProperties("api-access").get("url").asText()
val k8sApiUsername = getDynamicProperties("api-access").get("username").asText()
val prefixList: ArrayList<String> = getTemplatePrefixList(executionRequest)
for (prefix in prefixList) {
- if (prefix.toLowerCase().equals("vnf"))
+ if (prefix.toLowerCase().equals("vnf")) {
+ log.info("For vnf-level resource-assignment, profile upload is not performed")
continue
+ }
- val payload = storedContentFromResolvedArtifactNB(resolution_key, prefix)
- log.info("Uploading K8S profile for template prefix $prefix")
+ val assignmentParams = getDynamicProperties("assignment-params")
+ val payloadObject = JacksonUtils.jsonNode(assignmentParams.get(prefix).asText()) as ObjectNode
- val payloadObject = JacksonUtils.jsonNode(payload) as ObjectNode
+ log.info("Uploading K8S profile for template prefix $prefix")
val vfModuleModelInvariantUuid: String = getResolvedParameter(payloadObject, "vf-module-model-invariant-uuid")
val vfModuleModelUuid: String = getResolvedParameter(payloadObject, "vf-module-model-version")
log.info("k8s-rb-profile-name: $k8sRbProfileName")
if (k8sRbProfileName.equals("")) {
- log.info("Profile Name Not Defined - skipping upload")
+ throw BluePrintProcessorException("K8s rb profile name is empty! Either define profile name to use or choose default")
+ }
+ if (k8sRbProfileName.equals("default") and api.hasProfile(k8sRbProfileName)) {
+ log.info("Using default profile - skipping upload")
} else {
if (api.hasProfile(k8sRbProfileName)) {
log.info("Profile Already Existing - skipping upload")
} else {
- val profileFilePath = prepareProfileFile(k8sRbProfileName)
+ val profileFilePath: Path = prepareProfileFile(k8sRbProfileName, prefix.equals("vpkg"))
var profile = K8sProfile()
profile.profileName = k8sRbProfileName
}
}
- fun prepareProfileFile(k8sRbProfileName: String): Path {
+ fun prepareProfileFile(k8sRbProfileName: String, profileModificationAllowed: Boolean): Path {
val bluePrintContext = bluePrintRuntimeService.bluePrintContext()
val bluePrintBasePath: String = bluePrintContext.rootPath
var profileFilePath: Path = Paths.get(bluePrintBasePath.plus(File.separator).plus("Templates").plus(File.separator).plus("k8s-profiles").plus(File.separator).plus("${k8sRbProfileName}.tar.gz"))
if (!profileFile.exists())
throw BluePrintProcessorException("K8s Profile template file ${profileFilePath} does not exists")
+ val tempMainPath: File = createTempDir("k8s-profile-", "")
+ val tempProfilePath: File = createTempDir("${k8sRbProfileName}-", "", tempMainPath)
+ log.info("Decompressing profile to ${tempProfilePath.toString()}")
+
+ val decompressedProfile: File = BluePrintArchiveUtils.deCompress(profileFilePath.toFile(),
+ "${tempProfilePath.toString()}", ArchiveType.TarGz)
+
+ log.info("${profileFilePath.toString()} decompression completed")
+
+ if (profileModificationAllowed) {
+ //Here we can add extra files inside the archive
+ val profileModificationDecisionData = getDynamicProperties("profile-modification-decision-data")
+ log.info("Profile modification decision data: ${profileModificationDecisionData}")
+ if (profileModificationDecisionData != null && profileModificationDecisionData.asText().toInt() > 0) {
+ log.info("Modification of profile content")
+
+ val profileArtifacts = getDynamicProperties("profile-artifacts")
+ val sshServiceFileContent = profileArtifacts.get("ssh-service").asText()
+ val sshServiceFileName = "ssh-service.yaml"
+ val serviceFilePath = tempProfilePath.toString().plus(File.separator).plus(sshServiceFileName)
+ File(serviceFilePath).bufferedWriter().use { out -> out.write(sshServiceFileContent) }
+ val manifestFileName = tempProfilePath.toString().plus(File.separator).plus("manifest.yaml")
+ var finalManifest = ""
+ File(manifestFileName).bufferedReader().use { inr ->
+ val manifestYaml = Yaml()
+ val manifestObject: Map<String, Any> = manifestYaml.load(inr)
+ val typeObject: MutableMap<String, Any> = manifestObject.get("type") as MutableMap<String, Any>
+ if (!typeObject.containsKey("configresource"))
+ typeObject.put("configresource", ArrayList<LinkedHashMap<String, Any>>())
+ val configFiles: MutableList<LinkedHashMap<String, Any>> = typeObject.get("configresource") as MutableList<LinkedHashMap<String, Any>>
+ val sshConfigFile = LinkedHashMap<String, Any>()
+ sshConfigFile.put("filepath", sshServiceFileName)
+ sshConfigFile.put("chartpath", "vpkg/templates/${sshServiceFileName}")
+ configFiles.add(sshConfigFile)
+ finalManifest = manifestYaml.dump(manifestObject)
+ }
+ File(manifestFileName).bufferedWriter().use { out -> out.write(finalManifest) }
+ log.info("Modified K8s profile manifest file")
+ log.info(finalManifest)
+ log.info("Modification of profile completed")
+ }
+ }
+
+ profileFilePath = Paths.get(tempMainPath.toString().plus(File.separator).plus("${k8sRbProfileName}.tar.gz"))
+
+ if (!BluePrintArchiveUtils.compress(decompressedProfile, profileFilePath.toFile(),
+ ArchiveType.TarGz)) {
+ throw BluePrintProcessorException("Profile compression has failed")
+ }
+
+ log.info("${profileFilePath.toString()} compression completed")
+
return profileFilePath
}
var basicAuthRestClientProperties: BasicAuthRestClientProperties = BasicAuthRestClientProperties()
basicAuthRestClientProperties.username = username
basicAuthRestClientProperties.password = password
- basicAuthRestClientProperties.url = "$baseUrl/api/multicloud-k8s/v1/v1/rb/definition/${definition}/${definitionVersion}"
+ basicAuthRestClientProperties.url = "$baseUrl/v1/rb/definition/${definition}/${definitionVersion}"
basicAuthRestClientProperties.additionalHeaders = mapOfHeaders
this.service = UploadFileRestClientService(basicAuthRestClientProperties)