Demo  recording and slides are availabe at :  2022-02-22 DCAE Meeting Notes

Helm Flow Pre-requisite

ONAP deployments (gating) will include Chartmuseum installation within ONAP cluster  (charts hosted here - https://github.com/onap/oom/tree/master/kubernetes/platform/components/chartmuseum). 

Dependent charts such as - dcaegen2-services-common, readinessCheck, common, repositoryGenerator, postgres, mongo, serviceAccount, certInitializer should be preloaded into this registry as MOD retrieves them during new MS helm charts creation and linting.  To support the registry initialization, following scripts has been introduced. 


Note:  Chartmuseum being a platform component, it has to be enabled on-demand and not available with generic ONAP installation.  To setup chartmuseum and pre-load required charts, follow the ommands listed below in this page)

MOD Updates 

To support the Helm chart generation, following changes were introduced for MOD in Jakarta release

Specification Schema Change

New V3 version of component spec schema introduced - https://github.com/onap/dcaegen2-platform/blob/master/mod/component-json-schemas/component-specification/dcae-cli-v3/component-spec-schema.json

MOD/RuntimeAPI 

Build Updates

New Java module - Helmgenerator-core was introduced for Helm charts generation. MOD/Runtime has been enhanced to include this new dependency (inaddition to Bp-generator for supporting cloudify blueprints flows).

Below is snippet from - https://github.com/onap/dcaegen2-platform/blob/master/mod/runtimeapi/runtime-core/pom.xml

Chart Updates

MOD/Runtime Charts has been modified to include under resources, common base templates, Charts.yaml, add-on templates and Values.yaml with placeholder.


The Helmgenerator-core modules uses these template to pull the required dependencies and generate new chart for MS onboarded. The parameters in component-spec provided during onboarding is used for final Values.yaml file generation.

Deployment

The MOD/RuntimeAPI introduces new configuration to identify distribution mechanism. Supported artifactType are BLUEPRINT or HELM. 

Blueprint – Distribution to Inventory/Dashboard

Helm – Distribution to ChartMuseum

For Jakarta release, the charts configuration has been set to support HELM distribution by default and configured for ONAP-internal chart-museum registry.  RuntimeAPI Chart updates https://github.com/onap/oom/blob/master/kubernetes/dcaemod/components/dcaemod-runtime-api/values.yaml


DEMO STEPS

Below is summary of the steps involved.

  1. Chartmuseum Installation
  2. Chartmuseum initialization (pre-load required dependencies)
  3. Deploy MOD and define registry/target on UI
  4. Load v3 specs via OnboardingAPI
  5. Create flow on MOD Designer tool using VES and TCAgen2
  6. Distribution to Runtime
  7. Validation and Deployment


1. Chartmuseum Installation


Clone OOM repository and deploy optional Chartmuseum component


# git clone -b <BRANCH> http://gerrit.onap.org/r/oom --recurse-submodules
cd  ~/oom/kubernetes/platform/components/chartmuseum
helm install -name dev-chartmuseum -n onap . --set global.masterPassword=test1 --set global.pullPolicy=IfNotPresent


For easier validation of the charts in registry, you may enable the Nodeport for the chartmuseum service via kubectl (kubectl edit svc -n onap chart-museum) and provide Nodeport


			  ports:
			  - name: http
				nodePort: 30192
				port: 80
				protocol: TCP
				targetPort: http
			 selector:
				app.kubernetes.io/instance: chartmuseum
				app.kubernetes.io/name: chartmuseum
			  sessionAffinity: None
			  type: NodePort


 Once enabled, you can view the registry via browser - http://<k8snodeip>:30192/api/charts


