aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLukasz Rajewski <lukasz.rajewski@orange.com>2020-02-28 15:24:52 +0100
committerLukasz Rajewski <lukasz.rajewski@orange.com>2020-03-03 11:20:41 +0100
commit7d44d14b86dd4858afadb55c9ca38a4251e13dac (patch)
tree98400bf1750b9090f7bcb3bb9b4c53197d241625
parent39fd16c1871136565aa464d097aa9e21856a1dfb (diff)
K8s Profile mod on demand
This change provides an example of modificatioin of k8s profile on demand. In here the ssh service of vPGN is created on demand and user can decide about the number of ssh exposed port Change-Id: Ie734e4f832d6a07ff53a0f108aed74a43d325b22 Issue-ID: INT-1458 Signed-off-by: Lukasz Rajewski <lukasz.rajewski@orange.com>
-rw-r--r--heat/vFW_CNF_CDS/templates/cba/Definitions/data_types.json5
-rw-r--r--heat/vFW_CNF_CDS/templates/cba/Definitions/resources_definition_types.json18
-rw-r--r--heat/vFW_CNF_CDS/templates/cba/Definitions/vFW_CNF_CDS.json66
-rw-r--r--heat/vFW_CNF_CDS/templates/cba/Scripts/kotlin/KotlinK8sProfileUpload.kt41
-rw-r--r--heat/vFW_CNF_CDS/templates/cba/Templates/k8s-profiles/ssh-service-mapping.json15
-rw-r--r--heat/vFW_CNF_CDS/templates/cba/Templates/k8s-profiles/ssh-service-template.vtl2
6 files changed, 134 insertions, 13 deletions
diff --git a/heat/vFW_CNF_CDS/templates/cba/Definitions/data_types.json b/heat/vFW_CNF_CDS/templates/cba/Definitions/data_types.json
index 52d89c17..988d059c 100644
--- a/heat/vFW_CNF_CDS/templates/cba/Definitions/data_types.json
+++ b/heat/vFW_CNF_CDS/templates/cba/Definitions/data_types.json
@@ -383,6 +383,11 @@
"type" : "string",
"default" : "default"
},
+ "vpg-management-port" : {
+ "description" : "SSH external port of ssh. When 0 ssh service will not be exposed",
+ "type" : "string",
+ "default": "0"
+ },
"vnf_name" : {
"description" : "",
"required" : false,
diff --git a/heat/vFW_CNF_CDS/templates/cba/Definitions/resources_definition_types.json b/heat/vFW_CNF_CDS/templates/cba/Definitions/resources_definition_types.json
index ba31cfc8..17e4dcbb 100644
--- a/heat/vFW_CNF_CDS/templates/cba/Definitions/resources_definition_types.json
+++ b/heat/vFW_CNF_CDS/templates/cba/Definitions/resources_definition_types.json
@@ -598,6 +598,24 @@
}
}
},
+ "vpg-management-port" : {
+ "tags" : "vpg-management-port",
+ "name" : "vpg-management-port",
+ "property" : {
+ "description" : "vpg-management-port",
+ "type" : "string"
+ },
+ "updated-by" : "Rajewski, Lukasz <lukasz.rajewski@orange.com>",
+ "sources" : {
+ "input" : {
+ "type" : "source-input"
+ },
+ "default" : {
+ "type" : "source-default",
+ "properties" : { }
+ }
+ }
+ },
"key_name" : {
"tags" : "key_name",
"name" : "key_name",
diff --git a/heat/vFW_CNF_CDS/templates/cba/Definitions/vFW_CNF_CDS.json b/heat/vFW_CNF_CDS/templates/cba/Definitions/vFW_CNF_CDS.json
index 0040e288..673c0864 100644
--- a/heat/vFW_CNF_CDS/templates/cba/Definitions/vFW_CNF_CDS.json
+++ b/heat/vFW_CNF_CDS/templates/cba/Definitions/vFW_CNF_CDS.json
@@ -34,10 +34,16 @@
"url" : "http://multicloud-k8s:9015"
},
"profile-upload-properties" : {
- "assignment-params" : {
+ "assignment-params": {
"get_attribute" : [ "resource-assignment", "assignment-params" ]
},
- "api-access" : "*multicloud-k8s-api"
+ "profile-modification-decision-data": {
+ "get_input" : "vpg-management-port"
+ },
+ "profile-artifacts": {
+ "get_attribute" : [ "profile-modification", "assignment-params" ]
+ },
+ "api-access": "*multicloud-k8s-api"
},
"config-deploy-properties" : {
"resolution-key" : {
@@ -58,17 +64,35 @@
"resource-assignment" : {
"description" : "Resource Assign Workflow",
"target" : "resource-assignment",
- "activities" : [ {
- "call_operation" : "ResourceResolutionComponent.process"
- } ],
- "on_success" : [ "profile-upload" ]
+ "activities": [
+ {
+ "call_operation": "ResourceResolutionComponent.process"
+ }
+ ],
+ "on_success": [
+ "profile-modification"
+ ]
+ },
+ "profile-modification" : {
+ "description" : "Profile Modification Resources",
+ "target" : "profile-modification",
+ "activities": [
+ {
+ "call_operation": "ResourceResolutionComponent.process"
+ }
+ ],
+ "on_success": [
+ "profile-upload"
+ ]
},
"profile-upload" : {
"description" : "Upload K8s Profile",
"target" : "profile-upload",
- "activities" : [ {
- "call_operation" : "ComponentScriptExecutor.process"
- } ]
+ "activities": [
+ {
+ "call_operation": "ComponentScriptExecutor.process"
+ }
+ ]
}
},
"inputs" : {
@@ -184,6 +208,30 @@
}
}
},
+ "profile-modification" : {
+ "type" : "component-resource-resolution",
+ "interfaces" : {
+ "ResourceResolutionComponent" : {
+ "operations" : {
+ "process" : {
+ "inputs" : {
+ "artifact-prefix-names" : [ "ssh-service" ]
+ }
+ }
+ }
+ }
+ },
+ "artifacts" : {
+ "ssh-service-template" : {
+ "type" : "artifact-template-velocity",
+ "file" : "Templates/k8s-profiles/ssh-service-template.vtl"
+ },
+ "ssh-service-mapping" : {
+ "type" : "artifact-mapping-resource",
+ "file" : "Templates/k8s-profiles/ssh-service-mapping.json"
+ }
+ }
+ },
"profile-upload" : {
"type" : "component-script-executor",
"interfaces" : {
diff --git a/heat/vFW_CNF_CDS/templates/cba/Scripts/kotlin/KotlinK8sProfileUpload.kt b/heat/vFW_CNF_CDS/templates/cba/Scripts/kotlin/KotlinK8sProfileUpload.kt
index 22e4b33a..d47b476a 100644
--- a/heat/vFW_CNF_CDS/templates/cba/Scripts/kotlin/KotlinK8sProfileUpload.kt
+++ b/heat/vFW_CNF_CDS/templates/cba/Scripts/kotlin/KotlinK8sProfileUpload.kt
@@ -42,6 +42,7 @@ import org.springframework.web.client.RestTemplate
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
@@ -52,6 +53,7 @@ import org.springframework.http.MediaType
import java.nio.charset.Charset
import java.util.Base64
import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintProcessorException
+import org.yaml.snakeyaml.Yaml
open class K8sProfileUpload : AbstractScriptComponentFunction() {
@@ -102,7 +104,7 @@ open class K8sProfileUpload : AbstractScriptComponentFunction() {
if (api.hasProfile(k8sRbProfileName)) {
log.info("Profile Already Existing - skipping upload")
} else {
- val profileFilePath: Path = prepareProfileFile(k8sRbProfileName)
+ val profileFilePath: Path = prepareProfileFile(k8sRbProfileName, prefix.equals("vpkg"))
var profile = K8sProfile()
profile.profileName = k8sRbProfileName
@@ -118,7 +120,7 @@ open class K8sProfileUpload : AbstractScriptComponentFunction() {
}
}
- 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"))
@@ -138,7 +140,40 @@ open class K8sProfileUpload : AbstractScriptComponentFunction() {
log.info("${profileFilePath.toString()} decompression completed")
- //Here we can add extra files inside the archive
+ 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(),
diff --git a/heat/vFW_CNF_CDS/templates/cba/Templates/k8s-profiles/ssh-service-mapping.json b/heat/vFW_CNF_CDS/templates/cba/Templates/k8s-profiles/ssh-service-mapping.json
new file mode 100644
index 00000000..1960e0e3
--- /dev/null
+++ b/heat/vFW_CNF_CDS/templates/cba/Templates/k8s-profiles/ssh-service-mapping.json
@@ -0,0 +1,15 @@
+[
+ {
+ "name": "vpg-management-port",
+ "property": {
+ "description": "The number of node port for ssh service of vpg. 0 means that ssh service will not be exposed",
+ "type": "string",
+ "default": "0"
+ },
+ "input-param": false,
+ "dictionary-name": "vpg-management-port",
+ "dictionary-source": "default",
+ "dependencies": [
+ ]
+ }
+] \ No newline at end of file
diff --git a/heat/vFW_CNF_CDS/templates/cba/Templates/k8s-profiles/ssh-service-template.vtl b/heat/vFW_CNF_CDS/templates/cba/Templates/k8s-profiles/ssh-service-template.vtl
index 190af7ed..98cc9e71 100644
--- a/heat/vFW_CNF_CDS/templates/cba/Templates/k8s-profiles/ssh-service-template.vtl
+++ b/heat/vFW_CNF_CDS/templates/cba/Templates/k8s-profiles/ssh-service-template.vtl
@@ -11,7 +11,7 @@ spec:
type: NodePort
ports:
- port: 22
- nodePort: 30022 #TemplateMe
+ nodePort: ${vpg-management-port}
selector:
vf-module-name: {{ .Values.vpg_name_0 }}
release: {{ .Release.Name }}