...
- CPS-1065 Spike: CM data notifications from NCMP to applications including subscriptions Skip to end of metadata
- Related JIRA: CPS-1496 Model Subscription status
Assumptions
Issues & Decisions
# | Issue | Notes | Decisions | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | What dataspace and anchor to use? | Dataspace: NCMP- | AdminAdmin Anchor: AVC-Subscriptions | |||||||||
2 | How do we load the data ( not using cps-core / not using Liquibase )? | Options
| Need to discuss with stakeholders re. Priority and Cost Tony: Preference over native SQL in an init container | |||||||||
3 | Predicate details are unclear at the moment. Which component(s) processes the predicates?! Device, DMI-Plugin and or NCMP |
| Contact kieran mccarthy to clarify this (Tony assumed predicates were NOT for NCMP) kieran mccarthy confirmed that predicates is not to be included in the data infromation to be stored, hence not part of the YANG model to be defined. |
Background
NCMP wil need to store which subscriptions are current for each cm-handle
- Dataspace: NCMP-Admin (existing)
- Anchor: AVC-Subscriptions (new)
- Top level list Container?! (if need wrap in a top-level container)
- CONTAINER: subscription-registry
- LIST: subscription[@clientId=AppB and @name=mySubscription]
- LEAF: clientId (leaf)
- LEAF: name
- LEAF: topic
- LEAF: isTagged
- LIST: subscription[@clientId=AppB and @name=mySubscription]
- CONTAINER: subscription-registry
...
The following yang model will be used to store the payload information of subscription data
Previous Update:
Latest Update:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
module subscription {
yang-version 1.1;
namespace "org:onap:ncmp:subscription";
prefix subs;
revision "2022-10-12" {
description
"NCMP subscription model";
}
container subscription-registry {
list subscription {
key "clientID clientName";
leaf clientID {
type string;
}
leaf clientName {
type string;
}
leaf topic {
type string;
}
leaf isTagged {
type boolean;
}
container predicates {
leaf-list targets {
type string;
}
leaf datastore {
type string;
}
}
list respondedCmHandle {
key "cmHandleId status";
leaf cmHandleId {
type string;
}
leaf status {
type string;
}
}
}
}
} |
Note:
leaf-list dmi-service-names : added as part of
Jira | ||||||
---|---|---|---|---|---|---|
|
Onboarding via docker container
Starting CPS requires running the project via a docker-compose file wherein the following services/containers are set up:
- postgres database
- cps-and-ncmp
- zookeeper
- kafka
- ncmp-dmi-plugin
Adding a new container 'init-db' to run a script file that calls psql (postgres) and curl commands to upload the new YANG model:
- docker-compose configuration of 'init-db' service
Code Block |
---|
init-db:
build: ./initfile
environment:
POSTGRES_USER: ${DB_USERNAME:-cps}
POSTGRES_PASSWORD: ${DB_PASSWORD:-cps}
volumes:
- ./initfile:/docker-entrypoint-initdb.d/
- ./model:/model/
depends_on:
db:
condition: service_healthy
cps-and-ncmp:
condition: service_started |
- build - creates from the Dockerfile created which is based on postgres and added curl
- environment - mandatory config values for postgres image; added same config values as the main Postgres DB used by cps
- volumes : folders located inside cps project's docker-compose folder
- -initfile: contains the bash script and Dockerfile; mounted on ENTRYPOINT
-POC: 'initprojecct.sh'
Code Block | ||||
---|---|---|---|---|
| ||||
#!/bin/bash
true=t
echo "Getting ready to upload model for subscription events"
while :
do
sleep 30
echo "Checking that NCMP dataspace and anchor exist ..."
ncmpDataspaceExists=$(psql -h db -d cpsdb -U cps -t -c "SELECT EXISTS (SELECT FROM public.dataspace WHERE name = 'NCMP-Admin');")
ncmpAnchorExists=$(psql -h db -d cpsdb -U cps -t -c "SELECT EXISTS (SELECT FROM public.anchor WHERE name = 'ncmp-dmi-registry');")
echo "NCMP dataspace exist: $ncmpDataspaceExists"
echo "NCMP anchor exist: $ncmpAnchorExists"
echo "$ncmpDataspaceExists == $true and $ncmpAnchorExists == $true"
if [ $ncmpDataspaceExists == $true ] && [ $ncmpAnchorExists == $true ]
then
echo "Uploading model ..."
cpsAndNcmpAsHostAddress=$(ping -c1 cps-and-ncmp | sed -nE 's/^PING[^(]+\(([^)]+)\).*/\1/p')
curl -X 'POST' -i 'http://'"$cpsAndNcmpAsHostAddress"':8080/cps/api/v2/dataspaces?dataspace-name=my-dataspace' -H 'accept: */*' --header 'Authorization: Basic Y3BzdXNlcjpjcHNyMGNrcyE='
curl -X 'POST' 'http://'"$cpsAndNcmpAsHostAddress"':8080/cps/api/v2/dataspaces/my-dataspace/schema-sets?schema-set-name=my-schema-set' -H 'accept: */*' --form "file=@"/model/subscription.yang"" --header 'Authorization: Basic Y3BzdXNlcjpjcHNyMGNrcyE='
curl -X 'POST' 'http://'"$cpsAndNcmpAsHostAddress"':8080/cps/api/v2/dataspaces/my-dataspace/anchors?schema-set-name=my-schema-set&anchor-name=my-anchor' -H 'accept: */*' --header 'Authorization: Basic Y3BzdXNlcjpjcHNyMGNrcyE='
echo "Model upload finish ..."
break
fi
sleep 10 &
echo $!
echo $?
done |
- line 3: psql returns 't' for true
- line 6: while loop used to re try uploading the model whenever the dataspace and anchor is ready
- line 8: sleep for number of seconds to allow the liquibase set up of the database via cps-and-ncmp container
- line 10-11: postgres commands to confirm that the needed dataspace and anchor exists (for this POC case subscription model requires the 'NCMP-Admin' dataspace and 'ncmp-dmi-registry' anchor)
- line 17: if condition specifies to only upload the model if dataspace and anchor exists
- line 21: command to get the IP address of 'cps-and-ncmp' docker container via ping's output manipulation and store in a variable; this variable is used in call of curl
- line 23-25: curl 'POST' commands to create dataspace, anchor and upload schemaset
- - model: contains the subscription model
- depends_on:
- -db: healthcheck is added on the db container/service which leaves seconds after the database has started
- -cps-and-ncmp: service should be started before init-db container is brought up
-
- Service/Container 'init-db' is built from a customised image supported by a Dockerfile containing the following:
Image from Dockerfile is based from postgres image and added 'curl'
Code Block # syntax=docker/dockerfile:1 FROM postgres:14.1-alpine RUN apk --no-cache add curl
- Service/Container 'init-db' is built from a customised image supported by a Dockerfile containing the following:
POC: init-db container log output
Onboarding via JAVA / Spring boot