Note: This chartmuseum registry is deployed internal to ONAP cluster and is different from the registry setup done part OOM (https://docs.onap.org/projects/onap-oom/en/latest/oom_quickstart_guide.html : step 6) to setup local helm server for serving chart and to push the charts generated from local make/build.

2. Chartmuseum initialization 


As noted earlier, there are two scripts available for pre-load. The registry-initialize.sh retrieves the Chartmuseum credential from secret and load the charts individually based on parameter (default no parameters, will load all DCAE service charts and its dependencies).  And demo-k8s.sh is wrapper script used in gating, which invokes registry-initialize.sh with required parameters.


cd ~/oom/kubernetes/robot
./demo-k8s.sh onap registrySynch


OR 

cd ~/oom/kubernetes/contrib/tools	
./registry-initialize.sh -d ../../dcaegen2-services/charts/ -n onap -r dev-chartmuseum
./registry-initialize.sh -d ../../dcaegen2-services/charts/ -n onap -r dev-chartmuseum -p common
./registry-initialize.sh -h repositoryGenerator  -n onap -r dev-chartmuseum
./registry-initialize.sh -h readinessCheck   -n onap -r dev-chartmuseum
./registry-initialize.sh -h dcaegen2-services-common  -n onap -r dev-chartmuseum
./registry-initialize.sh -h postgres   -n onap -r dev-chartmuseum
./registry-initialize.sh -h serviceAccount   -n onap -r dev-chartmuseum
./registry-initialize.sh -h certInitializer  -n onap -r dev-chartmuseum
./registry-initialize.sh -h mongo -n onap -r dev-chartmuseum



3. MOD Deployments and Configuration

The deployment of MOD has not changed from previous release (same steps listed here - DCAE MOD User Guide#1.DeploymentofDCAEMODcomponentsviaHelmcharts is applicable)

Example below using generic override

helm install dev-dcaemod local/dcaemod --namespace onap  -f ~/onap-override.yaml --set global.masterPassword=test1 --set global.pullPolicy=IfNotPresent							


When DCAE MOD is deployed with an ingress controller, several endpoints are exposed outside the cluster at the ingress controller's external IP address and port.   (In the case of a Rancher RKE installation, there is an ingress controller on every worker node, listening at the the standard HTTP port (80).)  These exposed endpoints are needed by users using machines outside the Kubernetes cluster.

Endpoint

 Routes to (cluster internal address)

Description

/nifi

http://dcaemod-designtool:8080/nifi

Design tool Web UI

/nifi-api

http://dcaemod-designtool:8080/nifi-api

Design tool API

/nifi-jars

http://dcaemod-nifi-registry:18080/nifi-jars

Flow registry listing of JAR files built from component specs

/onboarding

http://dcaemod-onboarding-api:8080/onboarding

Onboarding API

/distributor

http://dcaemod-distributor-api:8080/distributor

Distributor API

To access the design Web UI, for example, a user would use the URL : http://ingress_controller_address:ingress_controller_port/nifi.
ingress_controller_address is the the IP address or DNS FQDN of the ingress controller and
ingress_controller_port is the port on which the ingress controller is listening for HTTP requests.  (If the port is 80, the HTTP default, then there is no need to specify a port.)

There are two additional internal endpoints that users need to know, in order to configure a registry client and a distribution target in the design tool's controller settings.

Configuration Item

Endpoint URL

Registry client

http://dcaemod-nifi-registry:18080

Distribution target

http://dcaemod-runtime-api:9090


As OOM/ingress template has been updated in Guilin release to enable virtual host, MOD API's and UI access via ingress should use dcaemod.api.simpledemo.onap.org 

Add entry for dcaemod.simpledemo.onap.org in /etc/hosts with the correct IP (any of K8S node IP can be specified)

Configuring DCAE mod

Note: The IP should be changed to one of your K8S Node ip or the DNS FQDN

Now let’s access the Nifi (DCAE designer) UI - http://dcaemod.simpledemo.onap.org/nifi/




a) Configure Nifi Registry url

Next check Nifi settings by selecting the Hamburger button in the Nifi UI. It should lead you to the Nifi Settings screen

Add a registry client. The Registry client url will be http://dcaemod-nifi-registry:18080


b) Add distribution target which will be the runtime api url

Set the distribution target in the controller settings


Distribution target URL will be http://dcaemod-runtime-api:9090


4. Load V3 specs (and data-formats) via Onboarding API


VESCollector

VES specifciation - https://git.onap.org/dcaegen2/collectors/ves/tree/dpo/spec/vescollector-componentspec-v3.json

Data Formats - https://git.onap.org/dcaegen2/collectors/ves/tree/dpo/data-formats


For the purpose of onboarding, a Sample Request body should be of the type -

{ "owner": "<some value>", "spec": <some json object> }

 where the json object inside the spec field can be a component spec json.

Request bodies of this type will be used in the onboarding requests you make using curl or the onboarding swagger interface.


