
Several improvements and fixes to enable the end-to-end functionality of all of the components in support of the O-RAN Spec Compliant Timing API Notification work. 1. Add time stamps to logging for notificationservice and notificationclient 2. Add support for the "optional" hierarchy in the resource address which allows the client to query the status of a specific ptp instances. ie. get the status of instance ptp1 rather than all ptp instances 3. Add a parent key to the returned notification data so that multiple statuses can be returned to the client with a single notification' 4. Reworked the notificationservice daemonset to start its process directly rather than using an intermediary script. This allows the container logs to show properly via kubectl logs and will also allow the container to crash properly if the program errors out. 5. Reworked the helm values for ptp4l and ts2phc instances to allow users to supply overrides with multiple instances Test plan: PASS: PTP notification v1 compatibility PASS: GET all v2 resources PASS: SUBSCRIBE/LIST/DELETE v2 resources PASS: Build and deploy containers/fluxcd app Story: 2010056 Task: 46226 Change-Id: Id471fdc0815afdcc5639e81c6457616e268e6cd7 Signed-off-by: Cole Walker <cole.walker@windriver.com>
78 lines
3.0 KiB
Python
78 lines
3.0 KiB
Python
#
|
|
# Copyright (c) 2022 Wind River Systems, Inc.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
from pecan import expose, redirect, rest, route, response, abort
|
|
from webob.exc import HTTPException, HTTPNotFound, HTTPBadRequest, HTTPClientError, HTTPServerError
|
|
|
|
from wsme import types as wtypes
|
|
from wsmeext.pecan import wsexpose
|
|
|
|
from datetime import datetime, timezone
|
|
import os
|
|
import logging
|
|
import oslo_messaging
|
|
|
|
from notificationclientsdk.common.helpers import constants
|
|
from notificationclientsdk.common.helpers import subscription_helper
|
|
from notificationclientsdk.services.ptp import PtpService
|
|
from notificationclientsdk.exception import client_exception
|
|
|
|
from sidecar.repository.notification_control import notification_control
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
from notificationclientsdk.common.helpers import log_helper
|
|
log_helper.config_logger(LOG)
|
|
|
|
THIS_NODE_NAME = os.environ.get("THIS_NODE_NAME",'controller-0')
|
|
|
|
class ResourceAddressController(object):
|
|
def __init__(self, resource_address):
|
|
self.resource_address = resource_address
|
|
|
|
@expose('json')
|
|
def CurrentState(self):
|
|
try:
|
|
# validate resource address
|
|
_, nodename, resource, optional, self.resource_address = subscription_helper.\
|
|
parse_resource_address(self.resource_address)
|
|
if nodename != THIS_NODE_NAME and nodename != '.':
|
|
LOG.warning("Node {} is not available".format(nodename))
|
|
abort(404)
|
|
if resource not in constants.VALID_SOURCE_URI:
|
|
LOG.warning("Resource {} is not valid".format(resource))
|
|
abort(404)
|
|
ptpservice = PtpService(notification_control)
|
|
ptpstatus = ptpservice.query(THIS_NODE_NAME, self.resource_address, optional)
|
|
# Change time from float to ascii format
|
|
# ptpstatus['time'] = time.strftime('%Y-%m-%dT%H:%M:%SZ',
|
|
# time.gmtime(ptpstatus['time']))
|
|
for item in ptpstatus:
|
|
ptpstatus[item]['time'] = datetime.fromtimestamp(ptpstatus[item]['time']).\
|
|
strftime('%Y-%m-%dT%H:%M:%S%fZ')
|
|
return ptpstatus
|
|
except client_exception.NodeNotAvailable as ex:
|
|
LOG.warning("Node is not available:{0}".format(str(ex)))
|
|
abort(404)
|
|
except client_exception.ResourceNotAvailable as ex:
|
|
LOG.warning("Resource is not available:{0}".format(str(ex)))
|
|
abort(404)
|
|
except oslo_messaging.exceptions.MessagingTimeout as ex:
|
|
LOG.warning("Resource is not reachable:{0}".format(str(ex)))
|
|
abort(404)
|
|
except HTTPException as ex:
|
|
LOG.warning("Client side error:{0},{1}".format(type(ex), str(ex)))
|
|
# raise ex
|
|
abort(400)
|
|
except HTTPServerError as ex:
|
|
LOG.error("Server side error:{0},{1}".format(type(ex), str(ex)))
|
|
# raise ex
|
|
abort(500)
|
|
except Exception as ex:
|
|
LOG.error("Exception:{0}@{1}".format(type(ex),str(ex)))
|
|
abort(500)
|
|
|