Integrate the Application with Notification Client Sidecar¶
About this task
This section provides an example of kubernetes deployment of the sidecar and a simulated application. The user application must support querying and handling responses for either of the API definitions available at:
See:
The integration between the application is done with the use of a Sidecar. The Sidecar runs as a container along with the application in the same pod. The application and the Sidecar communicate via a REST API. See the figure below.
To use the v1 API, deploy starlingx/notificationclient-base:stx.5.0-v1.0.4
as the sidecar container.
To use the v2 API, deploy starlingx/notificationclient-base:stx.11.0-v2.3.3
as the sidecar container.
Prerequisites
The following prerequisites are required before the integration:
The cloud is configured with a node that supports the Subordinate mode (Secondary mode).
The cloud is labeled with ptp-registration=true, and ptp-notification=true.
The ptp-notification-armada-app application is installed successfully.
The application supports the PTP Notifications API.
The config provided below is for illustrative purposes and is not validated. A suitable user-supplied container would have to be run in the same pod and configured to make API calls to the notificationclient-base container.
Note
The following example is for ptp-notification
v2 API. To integrate with
ptp-notification
v1 API, change the image from
starlingx/notificationclient-base:stx.11.0-v2.3.3
to
starlingx/notificationclient-base:stx.5.0-v1.0.4
.
Note
If the rabbitmq username and password values were modified as per “Change
default rabbitmq credentials”, then the values for REGISTRATION_USER,
REGISTRATION_PASS, NOTIFICATIONSERVICE_USER and NOTIFICATIONSERVICE_PASS below
need to be changed to match when integrating with ptp-notification
.
apiVersion: apps/v1
kind: Deployment
metadata:
name: ptp-notification-example
namespace: ptpexample
spec:
replicas: 1
selector:
matchLabels:
app: ptp-notification-example
template:
metadata:
namespace: ptpexample
labels:
app: ptp-notification-example
release: RELEASE-NAME
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: ptp-notification
operator: In
values:
- "true"
containers:
- name: ptp-notification-demo-sidecar
image: "starlingx/notificationclient-base:stx.11.0-v2.3.3"
imagePullPolicy: IfNotPresent
tty: true
stdin: true
livenessProbe:
exec:
command:
- curl
- http://127.0.0.1:8080/health
failureThreshold: 3
initialDelaySeconds: 30
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 5
env:
- name: THIS_NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: THIS_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: REGISTRATION_HOST
value: "registration.notification.svc.cluster.local"
- name: REGISTRATION_USER
value: "admin"
- name: REGISTRATION_PASS
value: "admin"
- name: REGISTRATION_PORT
value: "5672"
- name: NOTIFICATIONSERVICE_USER
value: "admin"
- name: NOTIFICATIONSERVICE_PASS
value: "admin"
- name: NOTIFICATIONSERVICE_PORT
value: "5672"
- name: SIDECAR_API_PORT
value: "8080"
- name: DATASTORE_PATH
value: "/opt/datastore"
- name: LOGGING_LEVEL
value: "INFO"
command: ["/bin/bash", "/mnt/sidecar_start.sh"]
volumeMounts:
- name: scripts
mountPath: /mnt
- name: data-volume
mountPath: /opt/datastore
resources:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 300m
memory: 256Mi
imagePullSecrets:
- name: admin-registry-secret
Example API Calls¶
Below are examples of using curl to interact with the ptp-notification
API.
These can be used to validate the functionality of the application deployment.
Note
Some versions of curl have been seen to automatically normalize URLs which results in malformed requests to the server by removing parts of the URL containing ‘/././’ or ‘/./’
If the version of curl being used supports the flag ‘–path-as-is’ then it should be included in the command to avoid this behaviour.
v1 Examples
# pull
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v1/PTP/CurrentState |
python -m json.tool
# subscribe
curl --path-as-is -v -d '{"ResourceType": "PTP", "ResourceQualifier":
{"NodeName":"controller-0"}, "EndpointUri": "http://127.0.0.1:9090/v1/resource_status/ptp"}'
-H 'Content-Type: application/json' -X POST http://127.0.0.1:8080/ocloudNotifications/v1/subscriptions
|python -m json.tool
curl --path-as-is -v -d '{"ResourceType": "PTP", "ResourceQualifier":
{"NodeName":"controller-1"}, "EndpointUri": "http://127.0.0.1:9090/v1/resource_status/ptp"}'
-H 'Content-Type: application/json' -X POST http://127.0.0.1:8080/ocloudNotifications/v1/subscriptions
|python -m json.tool
# get subscriptions
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v1/subscriptions |python -m json.tool
# get one subscription
# must supply the subscription ID found in "get subscriptions"
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v1/subscriptions/<subscription id> |
python -m json.tool
# unsubscribe
# must supply the subscription ID found in "get subscriptions"
curl --path-as-is -X DELETE -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v1/subscriptions/df71709c-9fff-11ec-bf54-6aa223637e5f
v2 Examples
Some commands can target the status of specific node names or of specific ptp4l
instances. The names in the format <name> will vary depending on the user’s
environment.
The “| python -m json.tool” portion of the command is just for output formatting and is not required for operation.
Requests with the “/././” path with be automatically directed to the
ptp-notification
server on the local node, while providing “/./<node name>”
will route to the specified node
## pull
# overall
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/././sync/sync-status/sync-state/CurrentState |
python -m json.tool
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/./<node name>/sync/sync-status/sync-state/CurrentState |
python -m json.tool
# ptp state
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/././sync/ptp-status/lock-state/CurrentState |
python -m json.tool
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/./<node name>/sync/ptp-status/lock-state/CurrentState |
python -m json.tool
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/./<node name>/<ptp instance name>/sync/ptp-status/lock-state/CurrentState |
python -m json.tool
# ptp class
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/././sync/ptp-status/clock-class/CurrentState |
python -m json.tool
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/./<node name>/sync/ptp-status/clock-class/CurrentState |
python -m json.tool
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/./<node name>/<ptp instance name>/sync/ptp-status/clock-class/CurrentState |
python -m json.tool
# phc2sys / os clock state
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/././sync/sync-status/os-clock-sync-state/CurrentState |
python -m json.tool
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/./<node name>/sync/sync-status/os-clock-sync-state/CurrentState |
python -m json.tool
# gnss
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/././sync/gnss-status/gnss-sync-status/CurrentState |
python -m json.tool
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:8080/ocloudNotifications/v2/./<node name>/sync/gnss-status/gnss-sync-status/CurrentState |
python -m json.tool
## subscribe
# subscribe overall
curl --path-as-is -v -d '{"ResourceAddress": "/././sync/sync-status/sync-state", "EndpointUri":
"http://127.0.0.1:9090/v2/resource_status/ptp"}' -H 'Content-Type: application/json' -X POST
http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
curl --path-as-is -v -d '{"ResourceAddress": "/./<node name>/sync/sync-status/sync-state",
"EndpointUri": "http://127.0.0.1:9090/v2/resource_status/ptp"}' -H 'Content-Type:
application/json' -X POST http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
# subscribe PTP lock state
curl --path-as-is -v -d '{"ResourceAddress": "/././sync/ptp-status/lock-state",
"EndpointUri": "http://127.0.0.1:9090/v2/resource_status/ptp"}' -H 'Content-Type: application/json'
-X POST http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
curl --path-as-is -v -d '{"ResourceAddress": "/./<node name>/sync/ptp-status/lock-state",
"EndpointUri": "http://127.0.0.1:9090/v2/resource_status/ptp"}' -H 'Content-Type: application/json'
-X POST http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
# subscribe PTP clock class
curl --path-as-is -v -d '{"ResourceAddress": "/././sync/ptp-status/clock-class",
"EndpointUri": "http://127.0.0.1:9090/v2/resource_status/ptp"}'
-H 'Content-Type: application/json' -X POST
http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
curl --path-as-is -v -d '{"ResourceAddress": "/./<node name>/sync/ptp-status/clock-class",
"EndpointUri": "http://127.0.0.1:9090/v2/resource_status/ptp"}' -H 'Content-Type: application/json'
-X POST http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
# subscribe Os clock
curl --path-as-is -v -d '{"ResourceAddress": "/././sync/sync-status/os-clock-sync-state",
"EndpointUri": "http://127.0.0.1:9090/v2/resource_status/ptp"}' -H 'Content-Type:
application/json' -X POST http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
curl --path-as-is -v -d '{"ResourceAddress": "/./<node name>/sync/sync-status/os-clock-sync-state",
"EndpointUri": "http://127.0.0.1:9090/v2/resource_status/ptp"}' -H 'Content-Type: application/json'
-X POST http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
# subscribe gnss
curl --path-as-is -v -d '{"ResourceAddress": "/././sync/gnss-status/gnss-sync-status",
"EndpointUri": "http://127.0.0.1:9090/v2/resource_status/ptp"}' -H 'Content-Type: application/json'
-X POST http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
curl --path-as-is -v -d '{"ResourceAddress": "/./<node name>/sync/gnss-status/gnss-sync-status",
"EndpointUri": "http://127.0.0.1:9090/v2/resource_status/ptp"}' -H 'Content-Type:
application/json' -X POST
http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
## List subscriptions
curl --path-as-is -v -H 'Content-Type: application/json'
http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions |
python -m json.tool
# unsubscribe
curl --path-as-is -X DELETE -v -H 'Content-Type: application/json'
http://127.0.0.1:${SIDECAR_API_PORT}/ocloudNotifications/v2/subscriptions/b3862aa2-3499-11ed-a5b5-522422c3cf7d