The prepared Sample Request body for a component dcae-ves-collector looks like so



 {
   "spec":

{
    "self": {
        "version": "1.10.1",
        "name": "dcae-ves-collector",
        "description": "Collector for receiving VES events through restful interface",
        "component_type": "docker"
    },
    "streams": {
        "subscribes": [],
        "publishes": [{
                "format": "VES_specification",
                "version": "5.28.4",
                "type": "message router",
                "config_key": "ves-fault"
            },
            {
                "format": "VES_specification",
                "version": "5.28.4",
                "type": "message router",
                "config_key": "ves-measurement"
            },
            {
                "format": "VES_specification",
                "version": "5.28.4",
                "type": "message router",
                "config_key": "ves-syslog"
            },
            {
                "format": "VES_specification",
                "version": "5.28.4",
                "type": "message router",
                "config_key": "ves-heartbeat"
            },
            {
                "format": "VES_specification",
                "version": "7.30.2",
                "type": "message router",
                "config_key": "ves-other"
            },
            {
                "format": "VES_specification",
                "version": "5.28.4",
                "type": "message router",
                "config_key": "ves-mobileflow"
            },
            {
                "format": "VES_specification",
                "version": "5.28.4",
                "type": "message router",
                "config_key": "ves-statechange"
            },
            {
                "format": "VES_specification",
                "version": "5.28.4",
                "type": "message router",
                "config_key": "ves-thresholdCrossingAlert"
            },
            {
                "format": "VES_specification",
                "version": "5.28.4",
                "type": "message router",
                "config_key": "ves-voicequality"
            },
            {
                "format": "VES_specification",
                "version": "5.28.4",
                "type": "message router",
                "config_key": "ves-sipsignaling"
            },
            {
                "format": "VES_specification",
                "version": "7.30.2",
                "type": "message router",
                "config_key": "ves-pnfRegistration"
            },
            {
                "format": "VES_specification",
                "version": "7.30.2",
                "type": "message router",
                "config_key": "ves-notification"
            },
            {
                "format": "VES_specification",
                "version": "7.30.2",
                "type": "message router",
                "config_key": "ves-perf3gpp"
            },
            {
                "format": "VES_specification",
                "version": "7.30.2",
                "type": "message router",
                "config_key": "ves-3gpp-fault-supervision"
            },
            {
                "format": "VES_specification",
                "version": "7.30.2",
                "type": "message router",
                "config_key": "ves-3gpp-provisioning"
            },
            {
                "format": "VES_specification",
                "version": "7.30.2",
                "type": "message router",
                "config_key": "ves-3gpp-heartbeat"
            },
            {
                "format": "VES_specification",
                "version": "7.30.2",
                "type": "message router",
                "config_key": "ves-3gpp-performance-assurance"
            }
        ]
    },
    "services": {
        "calls": [],
        "provides": [{
                "route": "/eventListener/v1",
                "verb": "POST",
                "request": {
                    "format": "VES_specification",
                    "version": "4.27.2"
                },
                "response": {
                    "format": "ves.coll.response",
                    "version": "1.0.0"
                }
            },
            {
                "route": "/eventListener/v2",
                "verb": "POST",
                "request": {
                    "format": "VES_specification",
                    "version": "4.27.2"
                },
                "response": {
                    "format": "ves.coll.response",
                    "version": "1.0.0"
                }
            },
            {
                "route": "/eventListener/v3",
                "verb": "POST",
                "request": {
                    "format": "VES_specification",
                    "version": "4.27.2"
                },
                "response": {
                    "format": "ves.coll.response",
                    "version": "1.0.0"
                }
            },
            {
                "route": "/eventListener/v4",
                "verb": "POST",
                "request": {
                    "format": "VES_specification",
                    "version": "4.27.2"
                },
                "response": {
                    "format": "ves.coll.response",
                    "version": "1.0.0"
                }
            },
            {
                "route": "/eventListener/v5",
                "verb": "POST",
                "request": {
                    "format": "VES_specification",
                    "version": "5.28.4"
                },
                "response": {
                    "format": "ves.coll.response",
                    "version": "1.0.0"
                }
            },
            {
                "route": "/eventListener/v7",
                "verb": "POST",
                "request": {
                    "format": "VES_specification",
                    "version": "7.30.2"
                },
                "response": {
                    "format": "ves.coll.response",
                    "version": "1.0.0"
                }
            }
        ]
    },
    "parameters": [{
            "name": "streams_publishes",
            "value": "{\"ves-3gpp-fault-supervision\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.SEC_3GPP_FAULTSUPERVISION_OUTPUT\"},\"type\":\"message_router\"},\"ves-3gpp-heartbeat\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.SEC_3GPP_HEARTBEAT_OUTPUT\"},\"type\":\"message_router\"},\"ves-3gpp-performance-assurance\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.SEC_3GPP_PERFORMANCEASSURANCE_OUTPUT\"},\"type\":\"message_router\"},\"ves-3gpp-provisioning\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.SEC_3GPP_PROVISIONING_OUTPUT\"},\"type\":\"message_router\"},\"ves-fault\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.SEC_FAULT_OUTPUT\"},\"type\":\"message_router\"},\"ves-heartbeat\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.SEC_HEARTBEAT_OUTPUT\"},\"type\":\"message_router\"},\"ves-measurement\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.VES_MEASUREMENT_OUTPUT\"},\"type\":\"message_router\"},\"ves-notification\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.VES_NOTIFICATION_OUTPUT\"},\"type\":\"message_router\"},\"ves-other\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.SEC_OTHER_OUTPUT\"},\"type\":\"message_router\"},\"ves-pnfRegistration\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.VES_PNFREG_OUTPUT\"},\"type\":\"message_router\"}}",
            "description": "standard http port collector will open for listening;",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.service.port",
            "value": 8080,
            "description": "standard http port collector will open for listening;",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.service.secure.port",
            "value": 8443,
            "description": "secure http port collector will open for listening ",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": true
        },
        {
            "name": "collector.keystore.file.location",
            "value": "/opt/app/dcae-certificate/cert.jks",
            "description": "fs location of keystore file in vm",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.keystore.passwordfile",
            "value": "/opt/app/dcae-certificate/jks.pass",
            "description": "location of keystore password file in vm",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.truststore.file.location",
            "value": "/opt/app/dcae-certificate/trust.jks",
            "description": "fs location of truststore file in vm",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.truststore.passwordfile",
            "value": "/opt/app/dcae-certificate/trust.pass",
            "description": "location of truststore password file in vm",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.dmaap.streamid",
            "value": "fault=ves-fault|syslog=ves-syslog|heartbeat=ves-heartbeat|measurementsForVfScaling=ves-measurement|mobileFlow=ves-mobileflow|other=ves-other|stateChange=ves-statechange|thresholdCrossingAlert=ves-thresholdCrossingAlert|voiceQuality=ves-voicequality|sipSignaling=ves-sipsignaling|notification=ves-notification|pnfRegistration=ves-pnfRegistration|3GPP-FaultSupervision=ves-3gpp-fault-supervision|3GPP-Heartbeat=ves-3gpp-heartbeat|3GPP-Provisioning=ves-3gpp-provisioning|3GPP-PerformanceAssurance=ves-3gpp-performance-assurance",
            "description": "domain-to-streamid mapping used by VESCollector to distributes events based on domain. Both primary and secondary config_key are included for resilency (multiple streamid can be included commma separated). The streamids MUST match to topic config_keys. For single site without resiliency deployment - configkeys with -secondary suffix can be removed",
            "sourced_at_deployment": true,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "auth.method",
            "value": "noAuth",
            "description": "Property to manage application mode, possible configurations: noAuth - default option - no security (http) , certOnly - auth by certificate (https), basicAuth - auth by basic auth username and password (https),certBasicAuth - auth by certificate and basic auth username / password (https),",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "header.authlist",
            "value": "sample1,$2a$10$pgjaxDzSuc6XVFEeqvxQ5u90DKJnM/u7TJTcinAlFJVaavXMWf/Zi|userid1,$2a$10$61gNubgJJl9lh3nvQvY9X.x4e5ETWJJ7ao7ZhJEvmfJigov26Z6uq|userid2,$2a$10$G52y/3uhuhWAMy.bx9Se8uzWinmbJa.dlm1LW6bYPdPkkywLDPLiy",
            "description": "List of id and base 64 encoded password.For each onboarding VNF - unique userid and password should be assigned and communicated to VNF owner. Password value should be base64 encoded in config here",
            "policy_editable": false,
            "sourced_at_deployment": true,
            "designer_editable": true
        },
        {
            "name": "collector.schema.checkflag",
            "value": 1,
            "description": "Schema check validation flag. When enabled, collector will validate input VES events against VES Schema defined on collector.schema.file ",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.schema.file",
            "value": "{\"v1\":\"./etc/CommonEventFormat_27.2.json\",\"v2\":\"./etc/CommonEventFormat_27.2.json\",\"v3\":\"./etc/CommonEventFormat_27.2.json\",\"v4\":\"./etc/CommonEventFormat_27.2.json\",\"v5\":\"./etc/CommonEventFormat_28.4.1.json\",\"v7\":\"./etc/CommonEventFormat_30.2.1_ONAP.json\"}",
            "description": "VES schema file name per version used for validation",
            "designer_editable": true,
            "sourced_at_deployment": false,
            "policy_editable": false
        },
        {
            "name": "event.transform.flag",
            "value": 1,
            "description": "flag to enable tranformation rules defined under eventTransform.json; this is applicable when event tranformation rules preset should be activated for transforming <VES5.4 events to 5.4",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "tomcat.maxthreads",
            "value": "200",
            "description": "Tomcat control for concurrent request",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.externalSchema.checkflag",
            "value": 1,
            "description": "Schema stndDefined validation flag. When enabled, collector will validate stndDefined fields in stndDefined domain events against mapped local schemas listed in file from property collector.externalSchema.mappingFileLocation.",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": true
        },
        {
            "name": "collector.externalSchema.schemasLocation",
            "value": "./etc/externalRepo/",
            "description": "External schemas repository. Path to schemas storage directory.",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.externalSchema.mappingFileLocation",
            "value": "./etc/externalRepo/schema-map.json",
            "description": "Path to JSON file containing mapping of externally located stndDefined schemas to local schema files.",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "event.externalSchema.schemaRefPath",
            "value": "$.event.stndDefinedFields.schemaReference",
            "description": "An internal path from validated JSON. Defines which field is taken as public schema reference, which is later mapped.",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "event.externalSchema.stndDefinedDataPath",
            "value": "$.event.stndDefinedFields.data",
            "description": "An internal path from validated JSON. Defines which field of event will be validated during stndDefined validation.",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        },
        {
            "name": "collector.description.api.version.location",
            "value": "etc/api_version_description.json",
            "description": "Path to the file containing description of api versions",
            "sourced_at_deployment": false,
            "policy_editable": false,
            "designer_editable": false
        }
    ],
    "auxilary": {
        "helm": {
            "service": {
                "type": "NodePort",
                "name": "dcae-ves-collector",
                "has_internal_only_ports": true,
                "ports": [{
                    "name": "http",
                    "port": 8443,
                    "plain_port": 8080,
                    "port_protocol": "http",
                    "nodePort": 17,
                    "useNodePortExt": true
                }]
            }
        },
        "healthcheck": {
            "type": "HTTP",
            "interval": "15s",
            "timeout": "1s",
            "port": 8080,
            "endpoint": "/healthcheck"
        },
        "volumes": [{
            "config_volume": {
                "name": "dcae-external-repo-configmap-schema-map"
            },
            "container": {
                "bind": "/opt/app/VESCollector/etc/externalRepo/"
            }
        }, {
            "config_volume": {
                "name": "dcae-external-repo-configmap-sa88-rel16"
            },
            "container": {
                "bind": "/opt/app/VESCollector/etc/externalRepo/3gpp/rep/sa5/MnS/blob/SA88-Rel16/OpenAPI/"
            }
        }],
        "ports": [
            "8080:0",
            "8443:0"
        ],
        "log_info": {
            "log_directory": "/opt/app/VESCollector/logs/"
        },
        "tls_info": {
            "cert_directory": "/opt/app/dcae-certificate/",
            "use_tls": true,
            "use_external_tls": false
        }
    },
    "artifacts": [{
        "type": "docker image",
        "uri": "onap/org.onap.dcaegen2.collectors.ves.vescollector:1.10.1"
    }]
}
,
   "owner": "onboard_dev"
 }
 



