From 2e8e663a2e341c5341d3d387a7087626581876b4 Mon Sep 17 00:00:00 2001 From: Lukasz Rajewski Date: Sun, 12 Sep 2021 22:28:33 +0200 Subject: [PATCH] [DOC] vFW CNF Use Case Istanbul documentation Update documentation of vFW CNF Use Case for Istanbul Issue-ID: REQ-931 Signed-off-by: Lukasz Rajewski Change-Id: If6ee8586f5a07c934cd8d502b10f16d0a6371748 --- docs/docs_vFW_CNF_CDS.rst | 360 ++++++--- docs/files/vFW_CNF_CDS/healthcheck.png | Bin 0 -> 68856 bytes docs/files/vFW_CNF_CDS/k8s-resources-response.json | 843 +++++++++++++++++++++ docs/files/vFW_CNF_CDS/scenarios.png | Bin 0 -> 71874 bytes docs/files/vFW_CNF_CDS/vfw-generic-vnf-aai.json | 167 ++++ docs/files/vFW_CNF_CDS/vpkg-vf-module-aai.json | 133 ++++ 6 files changed, 1407 insertions(+), 96 deletions(-) create mode 100644 docs/files/vFW_CNF_CDS/healthcheck.png create mode 100644 docs/files/vFW_CNF_CDS/k8s-resources-response.json create mode 100644 docs/files/vFW_CNF_CDS/scenarios.png create mode 100644 docs/files/vFW_CNF_CDS/vfw-generic-vnf-aai.json create mode 100644 docs/files/vFW_CNF_CDS/vpkg-vf-module-aai.json diff --git a/docs/docs_vFW_CNF_CDS.rst b/docs/docs_vFW_CNF_CDS.rst index 2ff23e817..4cfe96f86 100644 --- a/docs/docs_vFW_CNF_CDS.rst +++ b/docs/docs_vFW_CNF_CDS.rst @@ -16,7 +16,7 @@ Source files Description ~~~~~~~~~~~ -This use case is a combination of `vFW CDS Dublin`_ and `vFW EDGEX K8S`_ use cases. The aim is to continue improving Kubernetes based Network Functions (a.k.a CNF) support in ONAP. Use case continues where `vFW EDGEX K8S`_ left and brings CDS support into picture like `vFW CDS Dublin`_ did for the old vFW Use case. Predecessor use case is also documented here `vFW EDGEX K8S In ONAP Wiki`_. +This use case is a combination of `vFW CDS Dublin`_ and `vFW EDGEX K8S`_ use cases and it is continously improved since Frankfurt release. The aim is to continue improving Kubernetes based Network Functions (a.k.a CNF) support in ONAP. Use case continues where `vFW EDGEX K8S`_ left and brings CDS support into picture like `vFW CDS Dublin`_ did for the old vFW Use case. Predecessor use case is also documented here `vFW EDGEX K8S In ONAP Wiki`_. This use case shows how to onboard helm packages and to instantiate them with help of ONAP. Following improvements were made in the vFW CNF Use Case: @@ -38,6 +38,7 @@ All changes to related ONAP components and Use Case can be found in the followin - `REQ-182`_ - `REQ-341`_ - `REQ-458`_ +- `REQ-627`_ **Since Guilin ONAP supports Helm packages as a native onboarding artifacts and SO natively orchestrates Helm packages what brings significant advantages in the future. Also since Guilin release ONAP has first mechanisms for monitoring of the status of deployed CNF resources. Since Honolulu release native CNF testing capability was enabled that allows for execution of the dedicated test jobs for each helm package**. @@ -63,14 +64,28 @@ CDS model `vFW CBA Model`_ CDS CBA model used in `vFW CDS Dublin`_ .. note:: Since the Guilin release `vFW_CNF_CDS Model`_ contains sources that allow to model and instantiate CNF with VNF/Heat orchestration approach (Frankfurt) and with native Helm orchestration approach (Guilin and beyond). VNF/Heat orchestration approach is deprecated and will not be enhanced in the future. Please follow README.txt description and further documentation here to generate and select appropriate onboarding package which will leverage appropriate SO orchestration path. +Since Honolulu release vFW CNF use case supports three different scenarios where different capabilities of CNF Orchestration in ONAP can be experimented: + +.. figure:: files/vFW_CNF_CDS/scenarios.png + :scale: 60 % + :align: center + + vFW CNF Scenarios + +- Scenario 1: simple deployment of vFW CNF instance +- Scenario 2: deployment of vFW CNF instance with enrichment of the Helm deployment with profiling mechanism +- Scenario 3: deployment of vFW CNF instance with Day2 configuration applied and CNF status checked as a part of a config-deploy operation + +The 3rd scenario presents the most comprehensive way of managing the CNF in ONAP, including Day 0/1/2 operations. It shows also how to combine in the Day2 operation information for the AAI and SDNC MDSAL. All scenarios can be supported by execution of the dedicated Healthcheck workflow `3-5 Verification of the CNF Status`_. + Modeling of Onboarding Package/Helm ................................... The starting point for this demo was Helm package containing one Kubernetes application, see `vFW_Helm Model`_. In this demo we decided to follow SDC/SO vf-module concept the same way as original vFW demo was split into multiple vf-modules instead of one (`vFW_NextGen`_). The same way we splitted Helm version of vFW into multiple Helm packages each matching one dedicated vf-module. -The Honolulu version of the `vFW_CNF_CDS Model`_ contains files required to create **VSP onboarding packages in two formats**: the **Dummy Heat** (available in Frankfurt release already) one that considers association of each Helm package with dummy heat templates and the **Native Helm** one where each Helm package is standalone and is natively understood in consequence by SO. For both variants of VSP Helm packages are matched to the vf-module concept, so basically each Helm application after instantiation is visible to ONAP as a separate vf-module. The chosen format for onboarding has **crucial** role in the further orchestration approach applied for Helm package instantiation. The **Dummy Heat** will result with orchestration through the **Openstack Adapter** component of SO while **Native Helm** will result with **CNF Adapter**. Both approaches will result with instantiation of the same CNF, however the **Native Helm** approach will be enhanced in the future releases while **Dummy Heat** approach will become deprecated in the future. +The Istanbul version of the `vFW_CNF_CDS Model`_ contains files required to create **VSP onboarding packages in two formats**: the **Dummy Heat** (available in Frankfurt release already) one that considers association of each Helm package with dummy heat templates and the **Native Helm** one where each Helm package is standalone and is natively understood in consequence by SO. For both variants of VSP Helm packages are matched to the vf-module concept, so basically each Helm application after instantiation is visible to ONAP as a separate vf-module. The chosen format for onboarding has **crucial** role in the further orchestration approach applied for Helm package instantiation. The **Dummy Heat** will result with orchestration through the **Openstack Adapter** component of SO while **Native Helm** will result with **CNF Adapter**. Both approaches will result with instantiation of the same CNF, however the **Native Helm** approach will be enhanced in the future releases while **Dummy Heat** approach will become deprecated in the future. Read more in `3-1 CNF Orchestration Paths in ONAP`_ -Produced **Dummy Heat** VSP onboarding package `Creating Onboarding Package`_ format has following MANIFEST file (package_dummy/MANIFEST.json). The Helm package is delivered as CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT package through SDC and SO. Dummy heat templates are matched to Helm packages by the same prefix of the file name that for both dummy Heat teamplate and for CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT must be the same, like i.e. *vpg* vf-module in the manifest file below. The name of the CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT artifact is predefined and needs to match the pattern: _cloudtech_k8s_charts.tgz. More examples can be found in `Modeling Onboarding Package/Helm`_ section. +Produced **Dummy Heat** VSP onboarding package `Creating Onboarding Package`_ format has following MANIFEST file (package_dummy/MANIFEST.json). The Helm package is delivered as CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT package through SDC and SO. Dummy heat templates are matched to Helm packages by the same prefix of the file name that for both dummy Heat template and for CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT must be the same, like i.e. *vpg* vf-module in the manifest file below. The name of the CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT artifact is predefined and needs to match the pattern: _cloudtech_k8s_charts.tgz. :: @@ -450,7 +465,7 @@ Artifact file determines a place of the static profile or the content of the com SO requires for instantiation name of the profile in the parameter: *k8s-rb-profile-name*. The *component-k8s-profile-upload* that stands behind the profile uploading mechanism has input parameters that can be passed directly (checked in the first order) or can be taken from the *resource-assignment-map* parameter which can be a result of associated *component-resource-resolution* result, like in our case their values are resolved on vf-module level resource assignment. The *component-k8s-profile-upload* inputs are following: - k8s-rb-definition-name - the name under which RB definition was created - **VF Module Model Invariant ID** in ONAP -- k8s-rb-definition-version - the version of created RB definition name - **VF Module Model Version ID** in ONAP +- k8s-rb-definition-version - the version of created RB definition name - **VF Module Model Customization ID** in ONAP - k8s-rb-profile-name - (mandatory) the name of the profile under which it will be created in k8s plugin. Other parameters are required only when profile must be uploaded because it does not exist yet - k8s-rb-profile-source - the source of profile content - name of the artifact of the profile. If missing *k8s-rb-profile-name* is treated as a source - k8s-rb-profile-namespace - the k8s namespace name associated with profile being created @@ -545,7 +560,7 @@ vFW CNF config-deploy workflow is following: In our example configuration template for vFW CNF is a helm package that contains the same resource that we can find in the vPKG *vfw-cnf-cds-vpkg-profile* profile - extra ssh service. This helm package contains Helm encapsulation for ssh-service and the values.yaml file with declaration of all the inputs that may parametrize the ssh-service. The configuration templating step leverages the *component-k8s-config-template* component that prepares the configuration template and uploads it to k8splugin. In consequence, it may be used later on for instatiation of the configuration. -In this use case we have two options with *ssh-service-config* and *ssh-service-config-customizable* as a source of the same configuration template. In consequence, or we take a complete template or we have have the templatefolder with the content of the helm package and CDS may perform dedicated resource resolution for it with templating of all the files with .vtl extensions. The process is very similar to the one describe for profile upload functionality. +In this use case we have two options with *ssh-service-config* and *ssh-service-config-customizable* as a source of the same configuration template. In consequence, or we take a complete template or we have have the template folder with the content of the helm package and CDS may perform dedicated resource resolution for it with templating of all the files with .vtl extensions. The process is very similar to the one describe for profile upload functionality. :: @@ -592,7 +607,7 @@ In this use case we have two options with *ssh-service-config* and *ssh-service- The *component-k8s-config-template* that stands behind creation of configuration template has input parameters that can be passed directly (checked in the first order) or can be taken from the *resource-assignment-map* parameter which can be a result of associated *component-resource-resolution* result, like in vFW CNF use case their values are resolved on vf-module level dedicated for config-assign and config-deploy resource assignment step. The *component-k8s-config-template* inputs are following: - k8s-rb-definition-name - the name under which RB definition was created - **VF Module Model Invariant ID** in ONAP -- k8s-rb-definition-version - the version of created RB definition name - **VF Module Model Version ID** in ONAP +- k8s-rb-definition-version - the version of created RB definition name - **VF Module Model Customization ID** in ONAP - k8s-rb-config-template-name - (mandatory) the name of the configuration template under which it will be created in k8s plugin. Other parameters are required only when configuration template must be uploaded because it does not exist yet - k8s-rb-config-template-source - the source of config template content - name of the artifact of the configuration template. If missing *k8s-rb-config-template-name* is treated as a source - resource-assignment-map - result of the associated resource assignment step - it may deliver values of inputs if they are not specified directly @@ -678,7 +693,7 @@ PART 1 - ONAP Installation 1-1 Deployment components ......................... -In order to run the vFW_CNF_CDS use case, we need ONAP Honolulu Release (or later) with at least following components: +In order to run the vFW_CNF_CDS use case, we need ONAP Istanbul Release (or later) with at least following components: ======================================================= =========== ONAP Component name Describtion @@ -790,9 +805,9 @@ And check status of pods, deployments, jobs etc. 1-3 Post Deployment ................... -After completing the first part above, we should have a functional ONAP deployment for the Honolulu Release. +After completing the first part above, we should have a functional ONAP deployment for the Istanbul Release. -We will need to apply a few modifications to the deployed ONAP Honolulu instance in order to run the use case. +We will need to apply a few modifications to the deployed ONAP Istanbul instance in order to run the use case. Retrieving logins and passwords of ONAP components ++++++++++++++++++++++++++++++++++++++++++++++++++ @@ -873,7 +888,7 @@ Whole content of this use case is stored into single git repository and it conta :: - git clone --single-branch --branch honolulu "https://gerrit.onap.org/r/demo" + git clone --single-branch --branch istanbul "https://gerrit.onap.org/r/demo" cd demo/heat/vFW_CNF_CDS/templates In order to prepare environment for onboarding and instantiation of the use case make sure you have *git*, *make*, *helm* and *pipenv* applications installed. @@ -904,14 +919,21 @@ The automation scripts are based on `Python SDK`_ and are adopted to automate pr 4. Modify config.py file -- NATIVE - when enabled **Native Helm** path will be used, otherwise **Dummy Heat** path will be used -- CLOUD_REGION - name of your k8s cluster from ONAP perspective +- SCENARIO - like described in the `The vFW CNF Use Case`_ section +- NATIVE - when enabled (default) **Native Helm** path will be used, otherwise **Dummy Heat** path will be used (deprecated) +- MACRO_INSTANTIATION - instantiation method used: macro (default) or a'la carte. A'la carte only for the purpose of use with other use cases +- K8S_NAMESPACE - k8s namespace to use for deployment of CNF (vfirewall by default) +- K8S_VERSION - version of the k8s cluster +- K8S_REGION - name of the k8s region from the CLOUD_REGIONS (kud by default) +- CLOUD_REGIONS - configuration of k8s or Openstack regions - GLOBAL_CUSTOMER_ID - identifier of customer in ONAP - VENDOR - name of the Vendor in ONAP - SERVICENAME - **Name of your service model in SDC** -- CUSTOMER_RESOURCE_DEFINITIONS - add list of CRDs to be installed on non KUD k8s cluster - should be used ony to use some non-KUD cluster like i.e. ONAP one to test instantiation of Helm package. For KUD should be empty list +- SKIP_POST_INSTANTIATION - whether post instantiation configuration should be run (it is set indirectly by *SCENARIO*) +- VNF_PARAM_LIST - list of parameters to pass for VNF creation process +- VF_MODULE_PARAM_LIST - list of parameters to pass for VF Module creation -.. note:: For automation script it is necessary to modify only NATIVE and SERVICENAME constants. Other constants may be modified if needed. +.. note:: For automation script it is necessary to modify only SCENARIO constant. Other constants may be modified if needed. AAI ... @@ -935,7 +957,7 @@ Corresponding GET operations in "Check" folder in Postman can be used to verify **** -This step is performed jointly with onboarding step `3-1 Onboarding`_ +This step is performed jointly with onboarding step `3-2 Onboarding`_ Naming Policy +++++++++++++ @@ -974,6 +996,8 @@ Follow instructions in `KUD github`_ and install target Kubernetes cluster in yo export KUD_ADDONS="virtlet ovn4nfv" +.. warning:: In order to run vFW CNF Use Case deployment test please make sure that this workaround does not have to be applied as well. `KUD Interface Permission`_ + 2-2 Cloud Registration ...................... @@ -1024,10 +1048,15 @@ PART 3 - Execution of the Use Case This part contains all the steps to run the use case by using ONAP GUIs, Postman or Python automation scripts. +3-1 CNF Orchestration Paths in ONAP +................................... + Following pictures describe the overall sequential flow of the use case in two scenarios: **Dummy Heat** path (with OpenStack adapter) and **Native Helm** path (with CNF Adapter) -Dummy Heat CNF Orchestration -............................ +Dummy Heat CNF Orchestration (Obsolete) +....................................... + +.. warning:: This path is not developed in ONAP since Honolulu release, however ONAP OOM gating process with basic_cnf use case makes sure that basic CNF instantiation with Dummy Heat approach still works. New features from `_REQ-458` and `REQ-627` are integrated and tested only in the Native path. This orchestration method stands on the grounds of Heat template orchestration mechanisms. In SDC onboarding package needs to contains simple Heat templates that are associated with additional Cloud artifacts. SDC distributes Heat templates to SO and Helm packages to K8sPlugin directly. SO orchestrates the Heat templates without any knowledge about their existence, however the OpenStack adater in SO understands k8s region type for which communication over MSB/Mutlicloud is provided - it handles interaction with K8sPlugin for CNF instantiation. @@ -1039,16 +1068,22 @@ This orchestration method stands on the grounds of Heat template orchestration m Native Helm CNF Orchestration ............................. -Introduced in the Guilin release CNF orchestration method brings native distribution of Helm packages from SDC and native orchestration of CNFs (Helm packages) with SO. SO leverages CNF adapter to interact with K8sPlugin that takes resposnibility for the communication with k8s clusters. Heat templates are not required in the SDC onboarding package and thanks to the fact that SO knows about Helm package orchestration future synchronization of data between k8s clusters and AAI is possible. +Introduced in the Guilin release CNF orchestration method brings native distribution of Helm packages from SDC and native orchestration of CNFs (Helm packages) with SO. SO leverages CNF adapter to interact with K8sPlugin that takes resposnibility for the communication with k8s clusters. Heat templates are not required in the SDC onboarding package and, thanks to the fact that SO knows about Helm package orchestration, synchronization of data between k8s clusters and AAI is possible. Only in this path, since Istanbul release, k8s-resource object is created in relation to tenant, vf-module and generic-vnf objects in AAI. SO CNF adapter is resposobile for synchronization of data between AAI and k8s cluster, however currently it happens only once - after creation of CNF by SO, so any further changes (like new pods) will not be synchronized into AAI. .. figure:: files/vFW_CNF_CDS/Native_Helm_Flow.png :align: center vFW CNF CDS Use Case sequence flow for *Native Helm* (Guilin+) path. -.. warning:: K8sPlugin supports only Helm packages that can be validated by Helm 2.14 application. It means that only Chart with apiVersion: v1 or v2 property but without Helm 3 specific features can be instantiated by ONAP. Also the latest features of Helm 2, beyond Helm version 2.14 are not supported currently. Istanbul release will bring native support of Helm 3 packages and also latests features of Helm 2 package format. -3-1 Onboarding +Kubernetes and Helm Compatibility +................................. + +K8sPlugin, in the Istanbul release, supports Helm packages that can be validated by Helm 3.5 application. It means that new Helm fetures introduced after Helm 3.5 version are not supported currently. Moreover, K8sPlugin implementation of Helm does not support upgrade operation and such flow is not supported in ONAP orchestration workflows. + +K8sPlugin utilizes also v0.19.4 version of K8s client and its compatibility matrix with k8s clusters can be found here `K8s Client Compatibility`_, Compatibility Matrix section. + +3-2 Onboarding .............. .. note:: Make sure you have performed `Automation Environment Setup`_ steps before following actions here. @@ -1068,7 +1103,7 @@ Complete content of both Onboarding Packages for **Dummy Heat** and **Native He :: - git clone --single-branch --branch honolulu "https://gerrit.onap.org/r/demo" + git clone --single-branch --branch istanbul "https://gerrit.onap.org/r/demo" cd demo/heat/vFW_CNF_CDS/templates make @@ -1299,7 +1334,7 @@ Verify in SDC UI if distribution was successful. In case of any errors (sometime "serviceVnfs": [ { "modelInfo": { - "modelName": "vfw_cnf_cds_vsp", + "modelName": "VfVfwK8sDemoCnfMc202109231", "modelUuid": "70edaca8-8c79-468a-aa76-8224cfe686d0", "modelInvariantUuid": "7901fc89-a94d-434a-8454-1e27b99dc0e2", "modelVersion": "1.0", @@ -1317,24 +1352,24 @@ Verify in SDC UI if distribution was successful. In case of any errors (sometime "vfModules": [ { "modelInfo": { - "modelName": "VfwCnfCdsVsp..base_template..module-0", - "modelUuid": "274f4bc9-7679-4767-b34d-1df51cdf2496", - "modelInvariantUuid": "52842255-b7be-4a1c-ab3b-2bd3bd4a5423", + "modelName": "VfVfwK8sDemoCnfMc202109231..helm_base_template..module-4", + "modelUuid": "a9f5d65f-20c3-485c-8cf9-eda9ea94300e", + "modelInvariantUuid": "7888f606-3ee8-4edb-b96d-467fead6ee4f", "modelVersion": "1", - "modelCustomizationUuid": "b27fad11-44da-4840-9256-7ed8a32fbe3e" + "modelCustomizationUuid": "b9faba47-d03d-4ba1-a117-4c19632b2136" }, - "isBase": true, + "isBase": false, "vfModuleLabel": "base_template", "initialCount": 1, "hasVolumeGroup": false }, { "modelInfo": { - "modelName": "VfwCnfCdsVsp..vsn..module-1", - "modelUuid": "0cbf558f-5a96-4555-b476-7df8163521aa", - "modelInvariantUuid": "36f25e1b-199b-4de2-b656-c870d341cf0e", + "modelName": "VfVfwK8sDemoCnfMc202109293..helm_vsn..module-1", + "modelUuid": "8e72ed23-4842-471a-ad83-6a4d285c48e1", + "modelInvariantUuid": "4f5a8a02-0dc6-4387-b86e-bd352f711e18", "modelVersion": "1", - "modelCustomizationUuid": "4cac0584-c0d6-42a7-bdb3-29162792e07f" + "modelCustomizationUuid": "ab5614d6-25c2-4863-bad3-93e354b4d5ba" }, "isBase": false, "vfModuleLabel": "vsn", @@ -1343,11 +1378,11 @@ Verify in SDC UI if distribution was successful. In case of any errors (sometime }, { "modelInfo": { - "modelName": "VfwCnfCdsVsp..vpkg..module-2", - "modelUuid": "011b5f61-6524-4789-bd9a-44cfbf321463", - "modelInvariantUuid": "4e2b9975-5214-48b8-861a-5701c09eedfa", + "modelName": "VfVfwK8sDemoCnfMc202109293..helm_vpkg..module-2", + "modelUuid": "64f9d622-a8c1-4992-ba35-abdc13f87660", + "modelInvariantUuid": "88d8d71a-30c9-4e00-a6b9-bd86bae7ed37", "modelVersion": "1", - "modelCustomizationUuid": "4e7028a1-4c80-4d20-a7a2-a1fb3343d5cb" + "modelCustomizationUuid": "37ab4199-19aa-4f63-9a11-d31b8c25ce46" }, "isBase": false, "vfModuleLabel": "vpkg", @@ -1356,11 +1391,11 @@ Verify in SDC UI if distribution was successful. In case of any errors (sometime }, { "modelInfo": { - "modelName": "VfwCnfCdsVsp..vfw..module-3", - "modelUuid": "0de4ed56-8b4c-4a2d-8ce6-85d5e269204f", - "modelInvariantUuid": "9ffda670-3d77-4f6c-a4ad-fb7a09f19817", + "modelName": "VfVfwK8sDemoCnfMc202109293..helm_vfw..module-3", + "modelUuid": "f6f62096-d5cc-474e-82c7-655e7d6628b2", + "modelInvariantUuid": "6077ce70-3a1d-47e6-87a0-6aed6a29b089", "modelVersion": "1", - "modelCustomizationUuid": "1e123e43-ba40-4c93-90d7-b9f27407ec03" + "modelCustomizationUuid": "879cda5e-7af9-43d2-bd6c-50e330ab328e" }, "isBase": false, "vfModuleLabel": "vfw", @@ -1373,7 +1408,7 @@ Verify in SDC UI if distribution was successful. In case of any errors (sometime ] } -.. note:: For **Native Helm** path both modelName will have prefix *helm_* i.e. *helm_vfw* and vfModuleLabel will have *helm_* keyword inside i.e. *VfwCnfCdsVsp..helm_vfw..module-3* +.. note:: For **Native Helm** path both modelName will have prefix *helm_* i.e. *helm_vfw* and vfModuleLabel will have *helm_* keyword inside i.e. *VfVfwK8sDemoCnfMc202109293..helm_vfw..module-3* - SDNC: @@ -1447,49 +1482,53 @@ Verify in SDC UI if distribution was successful. In case of any errors (sometime :: [ - { - "rb-name": "52842255-b7be-4a1c-ab3b-2bd3bd4a5423", - "rb-version": "274f4bc9-7679-4767-b34d-1df51cdf2496", - "chart-name": "base_template", - "description": "", - "labels": { - "vnf_customization_uuid": "b27fad11-44da-4840-9256-7ed8a32fbe3e" - } - }, - { - "rb-name": "36f25e1b-199b-4de2-b656-c870d341cf0e", - "rb-version": "0cbf558f-5a96-4555-b476-7df8163521aa", - "chart-name": "vsn", - "description": "", - "labels": { - "vnf_customization_uuid": "4cac0584-c0d6-42a7-bdb3-29162792e07f" - } - }, - { - "rb-name": "4e2b9975-5214-48b8-861a-5701c09eedfa", - "rb-version": "011b5f61-6524-4789-bd9a-44cfbf321463", - "chart-name": "vpkg", - "description": "", - "labels": { - "vnf_customization_uuid": "4e7028a1-4c80-4d20-a7a2-a1fb3343d5cb" - } - }, - { - "rb-name": "9ffda670-3d77-4f6c-a4ad-fb7a09f19817", - "rb-version": "0de4ed56-8b4c-4a2d-8ce6-85d5e269204f", - "chart-name": "vfw", - "description": "", - "labels": { - "vnf_customization_uuid": "1e123e43-ba40-4c93-90d7-b9f27407ec03" - } + { + "rb-name": "a9f5d65f-20c3-485c-8cf9-eda9ea94300e", + "rb-version": "b9faba47-d03d-4ba1-a117-4c19632b2136", + "chart-name": "base_template", + "description": "", + "labels": { + "vf_module_model_name": "VfVfwK8sDemoCnfMc202109231..helm_base_template..module-4", + "vf_module_model_uuid": "7888f606-3ee8-4edb-b96d-467fead6ee4f" } + }, + { + "rb-name": "f6f62096-d5cc-474e-82c7-655e7d6628b2", + "rb-version": "879cda5e-7af9-43d2-bd6c-50e330ab328e", + "chart-name": "vfw", + "description": "", + "labels": { + "vf_module_model_name": "VfVfwK8sDemoCnfMc202109293..helm_vfw..module-3", + "vf_module_model_uuid": "6077ce70-3a1d-47e6-87a0-6aed6a29b089" + } + }, + { + "rb-name": "8e72ed23-4842-471a-ad83-6a4d285c48e1", + "rb-version": "ab5614d6-25c2-4863-bad3-93e354b4d5ba", + "chart-name": "vsn", + "description": "", + "labels": { + "vf_module_model_name": "VfVfwK8sDemoCnfMc202109293..helm_vsn..module-1", + "vf_module_model_uuid": "4f5a8a02-0dc6-4387-b86e-bd352f711e18" + } + }, + { + "rb-name": "64f9d622-a8c1-4992-ba35-abdc13f87660", + "rb-version": "37ab4199-19aa-4f63-9a11-d31b8c25ce46", + "chart-name": "vpkg", + "description": "", + "labels": { + "vf_module_model_name": "VfVfwK8sDemoCnfMc202109293..helm_vpkg..module-2", + "vf_module_model_uuid": "88d8d71a-30c9-4e00-a6b9-bd86bae7ed37" + } + } ] **** Distribution is a part of the onboarding step and at this stage is performed -3-2 CNF Instantiation +3-3 CNF Instantiation ..................... This is the whole beef of the use case and furthermore the core of it is that we can instantiate any amount of instances of the same CNF each running and working completely of their own. Very basic functionality in VM (VNF) side but for Kubernetes and ONAP integration this is the first milestone towards other normal use cases familiar for VNFs. @@ -1605,7 +1644,7 @@ Before second instance of service is created you need to modify *config.py* file python onboarding.py python instantiation.py -3-3 Results and Logs +3-4 Results and Logs .................... Now multiple instances of Kubernetes variant of vFW are running in target VIM (KUD deployment). @@ -1737,24 +1776,37 @@ In case more detailed logging is needed, here's instructions how to setup DEBUG # Delete the Pods to make changes effective kubectl -n onap delete pods -l app=cds-blueprints-processor -3-4 Verification of the CNF Status +3-5 Verification of the CNF Status .................................. **** -The Guilin introduced new API for verification of the status of instantiated resouces in k8s cluster. The API gives result similar to *kubectl describe* operation for all the resources created for particular *rb-definition*. Status API can be used to verify the k8s resources after instantiation but also can be used leveraged for synchronization of the information with external components, like AAI in the future. To use Status API call +The Guilin introduced new API for verification of the status of instantiated resources in k8s cluster. The API gives result similar to *kubectl describe* operation for all the resources created for particular *rb-definition*. Status API can be used to verify the k8s resources after instantiation but also can be used leveraged for synchronization of the information with external components, like AAI. To use Status API call + +:: + + curl -i http://${K8S_NODE_IP}:30280/api/multicloud-k8s/v1/v1/instance/{rb-instance-id}/status + +where {rb-instance-id} can be taken from the list of instances resolved the following call or from AAI *heat-stack-id* property of created *vf-module* associated with each Helm package from onboarded VSP which holds the *rb-instance-id* value. + +The same API can be accessed over cnf-adapter endpoint (ClusterIP): :: curl -i http://${K8S_NODE_IP}:30280/api/multicloud-k8s/v1/v1/instance/{rb-instance-id}/status -where {rb-instance-id} can be taken from the list of instances resolved the following call +The similar to Status API is Query API, avaialble since Honolulu, that allows to fetch specific resources that belong to the created instance. The Query API allows to filter resources by Name, Kind, APiVersion, Namespace and Labels. The k8splugin endpoint is: + +:: + + curl -i http://${K8S_NODE_IP}:30280/api/multicloud-k8s/v1/v1/instance/{rb-instance-id}/query?ApiVersion=v1&Kind=Deployment&Name=vfw-1-vfw&Namespace=vfirewall + +and cnf-adapter endpoint is: :: - curl -i http://${K8S_NODE_IP}:30280/api/multicloud-k8s/v1/v1/instance/ + curl -i http://${K8S_NODE_IP}:8090/api/cnf-adapter/v1/instance/{rb-instance-id}/query?ApiVersion=v1&Kind=Deployment&Name=vfw-1-vfw&Namespace=vfirewall -or from AAI *heat-stack-id* property of created *vf-module* associated with each Helm package from onboarded VSP which holds the *rb-instance-id* value. Examplary output of Status API is shown below (full result of test vFW CNF helm package in the attached file). It shows the list of GVK resources created for requested *rb-instance* (Helm and vf-module in the same time) with assocated describe result for all of them. @@ -1776,7 +1828,7 @@ Examplary output of Status API is shown below (full result of test vFW CNF helm "global.onapPrivateNetworkName": "onap-private-net-test" } }, - "ready": false, + "ready": true, "resourceCount": 1, "resourcesStatus": [ { @@ -1809,26 +1861,137 @@ Examplary output of Status API is shown below (full result of test vFW CNF helm ] } -.. note:: The example of how the Stauts API could be integrated into CDS can be found in the Frankfurt version of k8s profile upload mechanism `Frankfurt CBA Definition`_ (*profile-upload* TOSCA node template), implemented in inside of the Kotlin script `Frankfurt CBA Script`_ for profile upload. This method shows how to integrate mutlicloud-k8s API endpoint into Kotlin script executed by CDS. For more details please take a look into Definition file of 1.0.45 version of the CBA and also the kotlin script used there for uploading the profile. +**** + +Since Honolulu release vFW CNF Use Case is equipped with dedicated mechanisms for verification of the CNF status automatically, during the instantiation. The process utilizes the k8sPlugin Status and Healtcheck APIs that both are natively exposed in the CDS and can be executed from the script execution functionality in the CDS. + +.. figure:: files/vFW_CNF_CDS/healthcheck.png + :scale: 60 % + :align: center + + vFW CNF Healthcheck flow concept + +There is exposed a dedicated workflow in CBA, where Status API result verification is run with *status-verification-script* step and execution of the healthcheck job is run with *health-check-process*. The first one verifies if all pods have *Running* state. If yes, then verification of the health is started by execution of the dedicated Helm tests which are a jobs that verify connectivity in each component. + +:: + + "health-check": { + "steps": { + "config-setup": { + "description": "Gather necessary input for config init and status verification", + "target": "config-setup-process", + "activities": [ + { + "call_operation": "ResourceResolutionComponent.process" + } + ], + "on_success": [ + "config-apply" + ], + "on_failure": [ + "handle_error" + ] + }, + "status-verification-script": { + "description": "Simple status verification script", + "target": "simple-status-check", + "activities": [ + { + "call_operation": "ComponentScriptExecutor.process" + } + ], + "on_success": [ + "health-check-process" + ], + "on_failure": [ + "handle_error" + ] + }, + "health-check-process": { + "description": "Start health check script", + "target": "health-check-script", + "activities": [ + { + "call_operation": "ComponentScriptExecutor.process" + } + ], + "on_success": [ + "collect-results" + ], + "on_failure": [ + "handle_error" + ] + }, + "handle_error": { + "description": "Simple error verification script", + "target": "simple-error-check", + "activities": [ + { + "call_operation": "ComponentScriptExecutor.process" + } + ], + "on_success": [ + "collect-results" + ] + }, + "collect-results": { + "description": "Final collection of results", + "target": "collect-results" + } + }, + + +Since Istanbul release, SO is equipped with dedicated workflow for verification of the CNF status. It works similarly to the workflow introduced in Honolulu, however basic CNF Status Verification step utilizes "Ready" flag of the StatusAPI response to check if k8s resources created from Helm package are up and running. Ready flag works properly in k8splugin 0.9.1 or higher. Both operations are performed by ControllerExecutionBB in SO and are realized by cnf-adapter component in SO. This workflow can be triggered by dedicated endpoint documented here: `CNF Health Check`_. This workflow is not yet integrated into automation scripts. + +3-6 Synchronization of created k8s resources into AAI +..................................................... + +Since Istanbul release `AAI v24 schema`_ version is used to store basic information about k8s resources deployed from each helm package. The AAI change is described in `K8s Resource in AAI`_. The information stored in AAI lets to identify all the deployed k8s resoureces but the details about them have to be fetched from the k8s cluster on demand. Such design is motivated by high frequency of k8s resource status change and the plethora of resource types avaialble in k8s - including the CRDs that extend the predefined resource types available in k8s. In consequence, there was no sense to store in AAI full runtime picture of the k8s resources as the synchronization of them would be impossible. + +K8s-Resource object is stored in the cloud-infrastructure set of AAI APIs and it belongs to the tenant, and is related with both generic-vnf and vf-module. Each k8s-resource object created in AAI has selflink for cnf-adapter Query API, described in `3-5 Verification of the CNF Status`_, that allows to fetch actual information about the resource in k8s. The examplary set of k8s-resources with related generic-vnf and vf-modules for vFW CNF use case is in the files attached below. + + :download:`List of K8s Resources ` + + :download:`Generic VNF with modules ` + + :download:`vPKG VF-Module with related k8s-resource relations ` + +Currently AAI synchronization is run just after creation of the vf-module by SO. If any changes occurs after, like new Pods created or some deleted, we do not have this information in AAI by default. In order to force the update of AAI information about the concrete Helm package, the following API can be used with properly modified body (all except the callbackUrl). + +:: + + curl -i -X POST http://${K8S_NODE_IP}:8090/api/cnf-adapter/v1/aai-update + + +:: + + { + "instanceId": "keen_darwin", + "cloudRegion": "kud", + "cloudOwner": "K8sCloudOwner", + "tenantId": "dca807fa-0d3e-4fb1-85eb-b9e1c03108a3", + "callbackUrl": "http://example", + "genericVnfId": "8b3af2e0-fd66-460d-b928-22f5dac517a6", + "vfModuleId": "a0161551-9d13-47c2-ba4f-896d4ee401d4" + } + PART 4 - Future improvements needed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Future development areas for this use case: -- Automated smoke use case. -- Include Closed Loop part of the vFW demo. -- vFW service with Openstack VNF and Kubernetes CNF -- On-demand healthcheck workflow of vFW +- Include Closed Loop part of the vFW CNF demo. +- vFW service with Openstack VNF (KUD) and Kubernetes CNF Future development areas for CNF support: -- Validation of Helm package and extraction of override values in time of the package onboarding. -- Synchroinzation of information about CNF between AAI and K8s. -- Coordination of the vFW Helm charts instantiation performed by cnf-adapter of SO -- Use multicloud/k8S API v2. +- Extraction of override values in time of the package onboarding. +- Update of the information in AAI after creation +- Upgrade of the vFW CNF similar to Helm Upgrade through the SDC and SO +- Use multicloud/k8S API v2 (EMCO) -Many features from the list above are covered by the Honolulu roadmap described in `REQ-627`_. +Some of the features from the list above are covered by the Jakarta roadmap described in `REQ-890`_. .. _ONAP Deployment Guide: https://docs.onap.org/projects/onap-oom/en/guilin/oom_quickstart_guide.html @@ -1842,10 +2005,11 @@ Many features from the list above are covered by the Honolulu roadmap described .. _vFW_NextGen: https://git.onap.org/demo/tree/heat/vFW_NextGen?h=elalto .. _vFW EDGEX K8S: https://docs.onap.org/en/elalto/submodules/integration.git/docs/docs_vfw_edgex_k8s.html .. _vFW EDGEX K8S In ONAP Wiki: https://wiki.onap.org/display/DW/Deploying+vFw+and+EdgeXFoundry+Services+on+Kubernets+Cluster+with+ONAP -.. _KUD github: https://github.com/onap/multicloud-k8s/tree/master/kud/hosting_providers/baremetal +.. _KUD github: https://github.com/onap/multicloud-k8s/tree/honolulu/kud/hosting_providers/baremetal .. _KUD in Wiki: https://wiki.onap.org/display/DW/Kubernetes+Baremetal+deployment+setup+instructions .. _Multicloud k8s gerrit: https://gerrit.onap.org/r/q/status:open+project:+multicloud/k8s -.. _KUD subproject in github: https://github.com/onap/multicloud-k8s/tree/master/kud +.. _KUD subproject in github: https://github.com/onap/multicloud-k8s/tree/honolulu/kud +.. _KUD Interface Permission: https://jira.onap.org/browse/MULTICLOUD-1310 .. _Frankfurt CBA Definition: https://git.onap.org/demo/tree/heat/vFW_CNF_CDS/templates/cba/Definitions/vFW_CNF_CDS.json?h=frankfurt .. _Frankfurt CBA Script: https://git.onap.org/demo/tree/heat/vFW_CNF_CDS/templates/cba/Scripts/kotlin/KotlinK8sProfileUpload.kt?h=frankfurt .. _SO-3403: https://jira.onap.org/browse/SO-3403 @@ -1854,11 +2018,15 @@ Many features from the list above are covered by the Honolulu roadmap described .. _REQ-341: https://jira.onap.org/browse/REQ-341 .. _REQ-458: https://jira.onap.org/browse/REQ-458 .. _REQ-627: https://jira.onap.org/browse/REQ-627 +.. _REQ-890: https://jira.onap.org/browse/REQ-890 .. _Python SDK: https://docs.onap.org/projects/onap-integration/en/guilin/integration-tooling.html?highlight=python-sdk#python-onapsdk .. _KUD Jenkins ci/cd verification: https://jenkins.onap.org/job/multicloud-k8s-master-kud-deployment-verify-shell/ .. _K8s cloud site config: https://docs.onap.org/en/guilin/guides/onap-operator/cloud_site/k8s/index.html .. _SO Monitoring: https://docs.onap.org/projects/onap-so/en/guilin/developer_info/Working_with_so_monitoring.html .. _Data Dictionary: https://git.onap.org/demo/tree/heat/vFW_CNF_CDS/templates/cba-dd.json?h=guilin .. _Helm Healer: https://git.onap.org/oom/offline-installer/tree/tools/helm-healer.sh?h=frankfurt -.. _CDS UAT Testing: https://wiki.onap.org/display/DW/Modeling+Concepts .. _infra_workload: https://docs.onap.org/projects/onap-multicloud-framework/en/latest/specs/multicloud_infra_workload.html?highlight=multicloud +.. _K8s Client Compatibility: https://github.com/kubernetes/client-go +.. _CNF Health Check: https://docs.onap.org/projects/onap-so/en/latest/api/apis/serviceInstances-api.html#healthcheck +.. _K8s Resource in AAI: https://jira.onap.org/browse/ONAPMODEL-37 +.. _AAI v24 schema: https://nexus.onap.org/service/local/repositories/releases/archive/org/onap/aai/schema-service/aai-schema/1.9.2/aai-schema-1.9.2.jar/!/onap/aai_swagger_html/aai_swagger_v24.html diff --git a/docs/files/vFW_CNF_CDS/healthcheck.png b/docs/files/vFW_CNF_CDS/healthcheck.png new file mode 100644 index 0000000000000000000000000000000000000000..693e9e74c8ccf8c8ba75fdb615b3fd48da0f057c GIT binary patch literal 68856 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 XnV<3bPir>_>Q1R@pGa3Rz4Lzn@1D<` literal 0 HcmV?d00001 diff --git a/docs/files/vFW_CNF_CDS/k8s-resources-response.json b/docs/files/vFW_CNF_CDS/k8s-resources-response.json new file mode 100644 index 000000000..3d0f91344 --- /dev/null +++ b/docs/files/vFW_CNF_CDS/k8s-resources-response.json @@ -0,0 +1,843 @@ +{ + "k8s-resource": [ + { + "id": "e5a4eca381ade9439806cf426eb7a07237fe9a8c9088038bd0c8135f728fabe2", + "name": "vfw-1-vfw", + "group": "apps", + "version": "v1", + "kind": "Deployment", + "namespace": "vfirewall", + "labels": [ + "chart=vfw", + "k8splugin.io/rb-instance-id=brave_brattain", + "release=vfw-1-vfw", + "vf-module-name=vfw-1-vfw", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/brave_brattain/query?ApiVersion=v1&Kind=Deployment&Name=vfw-1-vfw&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35940985", + "resource-version": "1635943384048", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/d56c54b9-40cc-4b7a-abce-50454571e39d", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "d56c54b9-40cc-4b7a-abce-50454571e39d" + } + ] + } + ] + } + }, + { + "id": "5b43d0c6e6b3ebb3d279dccbdad024a02995d0e66c2858c866ba9295c34cde62", + "name": "vfw-1-vsn-5f45887f5f-khqdd", + "group": "", + "version": "v1", + "kind": "Pod", + "namespace": "vfirewall", + "labels": [ + "chart=vsn", + "k8splugin.io/rb-instance-id=sharp_torvalds", + "pod-template-hash=5f45887f5f", + "release=vfw-1-vsn", + "vf-module-name=vfw-1-vsn", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/sharp_torvalds/query?ApiVersion=v1&Kind=Pod&Name=vfw-1-vsn-5f45887f5f-khqdd&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35941084", + "resource-version": "1635943399747", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/56f3d02b-5a32-4a97-9e7b-d3c0094c07e8", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "56f3d02b-5a32-4a97-9e7b-d3c0094c07e8" + } + ] + } + ] + } + }, + { + "id": "afce111381db5b5e61d12726d96e4d08b5dc1c7fdb5b069a24bb68c36314d45f", + "name": "kud-lr-onap-nf-20211103t124217642438z-ovn-nat", + "group": "k8s.cni.cncf.io", + "version": "v1", + "kind": "NetworkAttachmentDefinition", + "namespace": "vfirewall", + "labels": [ + "chart=base_template", + "k8splugin.io/rb-instance-id=nifty_lichterman", + "release=vfw-1-base", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/nifty_lichterman/query?ApiVersion=v1&Kind=NetworkAttachmentDefinition&Name=kud-lr-onap-nf-20211103t124217642438z-ovn-nat&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35940925", + "resource-version": "1635943376139", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/abb282c8-c932-45dc-9c62-01938eab32fa", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "abb282c8-c932-45dc-9c62-01938eab32fa" + } + ] + } + ] + } + }, + { + "id": "eaa4c964f1e0559cb061cd543c381e8067fc19524195e04ca25b539fdde19712", + "name": "kud-lr-onap-nf-20211103t124217642438z-unprotected-network", + "group": "k8s.plugin.opnfv.org", + "version": "v1alpha1", + "kind": "Network", + "namespace": "vfirewall", + "labels": [ + "chart=base_template", + "k8splugin.io/rb-instance-id=nifty_lichterman", + "release=vfw-1-base", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/nifty_lichterman/query?ApiVersion=v1alpha1&Kind=Network&Name=kud-lr-onap-nf-20211103t124217642438z-unprotected-network&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35940922", + "resource-version": "1635943376139", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/abb282c8-c932-45dc-9c62-01938eab32fa", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "abb282c8-c932-45dc-9c62-01938eab32fa" + } + ] + } + ] + } + }, + { + "id": "6e5fc95d95eee51f818cd3fbd8fbd40bc29d9fe4c587a1e2840ef4d17fb2fac6", + "name": "vfw-1-vsn-configmap", + "group": "", + "version": "v1", + "kind": "ConfigMap", + "namespace": "vfirewall", + "labels": [ + "chart=vsn", + "k8splugin.io/rb-instance-id=sharp_torvalds", + "release=vfw-1-vsn", + "vf-module-name=vfw-1-vsn", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/sharp_torvalds/query?ApiVersion=v1&Kind=ConfigMap&Name=vfw-1-vsn-configmap&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35941065", + "resource-version": "1635943399747", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/56f3d02b-5a32-4a97-9e7b-d3c0094c07e8", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "56f3d02b-5a32-4a97-9e7b-d3c0094c07e8" + } + ] + } + ] + } + }, + { + "id": "9e587e69bfe74762f66c59c5cb2ed41ca37bafa59b454b4e1432f4c61f0361f7", + "name": "kud-lr-onap-nf-20211103t124217642438z-management-network", + "group": "k8s.plugin.opnfv.org", + "version": "v1alpha1", + "kind": "Network", + "namespace": "vfirewall", + "labels": [ + "chart=base_template", + "k8splugin.io/rb-instance-id=nifty_lichterman", + "release=vfw-1-base", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/nifty_lichterman/query?ApiVersion=v1alpha1&Kind=Network&Name=kud-lr-onap-nf-20211103t124217642438z-management-network&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35940926", + "resource-version": "1635943376139", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/abb282c8-c932-45dc-9c62-01938eab32fa", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "abb282c8-c932-45dc-9c62-01938eab32fa" + } + ] + } + ] + } + }, + { + "id": "20413fe7d44e703f3b498a442184b7e95a1e52afccf68cdc5785bfb1855a70c9", + "name": "vfw-1-vfw-configmap", + "group": "", + "version": "v1", + "kind": "ConfigMap", + "namespace": "vfirewall", + "labels": [ + "chart=vfw", + "k8splugin.io/rb-instance-id=brave_brattain", + "release=vfw-1-vfw", + "vf-module-name=vfw-1-vfw", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/brave_brattain/query?ApiVersion=v1&Kind=ConfigMap&Name=vfw-1-vfw-configmap&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35940973", + "resource-version": "1635943384048", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/d56c54b9-40cc-4b7a-abce-50454571e39d", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "d56c54b9-40cc-4b7a-abce-50454571e39d" + } + ] + } + ] + } + }, + { + "id": "e73732351195c8c10d28413ddff1d968bd53b0b0e395c24b3b0fcd39f46ea730", + "name": "vfw-1-vpkg-mgmt", + "group": "", + "version": "v1", + "kind": "Service", + "namespace": "vfirewall", + "labels": [ + "chart=vpkg", + "k8splugin.io/rb-instance-id=dazzling_nightingale", + "release=vfw-1-vpkg", + "vf-module-name=vfw-1-vpkg", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/dazzling_nightingale/query?ApiVersion=v1&Kind=Service&Name=vfw-1-vpkg-mgmt&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35941017", + "resource-version": "1635943391652", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/314795d7-6005-4462-a9fe-7006538e3ff9", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "314795d7-6005-4462-a9fe-7006538e3ff9" + } + ] + } + ] + } + }, + { + "id": "f65235da9cb098588b2db0c9e7da1ccb00954268fba6bd621bb9ef0b48cd717f", + "name": "vfw-1-vpkg", + "group": "apps", + "version": "v1", + "kind": "Deployment", + "namespace": "vfirewall", + "labels": [ + "chart=vpkg", + "k8splugin.io/rb-instance-id=dazzling_nightingale", + "release=vfw-1-vpkg", + "vf-module-name=vfw-1-vpkg", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/dazzling_nightingale/query?ApiVersion=v1&Kind=Deployment&Name=vfw-1-vpkg&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35941032", + "resource-version": "1635943391652", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/314795d7-6005-4462-a9fe-7006538e3ff9", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "314795d7-6005-4462-a9fe-7006538e3ff9" + } + ] + } + ] + } + }, + { + "id": "87cbdb83bf436703bdb9823e07e1498a7b3ec7fb12ba14193aadd4630649e0ae", + "name": "vfw-1-vpkg-c6bdb954c-mlpz9", + "group": "", + "version": "v1", + "kind": "Pod", + "namespace": "vfirewall", + "labels": [ + "chart=vpkg", + "k8splugin.io/rb-instance-id=dazzling_nightingale", + "pod-template-hash=c6bdb954c", + "release=vfw-1-vpkg", + "vf-module-name=vfw-1-vpkg", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/dazzling_nightingale/query?ApiVersion=v1&Kind=Pod&Name=vfw-1-vpkg-c6bdb954c-mlpz9&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35941033", + "resource-version": "1635943391652", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/314795d7-6005-4462-a9fe-7006538e3ff9", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "314795d7-6005-4462-a9fe-7006538e3ff9" + } + ] + } + ] + } + }, + { + "id": "8c8a65ef11c599eb15a1054ccd590a94305d52d2efa1e72c7581ee2094cace1b", + "name": "vfw-1-vsn", + "group": "apps", + "version": "v1", + "kind": "Deployment", + "namespace": "vfirewall", + "labels": [ + "chart=vsn", + "k8splugin.io/rb-instance-id=sharp_torvalds", + "release=vfw-1-vsn", + "vf-module-name=vfw-1-vsn", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/sharp_torvalds/query?ApiVersion=v1&Kind=Deployment&Name=vfw-1-vsn&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35941083", + "resource-version": "1635943399747", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/56f3d02b-5a32-4a97-9e7b-d3c0094c07e8", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "56f3d02b-5a32-4a97-9e7b-d3c0094c07e8" + } + ] + } + ] + } + }, + { + "id": "677e61310b562007084bc99c42aefb9106438d4c782afc6504d6a6a062b974a8", + "name": "kud-lr-onap-nf-20211103t124217642438z-protected-network", + "group": "k8s.plugin.opnfv.org", + "version": "v1alpha1", + "kind": "Network", + "namespace": "vfirewall", + "labels": [ + "chart=base_template", + "k8splugin.io/rb-instance-id=nifty_lichterman", + "release=vfw-1-base", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/nifty_lichterman/query?ApiVersion=v1alpha1&Kind=Network&Name=kud-lr-onap-nf-20211103t124217642438z-protected-network&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35940927", + "resource-version": "1635943376139", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/abb282c8-c932-45dc-9c62-01938eab32fa", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "abb282c8-c932-45dc-9c62-01938eab32fa" + } + ] + } + ] + } + }, + { + "id": "5538b19871da1fd05b82366c38cbbe88bae4d3444b6a21018f83787327958617", + "name": "vfw-1-vpkg-configmap", + "group": "", + "version": "v1", + "kind": "ConfigMap", + "namespace": "vfirewall", + "labels": [ + "chart=vpkg", + "k8splugin.io/rb-instance-id=dazzling_nightingale", + "release=vfw-1-vpkg", + "vf-module-name=vfw-1-vpkg", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/dazzling_nightingale/query?ApiVersion=v1&Kind=ConfigMap&Name=vfw-1-vpkg-configmap&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35941014", + "resource-version": "1635943391652", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/314795d7-6005-4462-a9fe-7006538e3ff9", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "314795d7-6005-4462-a9fe-7006538e3ff9" + } + ] + } + ] + } + }, + { + "id": "6134c369330c7398807d550c708890b0bcef2affbe5af1f9acde02c5a58c104a", + "name": "vfw-1-vsn-ui", + "group": "", + "version": "v1", + "kind": "Service", + "namespace": "vfirewall", + "labels": [ + "chart=vsn", + "k8splugin.io/rb-instance-id=sharp_torvalds", + "release=vfw-1-vsn", + "vf-module-name=vfw-1-vsn", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/sharp_torvalds/query?ApiVersion=v1&Kind=Service&Name=vfw-1-vsn-ui&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35941068", + "resource-version": "1635943399747", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/56f3d02b-5a32-4a97-9e7b-d3c0094c07e8", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "56f3d02b-5a32-4a97-9e7b-d3c0094c07e8" + } + ] + } + ] + } + }, + { + "id": "633a8c14f7df72b14f4d8e7b77cf7a2f33b71d54136e8582f135678c586fcde3", + "name": "vfw-1-vfw-89bd4bfdb-mshpq", + "group": "", + "version": "v1", + "kind": "Pod", + "namespace": "vfirewall", + "labels": [ + "chart=vfw", + "k8splugin.io/rb-instance-id=brave_brattain", + "pod-template-hash=89bd4bfdb", + "release=vfw-1-vfw", + "vf-module-name=vfw-1-vfw", + "vnf-name=test-vnf" + ], + "selflink": "http://so-cnf-adapter:8090/api/cnf-adapter/v1/instance/brave_brattain/query?ApiVersion=v1&Kind=Pod&Name=vfw-1-vfw-89bd4bfdb-mshpq&Namespace=vfirewall", + "data-owner": "CnfAdapter", + "data-source": "K8sPlugin", + "data-source-version": "35940986", + "resource-version": "1635943384048", + "relationship-list": { + "relationship": [ + { + "related-to": "generic-vnf", + "relationship-label": "tosca.relationships.HostedOn", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + } + ], + "related-to-property": [ + { + "property-key": "generic-vnf.vnf-name", + "property-value": "VF_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "vf-module", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/network/generic-vnfs/generic-vnf/d4af22f0-70e6-47ac-8d5b-4d645fc25757/vf-modules/vf-module/d56c54b9-40cc-4b7a-abce-50454571e39d", + "relationship-data": [ + { + "relationship-key": "generic-vnf.vnf-id", + "relationship-value": "d4af22f0-70e6-47ac-8d5b-4d645fc25757" + }, + { + "relationship-key": "vf-module.vf-module-id", + "relationship-value": "d56c54b9-40cc-4b7a-abce-50454571e39d" + } + ] + } + ] + } + } + ] +} diff --git a/docs/files/vFW_CNF_CDS/scenarios.png b/docs/files/vFW_CNF_CDS/scenarios.png new file mode 100644 index 0000000000000000000000000000000000000000..53da8668d004d6576ffe52110d8aec5a623f202f GIT binary patch literal 71874 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 literal 0 HcmV?d00001 diff --git a/docs/files/vFW_CNF_CDS/vfw-generic-vnf-aai.json b/docs/files/vFW_CNF_CDS/vfw-generic-vnf-aai.json new file mode 100644 index 000000000..89b7f7a2d --- /dev/null +++ b/docs/files/vFW_CNF_CDS/vfw-generic-vnf-aai.json @@ -0,0 +1,167 @@ +{ + "vnf-id": "d4af22f0-70e6-47ac-8d5b-4d645fc25757", + "vnf-name": "VF_vfw_k8s_demo_CNF_LR_1", + "vnf-type": "vfw_k8s_demo_CNF_LR_1/null", + "service-id": "vfw_k8s_demo_CNF_LR_1", + "prov-status": "NVTPROV", + "orchestration-status": "Active", + "in-maint": false, + "is-closed-loop-disabled": false, + "resource-version": "1635943409675", + "model-invariant-id": "a5c188d5-7f0a-44e9-bd92-4a60781cb2cf", + "model-version-id": "033d9730-549a-4ff8-b166-1581fb73aa08", + "model-customization-id": "f107d24c-0a2f-4eb9-96d3-7a631c973cfd", + "relationship-list": { + "relationship": [ + { + "related-to": "tenant", + "relationship-label": "org.onap.relationships.inventory.BelongsTo", + "related-link": "/aai/v21/cloud-infrastructure/cloud-regions/cloud-region/K8sCloudOwner/kud-lr/tenants/tenant/3444a566-2717-4d85-83bd-45c104657173", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "K8sCloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "kud-lr" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3444a566-2717-4d85-83bd-45c104657173" + } + ], + "related-to-property": [ + { + "property-key": "tenant.tenant-name", + "property-value": "kud-lr-tenant" + } + ] + }, + { + "related-to": "cloud-region", + "relationship-label": "org.onap.relationships.inventory.LocatedIn", + "related-link": "/aai/v21/cloud-infrastructure/cloud-regions/cloud-region/K8sCloudOwner/kud-lr", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "K8sCloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "kud-lr" + } + ], + "related-to-property": [ + { + "property-key": "cloud-region.owner-defined-type", + "property-value": "t1" + } + ] + }, + { + "related-to": "service-instance", + "relationship-label": "org.onap.relationships.inventory.ComposedOf", + "related-link": "/aai/v21/business/customers/customer/customer_cnf/service-subscriptions/service-subscription/vfw_k8s_demo_CNF_LR_1/service-instances/service-instance/93b89241-104b-40a7-8030-32e3b6eff459", + "relationship-data": [ + { + "relationship-key": "customer.global-customer-id", + "relationship-value": "customer_cnf" + }, + { + "relationship-key": "service-subscription.service-type", + "relationship-value": "vfw_k8s_demo_CNF_LR_1" + }, + { + "relationship-key": "service-instance.service-instance-id", + "relationship-value": "93b89241-104b-40a7-8030-32e3b6eff459" + } + ], + "related-to-property": [ + { + "property-key": "service-instance.service-instance-name", + "property-value": "INSTANCE_vfw_k8s_demo_CNF_LR_1" + } + ] + }, + { + "related-to": "platform", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v21/business/platforms/platform/%3Conapsdk.vid.vid.Platform%20object%20at%200x7f48eddc2c40%3E", + "relationship-data": [ + { + "relationship-key": "platform.platform-name", + "relationship-value": "" + } + ] + }, + { + "related-to": "line-of-business", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v21/business/lines-of-business/line-of-business/%3Conapsdk.vid.vid.LineOfBusiness%20object%20at%200x7f48eddc2040%3E", + "relationship-data": [ + { + "relationship-key": "line-of-business.line-of-business-name", + "relationship-value": "" + } + ] + } + ] + }, + "vf-modules": { + "vf-module": [ + { + "vf-module-id": "abb282c8-c932-45dc-9c62-01938eab32fa", + "vf-module-name": "INSTANCE_vfw_k8s_demo_CNF_LR_1_vf_vfw_k8s_demo_cnf_lr_10..VfVfwK8sDemoCnfLr1..helm_base_template..module-4", + "heat-stack-id": "nifty_lichterman", + "orchestration-status": "Active", + "is-base-vf-module": false, + "automated-assignment": false, + "resource-version": "1635943380124", + "model-invariant-id": "7b0bcafb-6437-461c-bb48-7240f67ee718", + "model-version-id": "5cc1eda3-24e2-4e5e-a4a0-cb18477834f6", + "model-customization-id": "b80dedcd-902e-4c75-939a-310a68acb440", + "module-index": 0 + }, + { + "vf-module-id": "314795d7-6005-4462-a9fe-7006538e3ff9", + "vf-module-name": "INSTANCE_vfw_k8s_demo_CNF_LR_1_vf_vfw_k8s_demo_cnf_lr_10..VfVfwK8sDemoCnfLr1..helm_vpkg..module-2", + "heat-stack-id": "dazzling_nightingale", + "orchestration-status": "Active", + "is-base-vf-module": false, + "automated-assignment": false, + "resource-version": "1635943396304", + "model-invariant-id": "8f3652a6-af23-4d8c-9aa2-3e8d6f1a5b6e", + "model-version-id": "f4e54571-7cc7-4a67-b973-1851b8e540a7", + "model-customization-id": "5f1445b0-9ef2-4eb3-8051-a445fa35f877", + "module-index": 0 + }, + { + "vf-module-id": "56f3d02b-5a32-4a97-9e7b-d3c0094c07e8", + "vf-module-name": "INSTANCE_vfw_k8s_demo_CNF_LR_1_vf_vfw_k8s_demo_cnf_lr_10..VfVfwK8sDemoCnfLr1..helm_vsn..module-1", + "heat-stack-id": "sharp_torvalds", + "orchestration-status": "Active", + "is-base-vf-module": false, + "automated-assignment": false, + "resource-version": "1635943404667", + "model-invariant-id": "46a8e556-6c5f-4acd-9cfc-ea29b51c919e", + "model-version-id": "aa1ecbc5-990e-4ed0-a03e-a135f21763d3", + "model-customization-id": "0e61ce72-5eef-4fd7-b790-2107b67044f6", + "module-index": 0 + }, + { + "vf-module-id": "d56c54b9-40cc-4b7a-abce-50454571e39d", + "vf-module-name": "INSTANCE_vfw_k8s_demo_CNF_LR_1_vf_vfw_k8s_demo_cnf_lr_10..VfVfwK8sDemoCnfLr1..helm_vfw..module-3", + "heat-stack-id": "brave_brattain", + "orchestration-status": "Active", + "is-base-vf-module": false, + "automated-assignment": false, + "resource-version": "1635943387739", + "model-invariant-id": "89f47572-1d25-44b4-a6e0-52d0421a0980", + "model-version-id": "12a89df1-9fad-4045-a90e-dcb64264eed4", + "model-customization-id": "c81f3c71-3f42-4831-b3b2-7ceffb567795", + "module-index": 0 + } + ] + } +} diff --git a/docs/files/vFW_CNF_CDS/vpkg-vf-module-aai.json b/docs/files/vFW_CNF_CDS/vpkg-vf-module-aai.json new file mode 100644 index 000000000..84d62ca6c --- /dev/null +++ b/docs/files/vFW_CNF_CDS/vpkg-vf-module-aai.json @@ -0,0 +1,133 @@ +{ + "vf-module-id": "314795d7-6005-4462-a9fe-7006538e3ff9", + "vf-module-name": "INSTANCE_vfw_k8s_demo_CNF_LR_1_vf_vfw_k8s_demo_cnf_lr_10..VfVfwK8sDemoCnfLr1..helm_vpkg..module-2", + "heat-stack-id": "dazzling_nightingale", + "orchestration-status": "Active", + "is-base-vf-module": false, + "automated-assignment": false, + "resource-version": "1635943396304", + "model-invariant-id": "8f3652a6-af23-4d8c-9aa2-3e8d6f1a5b6e", + "model-version-id": "f4e54571-7cc7-4a67-b973-1851b8e540a7", + "model-customization-id": "5f1445b0-9ef2-4eb3-8051-a445fa35f877", + "module-index": 0, + "relationship-list": { + "relationship": [ + { + "related-to": "k8s-resource", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/cloud-infrastructure/cloud-regions/cloud-region/K8sCloudOwner/kud-lr/tenants/tenant/3444a566-2717-4d85-83bd-45c104657173/k8s-resources/k8s-resource/e73732351195c8c10d28413ddff1d968bd53b0b0e395c24b3b0fcd39f46ea730", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "K8sCloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "kud-lr" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3444a566-2717-4d85-83bd-45c104657173" + }, + { + "relationship-key": "k8s-resource.id", + "relationship-value": "e73732351195c8c10d28413ddff1d968bd53b0b0e395c24b3b0fcd39f46ea730" + } + ], + "related-to-property": [ + { + "property-key": "k8s-resource.name", + "property-value": "vfw-1-vpkg-mgmt" + } + ] + }, + { + "related-to": "k8s-resource", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/cloud-infrastructure/cloud-regions/cloud-region/K8sCloudOwner/kud-lr/tenants/tenant/3444a566-2717-4d85-83bd-45c104657173/k8s-resources/k8s-resource/f65235da9cb098588b2db0c9e7da1ccb00954268fba6bd621bb9ef0b48cd717f", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "K8sCloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "kud-lr" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3444a566-2717-4d85-83bd-45c104657173" + }, + { + "relationship-key": "k8s-resource.id", + "relationship-value": "f65235da9cb098588b2db0c9e7da1ccb00954268fba6bd621bb9ef0b48cd717f" + } + ], + "related-to-property": [ + { + "property-key": "k8s-resource.name", + "property-value": "vfw-1-vpkg" + } + ] + }, + { + "related-to": "k8s-resource", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/cloud-infrastructure/cloud-regions/cloud-region/K8sCloudOwner/kud-lr/tenants/tenant/3444a566-2717-4d85-83bd-45c104657173/k8s-resources/k8s-resource/87cbdb83bf436703bdb9823e07e1498a7b3ec7fb12ba14193aadd4630649e0ae", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "K8sCloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "kud-lr" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3444a566-2717-4d85-83bd-45c104657173" + }, + { + "relationship-key": "k8s-resource.id", + "relationship-value": "87cbdb83bf436703bdb9823e07e1498a7b3ec7fb12ba14193aadd4630649e0ae" + } + ], + "related-to-property": [ + { + "property-key": "k8s-resource.name", + "property-value": "vfw-1-vpkg-c6bdb954c-mlpz9" + } + ] + }, + { + "related-to": "k8s-resource", + "relationship-label": "org.onap.relationships.inventory.Uses", + "related-link": "/aai/v24/cloud-infrastructure/cloud-regions/cloud-region/K8sCloudOwner/kud-lr/tenants/tenant/3444a566-2717-4d85-83bd-45c104657173/k8s-resources/k8s-resource/5538b19871da1fd05b82366c38cbbe88bae4d3444b6a21018f83787327958617", + "relationship-data": [ + { + "relationship-key": "cloud-region.cloud-owner", + "relationship-value": "K8sCloudOwner" + }, + { + "relationship-key": "cloud-region.cloud-region-id", + "relationship-value": "kud-lr" + }, + { + "relationship-key": "tenant.tenant-id", + "relationship-value": "3444a566-2717-4d85-83bd-45c104657173" + }, + { + "relationship-key": "k8s-resource.id", + "relationship-value": "5538b19871da1fd05b82366c38cbbe88bae4d3444b6a21018f83787327958617" + } + ], + "related-to-property": [ + { + "property-key": "k8s-resource.name", + "property-value": "vfw-1-vpkg-configmap" + } + ] + } + ] + } +} -- 2.16.6