The prepared Sample request body for a sample data format  looks like so -



{
  "spec": {
  "self": {
    "name": "VES_specification",
    "version": "7.30.2",
    "description": "VES spec for v7.2"
  },
  "dataformatversion": "1.0.0",
    "reference": {
        "name": "Common Event Format",
        "format": "JSON",
        "version": "30.2.0",
        "url" : "https://git.onap.org/dcaegen2/collectors/ves/tree/etc/CommonEventFormat_30.2_ONAP.json"
   }
}
, "owner": "onboarding_dev"
}
 




TCAGen2


TCA specifciation - https://git.onap.org/dcaegen2/analytics/tca-gen2/tree/dcae-analytics/dpo/tcagen2-componentspec-v3.json

Data Formats - https://git.onap.org/dcaegen2/analytics/tca-gen2/tree/dcae-analytics/dpo/dcaeCLOutput.json, https://git.onap.org/dcaegen2/analytics/tca-gen2/tree/dcae-analytics/dpo/dmaap.json https://git.onap.org/dcaegen2/analytics/tca-gen2/tree/dcae-analytics/dpo/aai.json


For the purpose of onboarding, a Sample Request body should be of the type -

{ "owner": "<some value>", "spec": <some json object> }

 where the json object inside the spec field can be a component spec json.

Request bodies of this type will be used in the onboarding requests you make using curl or the onboarding swagger interface.


The prepared Sample Request body for a component dcae-tcagen2 looks like so



{
       "spec":

{
  "self": {
    "name": "dcae-tcagen2",
    "version": "1.3.1",
    "description": "TCAGen2 Docker Application",
    "component_type": "docker"
  },
  "streams": {
    "subscribes": [
      {
        "config_key": "tca_handle_in",
        "format": "VES_specification",
        "version": "5.28.4",
        "type": "message_router"
      }
    ],
    "publishes": [
      {
        "config_key": "tca_handle_out",
        "format": "DCAE_CL_Output",
        "version": "1.0.1",
        "type": "message_router"
      }
    ]
  },
  "services": {
    "calls": [
      {
        "config_key": "aai_broker_handle",
        "verb": "GET",
        "request": {
          "format": "tca.aai",
          "version": "1.0.0"
        },
        "response": {
          "format": "tca.aai",
          "version": "1.0.0"
        }
      }
    ],
    "provides": []
  },
  "auxilary": {
    "helm": {
      "service": {
        "type": "ClusterIP",
        "name": "dcae-tcagen2",
        "ports": [
         {
            "name": "http",
            "port": 9091
         }
        ]
      }
    },
    "healthcheck": {
      "type": "HTTP",
      "interval": "30s",
      "timeout": "10s",
      "port": 9091,
      "endpoint": "/actuator/health"
    },
    "ports": [
      "9091:0"
    ],
    "log_info": {
        "log_directory": "/opt/logs/dcae-analytics-tca"
     },
    "tls_info":{
        "cert_directory":"/opt/app/dcae-certificate/",
        "use_tls":true
     }
  },
  "artifacts": [
    {
      "uri": "onap/org.onap.dcaegen2.analytics.tca-gen2.dcae-analytics-tca-web:1.3.1",
      "type": "docker image"
    }
  ],
  "parameters": [
    {
      "name": "spring.data.mongodb.uri",
      "value": "mongodb://dcae-mongohost/dcae-tcagen2",
      "description": "Mongodb database uri",
      "designer_editable": true,
      "sourced_at_deployment": true,
      "policy_editable": false,
      "type": "string",
      "required": true
    },
    {
      "name": "streams_publishes",
      "value": "{\"tca_handle_out\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.DCAE_CL_OUTPUT\"},\"type\":\"message_router\"}}",
      "description": "standard http port collector will open for listening;",
      "sourced_at_deployment": false,
      "policy_editable": false,
      "designer_editable": false
    },
    {
      "name": "streams_subscribes",
      "value": "{\"tca_handle_in\":{\"dmaap_info\":{\"topic_url\":\"http:\/\/message-router:3904\/events\/unauthenticated.VES_MEASUREMENT_OUTPUT\"},\"type\":\"message_router\"}}",
      "description": "standard http port collector will open for listening;",
      "sourced_at_deployment": false,
      "policy_editable": false,
      "designer_editable": false
    },
    {
      "name": "tca.policy",
      "value" : "{\"domain\":\"measurementsForVfScaling\",\"metricsPerEventName\":[{\"eventName\":\"vFirewallBroadcastPackets\",\"controlLoopSchemaType\":\"VM\",\"policyScope\":\"DCAE\",\"policyName\":\"DCAE.Config_tca-hi-lo\",\"policyVersion\":\"v0.0.1\",\"thresholds\":[{\"closedLoopControlName\":\"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta\",\"thresholdValue\":300,\"direction\":\"LESS_OR_EQUAL\",\"severity\":\"MAJOR\",\"closedLoopEventStatus\":\"ONSET\"},{\"closedLoopControlName\":\"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta\",\"thresholdValue\":700,\"direction\":\"GREATER_OR_EQUAL\",\"severity\":\"CRITICAL\",\"closedLoopEventStatus\":\"ONSET\"}]},{\"eventName\":\"vLoadBalancer\",\"controlLoopSchemaType\":\"VM\",\"policyScope\":\"DCAE\",\"policyName\":\"DCAE.Config_tca-hi-lo\",\"policyVersion\":\"v0.0.1\",\"thresholds\":[{\"closedLoopControlName\":\"ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta\",\"thresholdValue\":300,\"direction\":\"GREATER_OR_EQUAL\",\"severity\":\"CRITICAL\",\"closedLoopEventStatus\":\"ONSET\"}]},{\"eventName\":\"Measurement_vGMUX\",\"controlLoopSchemaType\":\"VNF\",\"policyScope\":\"DCAE\",\"policyName\":\"DCAE.Config_tca-hi-lo\",\"policyVersion\":\"v0.0.1\",\"thresholds\":[{\"closedLoopControlName\":\"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value\",\"thresholdValue\":0,\"direction\":\"EQUAL\",\"severity\":\"MAJOR\",\"closedLoopEventStatus\":\"ABATED\"},{\"closedLoopControlName\":\"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e\",\"version\":\"1.0.2\",\"fieldPath\":\"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value\",\"thresholdValue\":0,\"direction\":\"GREATER\",\"severity\":\"CRITICAL\",\"closedLoopEventStatus\":\"ONSET\"}]}]}",
      "description": "Threshold Crossing Alert Policy JSON as string",
      "designer_editable": false,
      "sourced_at_deployment": false,
      "policy_editable": true,
      "type": "string",
      "required": true
    },
    {
      "name": "tca.processing_batch_size",
      "value": 10000,
      "description": "Batch size for TCA Application Transaction",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "number",
      "required": false
    },
    {
      "name": "tca.enable_abatement",
      "value": true,
      "description": "Enables / Disables TCA Alerts Abatement",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "boolean",
      "required": false
    },
    {
      "name": "tca.enable_ecomp_logging",
      "value": true,
      "description": "Enables / Disables ECOMP Logging",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "boolean",
      "required": false
    },
    {
      "name": "tca.aai.enable_enrichment",
      "value": true,
      "description": "Enables / Disables TCA A&AI Enrichment",
      "designer_editable": true,
      "sourced_at_deployment": true,
      "policy_editable": false,
      "type": "boolean",
      "required": false
    },
    {
      "name": "tca.aai.url",
      "value": "http://aai.onap.svc.cluster.local",
      "description": "A&AI Enrichment Service URL. Required only if A&AI Enrichment is enabled",
      "designer_editable": true,
      "sourced_at_deployment": true,
      "policy_editable": false,
      "type": "string",
      "required": false
    },
    {
      "name": "tca.aai.username",
      "value": "DCAE",
      "description": "A&AI Enrichment Service basic authentication user name",
      "designer_editable": true,
      "sourced_at_deployment": true,
      "policy_editable": false,
      "type": "string",
      "required": false
    },
    {
      "name": "tca.aai.password",
      "value": "DCAE",
      "description": "A&AI Enrichment Service basic authentication user password",
      "designer_editable": true,
      "sourced_at_deployment": true,
      "policy_editable": false,
      "type": "string",
      "required": false
    },
    {
      "name": "tca.aai.generic_vnf_path",
      "value": "aai/v11/network/generic-vnfs/generic-vnf",
      "description": "A&AI Enrichment Service VNF query endpoint path",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "string",
      "required": false
    },
    {
      "name": "tca.aai.node_query_path",
      "value": "aai/v11/search/nodes-query",
      "description": "A&AI Enrichment Service Node query endpoint path",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "string",
      "required": false
    },
    {
      "name": "streams_subscribes.tca_handle_in.consumer_group",
      "value": "cg1",
      "description": "Subscriber consumer group",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "string",
      "required": false
    },
    {
      "name": "streams_subscribes.tca_handle_in.consumer_ids[0]",
      "value": "c0",
      "description": "Subscriber first consumer id",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "string",
      "required": false
    },
    {
      "name": "streams_subscribes.tca_handle_in.consumer_ids[1]",
      "value": "c1",
      "description": "Subscriber second consumer id",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "string",
      "required": false
    },
    {
      "name": "streams_subscribes.tca_handle_in.message_limit",
      "value": 50000,
      "description": "Maximum message fetched by TCA Subscriber",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "number",
      "required": true
    },
    {
      "name": "streams_subscribes.tca_handle_in.timeout",
      "value": -1,
      "description": "Timeout for TCA Subscriber",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "number",
      "required": false
    },
    {
      "name": "streams_subscribes.tca_handle_in.polling.fixed_rate",
      "value": 0,
      "description": "Subscriber fixed polling interval in milliseconds. Value of 0 indicated auto adjusting polling will be used",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "number",
      "required": false
    },
    {
      "name": "streams_subscribes.tca_handle_in.polling.auto_adjusting.min",
      "value": 30000,
      "description": "Subscriber Auto Adjusting polling minimum interval in milliseconds",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "number",
      "required": false
    },
    {
      "name": "streams_subscribes.tca_handle_in.polling.auto_adjusting.step_up",
      "value": 10000,
      "description": "Subscriber Auto Adjusting polling step up delta in milliseconds when message is not found",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "number",
      "required": false
    },
    {
      "name": "streams_subscribes.tca_handle_in.polling.auto_adjusting.max",
      "value": 60000,
      "description": "Subscriber Auto Adjusting polling maximum interval in milliseconds",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "number",
      "required": false
    },
    {
      "name": "streams_subscribes.tca_handle_in.polling.auto_adjusting.step_down",
      "value": 30000,
      "description": "Subscriber Auto Adjusting polling step down delta in milliseconds when message is found",
      "designer_editable": true,
      "sourced_at_deployment": false,
      "policy_editable": false,
      "type": "number",
      "required": false
    }
  ]
}
 ,
       "owner": "onboard_dev"
}


 


The prepared Sample request body for a sample data format  looks like so -



{
  "spec": {
  "self": {
    "name": "DCAE_CL_Output",
    "version": "1.0.1",
    "description": "The format of the output CL event from DCAE to Policy"
  },
  "dataformatversion": "1.0.0",
  "jsonschema": {
    "name": "CL Alert",
    "version": "1.0.0",
    "properties": {
      "version": {
        "type": "string",
        "enum": [
          "1.0.2"
        ]
      },
      "closedLoopControlName": {
        "type": "string",
        "description" : "This is the unique ID for the Control Loop. It is created by the CLAMP platform during Control Loop design"
      },
      "requestID": {
        "type": "string",
        "description" : "For the control loop, when an instance of the Control Loop occurs, this unique ID must be created. The same ID must be forwarded for both the ONSET and the ABATED control loop messages"
      },
      "closedLoopEventStatus": {
        "type": "string",
        "description" : "This is the status of the closedLoopControlName/requestID pair",
        "enum": [
          "ONSET",
          "ABATED"
        ]
      },
      "closedLoopAlarmStart": {
        "type": "string",
        "description" : "When the alarm was first detected"
      },
      "closedLoopAlarmEnd" : {
        "type" : "string",
        "description" : "When the alarm was cleared. This field need only be present in the ABATED message"
      },
      "closedLoopEventClient": {
        "type": "string",
        "description" : "For monitoring/logging/auditing purposes, if there is an instance ID of the DCAE micro service this field should be populated with it"
      },
      "policyVersion": {
        "type": "string",
        "description" : "The version of the Policy driving the DCAE Micro service. Should be a part of the configuration policy setup by CLAMP and passed by DCAE controller"
      },
      "policyName": {
        "type": "string",
        "description" : "The name of the Policy driving the DCAE micro service. Should be a part of the configuration policy setup by CLAMP and passed by DCAE controller"
      },
      "policyScope": {
        "type": "string",
        "description" : "The scope of the Policy driving the DCAE micro service. Should be a part of the configuration policy setup by CLAMP and passed by DCAE controller"
      },
      "from": {
        "type": "string",
        "description" : "The ONAP platform component publishing this message",
        "enum": [
          "DCAE"
        ]
      },
      "target_type": {
        "type": "string",
        "description" : "The type of the target: VM or VNF",
        "enum": [
          "VNF",
          "VM"
        ]
      },
      "target": {
        "type": "string",
        "description" : "This is the name of the field within the A&AI sub-tag that indicates the actual entity Node details. There should be a matching node field within the A&AI subtag holding this value",
        "enum": [
          "generic-vnf.vnf-id",
          "vserver.vserver-name"
        ]
      },
      "AAI": {
        "description" : "Contains the A&AI Node-Attribute list",
        "anyOf": [
          {
            "generic-vnf.vnf-id": {
              "type": "string"
            }
          },
          {
            "vserver.vserver-name": {
              "type": "string"
            }
          }
        ]
      }
    },
    "required": ["version", "closedLoopControlName", "requestID", "closedLoopEventStatus", "closedLoopAlarmStart", "from", "target_type", "target", "AAI"]
  }
}, "owner": "onboarding_dev"
}




Onboard a data format and a component

Each component has a description that tells what it does.

These requests would be of the type-

curl -X POST http://<onboardingapi host>/onboarding/dataformats     -H "Content-Type: application/json" -d @<filepath to request>
curl -X POST http://<onboardingapi host>/onboarding/components     -H "Content-Type: application/json" -d @<filepath to request>   

In our case, 
curl -X POST http://dcaemod.simpledemo.onap.org/onboarding/dataformats     -H "Content-Type: application/json" -d @<filepath to request>
curl -X POST http://dcaemod.simpledemo.onap.org/onboarding/components     -H "Content-Type: application/json" -d @<filepath to request>  

HOST=dcaemod.simpledemo.onap.org
curl -X POST http://$HOST/onboarding/dataformats     -H "Content-Type: application/json" -d @ves-4.27.2-df.json
curl -X POST http://$HOST/onboarding/dataformats     -H "Content-Type: application/json" -d @ves-5.28.4-df.json
curl -X POST http://$HOST/onboarding/dataformats     -H "Content-Type: application/json" -d @ves-response-df.json
curl -X POST http://$HOST/onboarding/dataformats     -H "Content-Type: application/json" -d @VES-7.30.2_ONAP-dataformat_onboard.json
curl -X POST http://$HOST/onboarding/components -H "Content-Type: application/json" -d @vescollector-componentspec-v3-mod.json

curl -X POST  http://$HOST/onboarding/dataformats     -H "Content-Type: application/json" -d @dcaeCLOutput-resp.json
curl -X POST  http://$HOST/onboarding/dataformats     -H "Content-Type: application/json" -d @aai-resp.json
curl -X POST  http://$HOST/onboarding/components -H "Content-Type: application/json" -d @tcagen2-componentspec-v3-mod.json


You can download the Component Specification and Data Formats used for the demo from here - demo.zip


Verify the resources were created using
curl -X GET http://dcaemod.simpledemo.onap.org/onboarding/dataformats

curl -X GET http://dcaemod.simpledemo.onap.org/onboarding/components


Verify the genprocessor (which polls onboarding periodically to convert component specs to nifi processor), converted the component

Open http://dcaemod.simpledemo.onap.org/nifi-jars/ in a browser.

These jars should now be available for you to use in the nifi UI as processors.

5. Create flow Design using using VES and TCAgen2


This step is same as captured here  - DCAE MOD User Guide#3.Design&DistributionFlow


a) To start creating flows, we need to create a process group first. The name of the process group will be the name of the flow. Drag and Drop on the canvas, the ‘Processor Group’ icon from the DCAE Designer bar on the top.



Now enter the process group by double clicking it,

You can now drag and drop on the canvas ‘Processor’ icon from the top DCAE Designer tab. You can search for a particular component in the search box that appears when you attempt to drag the ‘Processor’ icon to the canvas.


If the Nifi registry linking worked, you should see the “Import” button when you try to add a Processor or Process group to the Nifi canvas, like so-


By clicking on the import button, we can import already created saved and version controlled flows from the Nifi registry, if they are present.


We can save created flows by version controlling them like so starting with a 'right click' anywhere on the canvas-





Ideally you would name the flow and process group the same, because functionally they are similar.



When the flow is checked in, the bar at the bottom shows a green checkmark


Note: Even if you move a component around on the canvas, and its position on the canvas changes, it is recognized as a change, and it will have to recommitted.



b) Adding components and building the flow

You can add additional components in your flow and connect them.

DcaeVesCollector connects to DockerTcagen2.





Along the way you need to also provide topic names in the settings section. These can be arbitrary names.


To recap, see how DcaeVesCollector connects to DockerTcagen2. Look at the connection relationships. Currently there is no way to validate these relationships. Notice how it is required to name the topics by going to Settings.

The complete flow after joining our components looks like so




  1. Distribution to Runtime
  2. Validation and Deployment

 

6. Distribute the flow to RuntimeAPI

Once your flow is complete and saved in the Nifi registry, you can choose to submit it for distribution.


If the flow was submitted successfully to the runtime api, you should get a pop up a success message like so -


At this step, the design was packaged and sent to Runtime api.

The runtime is supposed to generate the Helmchart for components involved in the flow and push them to registry configured. The RuntimeAPI logs should looks like below for successful distribution (can be viewed through kubcel log -f command)


2022-03-07 18:13:25.865  INFO 1 --- [nio-9090-exec-8] o.o.d.r.web.controllers.GraphController  : org.onap.dcae.runtime.web.models.GraphRequest@65efc9d3
2022-03-07 18:13:26.119  INFO 1 --- [nio-9090-exec-1] o.o.d.r.web.controllers.GraphController  : [org.onap.dcae.runtime.web.models.Action@335a6cff, org.onap.dcae.runtime.web.models.Action@291687dd, org.onap.dcae.runtime.web.models.Action@36d57691]
2022-03-07 18:13:26.142  INFO 1 --- [nio-9090-exec-1] o.o.d.platform.helmchartgenerator.Utils  : cloning dir/file at : /tmp/chart17927059362260733428
2022-03-07 18:13:26.158  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : running: helm dep up /tmp/chart17927059362260733428
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "local" chart repository
Update Complete. ⎈Happy Helming!⎈
Saving 7 charts
Downloading common from repo http://chart-museum:80
Downloading repositoryGenerator from repo http://chart-museum:80
Downloading readinessCheck from repo http://chart-museum:80
Downloading dcaegen2-services-common from repo http://chart-museum:80
Downloading postgres from repo http://chart-museum:80
Downloading serviceAccount from repo http://chart-museum:80
Downloading mongo from repo http://chart-museum:80
Deleting outdated charts
2022-03-07 18:13:26.273  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : running: helm lint /tmp/chart17927059362260733428
2022-03-07 18:13:30.641  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : ==> Linting /tmp/chart17927059362260733428
2022-03-07 18:13:30.642  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : [INFO] Chart.yaml: icon is recommended
2022-03-07 18:13:30.642  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    :
2022-03-07 18:13:30.642  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : 1 chart(s) linted, 0 chart(s) failed
2022-03-07 18:13:30.646  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : running: helm package -d /tmp/chart13832736430918913290 /tmp/chart17927059362260733428
2022-03-07 18:13:30.737  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : Successfully packaged chart and saved it to: /tmp/chart13832736430918913290/dcae-ves-collector-1.10.1.tgz
2022-03-07 18:13:30.836  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.d.ChartMuseumDistributor       : {"saved":true}
2022-03-07 18:13:30.857  INFO 1 --- [nio-9090-exec-1] o.o.d.platform.helmchartgenerator.Utils  : cloning dir/file at : /tmp/chart7638328545634423550
2022-03-07 18:13:30.870  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : running: helm dep up /tmp/chart7638328545634423550
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "local" chart repository
Update Complete. ⎈Happy Helming!⎈
Saving 7 charts
Downloading common from repo http://chart-museum:80
Downloading repositoryGenerator from repo http://chart-museum:80
Downloading readinessCheck from repo http://chart-museum:80
Downloading dcaegen2-services-common from repo http://chart-museum:80
Downloading postgres from repo http://chart-museum:80
Downloading serviceAccount from repo http://chart-museum:80
Downloading mongo from repo http://chart-museum:80
Deleting outdated charts
2022-03-07 18:13:31.022  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : running: helm lint /tmp/chart7638328545634423550
2022-03-07 18:13:35.142  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : ==> Linting /tmp/chart7638328545634423550
2022-03-07 18:13:35.143  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : [INFO] Chart.yaml: icon is recommended
2022-03-07 18:13:35.143  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    :
2022-03-07 18:13:35.143  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : 1 chart(s) linted, 0 chart(s) failed
2022-03-07 18:13:35.148  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : running: helm package -d /tmp/chart14389934160290252569 /tmp/chart7638328545634423550
2022-03-07 18:13:35.238  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.chartbuilder.HelmClientImpl    : Successfully packaged chart and saved it to: /tmp/chart14389934160290252569/dcae-tcagen2-1.3.1.tgz
2022-03-07 18:13:35.303  INFO 1 --- [nio-9090-exec-1] o.o.d.p.h.d.ChartMuseumDistributor       : {"saved":true}

7. Validation and Deployment


Charts distributed by MOD/Runtime can be verified on Chartmuseum registry (http://<K8SNodeIp>:30192/api/charts)

For demo purpose, charts are pulled from this registry using these command and followed by deployment

curl -X GET http://10.12.5.9:30192/charts/dcae-ves-collector-1.10.1.tgz -u onapinitializer:demo123456! -o dcae-ves-collector-1.10.1.tgz

curl -X GET http://10.12.5.9:30192/charts/dcae-tcagen2-1.3.1.tgz -u onapinitializer:demo123456!  -o dcae-tcagen2-1.3.1.tgz
helm install -name dev-dcaegen2-services -n onap dcae-tcagen2-1.3.1.tgz --set global.masterPassword=test1 --set global.pullPolicy=Always --set mongo.enabled=true

8.  Environment Cleanup


helm delete -n onap dev-chartmuseum  # To remove Chartmuseum setup completely
helm delete -n onap dev-dcaegen2-services  # To remove TCAGen2 services
helm delete -n onap dev-dcaemod # To undeploy DCAEMOD

# USE DELETE METHOD ON CHARTMUSEUM TO REMOVE ANY SPECIFIC CHART PACKAGE - example below
curl -X DELETE http://10.12.5.9:30192/api/charts/dcae-ves-collector/1.10.1 -u onapinitializer:demo123456!
curl -X DELETE http://10.12.5.9:30192/api/charts/dcae-tcagen2/1.3.1 -u onapinitializer:demo123456!

Remove also any persistence directory from /dockerdata-nfs/onap/ associated to chartmuseum and dcaemod