+################################################################################
+# Copyright (c) 2020 AT&T Intellectual Property. #
+# #
+# Licensed under the Apache License, Version 2.0 (the "License"); #
+# you may not use this file except in compliance with the License. #
+# You may obtain a copy of the License at #
+# #
+# http://www.apache.org/licenses/LICENSE-2.0 #
+# #
+# Unless required by applicable law or agreed to in writing, software #
+# distributed under the License is distributed on an "AS IS" BASIS, #
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
+# See the License for the specific language governing permissions and #
+# limitations under the License. #
+################################################################################
+
+schema_file = {
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "http://example.com/root.json",
+ "type": "object",
+ "title": "The Root Schema",
+ "required": [
+ "local",
+ "logger",
+ "rmr",
+ "db",
+ "controls",
+ "metrics"
+ ],
+ "properties": {
+ "local": {
+ "$id": "#/properties/local",
+ "type": "object",
+ "title": "The Local Schema",
+ "required": [
+ "host"
+ ],
+ "properties": {
+ "host": {
+ "$id": "#/properties/local/properties/host",
+ "type": "string",
+ "title": "The Host Schema",
+ "default": "",
+ "examples": [
+ ":8080"
+ ],
+ "pattern": "^(.*)$"
+ }
+ }
+ },
+ "logger": {
+ "$id": "#/properties/logger",
+ "type": "object",
+ "title": "The Logger Schema",
+ "required": [
+ "level"
+ ],
+ "properties": {
+ "level": {
+ "$id": "#/properties/logger/properties/level",
+ "type": "integer",
+ "title": "The Level Schema",
+ "default": 0,
+ "examples": [
+ 3
+ ]
+ }
+ }
+ },
+ "rmr": {
+ "$id": "#/properties/rmr",
+ "type": "object",
+ "title": "The Rmr Schema",
+ "required": [
+ "protPort",
+ "maxSize",
+ "numWorkers",
+ "rxMessages",
+ "txMessages"
+ ],
+ "properties": {
+ "protPort": {
+ "$id": "#/properties/rmr/properties/protPort",
+ "type": "string",
+ "title": "The Protport Schema",
+ "default": "",
+ "examples": [
+ "tcp:4560"
+ ],
+ "pattern": "^(.*)$"
+ },
+ "maxSize": {
+ "$id": "#/properties/rmr/properties/maxSize",
+ "type": "integer",
+ "title": "The Maxsize Schema",
+ "default": 0,
+ "examples": [
+ 2072
+ ]
+ },
+ "numWorkers": {
+ "$id": "#/properties/rmr/properties/numWorkers",
+ "type": "integer",
+ "title": "The Numworkers Schema",
+ "default": 0,
+ "examples": [
+ 1
+ ]
+ },
+ "rxMessages": {
+ "$id": "#/properties/rmr/properties/rxMessages",
+ "type": "array",
+ "title": "The Rxmessages Schema",
+ "items": {
+ "$id": "#/properties/rmr/properties/rxMessages/items",
+ "type": "string",
+ "title": "The Items Schema",
+ "default": "",
+ "examples": [
+ "RIC_SUB_RESP",
+ "RIC_SUB_FAILURE",
+ "RIC_SUB_DEL_RESP",
+ "RIC_SUB_DEL_FAILURE",
+ "RIC_INDICATION"
+ ],
+ "pattern": "^(.*)$"
+ }
+ },
+ "txMessages": {
+ "$id": "#/properties/rmr/properties/txMessages",
+ "type": "array",
+ "title": "The Txmessages Schema",
+ "items": {
+ "$id": "#/properties/rmr/properties/txMessages/items",
+ "type": "string",
+ "title": "The Items Schema",
+ "default": "",
+ "examples": [
+ "RIC_SUB_REQ",
+ "RIC_SUB_DEL_REQ",
+ "RIC_SGNB_ADDITION_REQ",
+ "RIC_SGNB_ADDITION_ACK",
+ "RIC_SGNB_ADDITION_REJECT",
+ "RIC_SGNB_MOD_REQUEST",
+ "RIC_SGNB_MOD_REQUEST_ACK",
+ "RIC_SGNB_MOD_REQUEST_REJECT",
+ "RIC_SGNB_MOD_REQUIRED",
+ "RIC_SGNB_MOD_CONFIRM",
+ "RIC_SGNB_MOD_REFUSE",
+ "RIC_SGNB_RECONF_COMPLETE",
+ "RIC_SGNB_RELEASE_REQUEST",
+ "RIC_SGNB_RELEASE_CONFIRM",
+ "RIC_SGNB_RELEASE_REQUIRED",
+ "RIC_SGNB_RELEASE_REQUEST_ACK",
+ "RIC_SECONDARY_RAT_DATA_USAGE_REPORT",
+ "RIC_SN_STATUS_TRANSFER",
+ "RIC_RRC_TRANSFER",
+ "RIC_UE_CONTEXT_RELEASE"
+ ],
+ "pattern": "^(.*)$"
+ }
+ }
+ }
+ },
+ "db": {
+ "$id": "#/properties/db",
+ "type": "object",
+ "title": "The Db Schema",
+ "required": [
+ "host",
+ "port",
+ "namespaces"
+ ],
+ "properties": {
+ "host": {
+ "$id": "#/properties/db/properties/host",
+ "type": "string",
+ "title": "The Host Schema",
+ "default": "",
+ "examples": [
+ "localhost"
+ ],
+ "pattern": "^(.*)$"
+ },
+ "port": {
+ "$id": "#/properties/db/properties/port",
+ "type": "integer",
+ "title": "The Port Schema",
+ "default": 0,
+ "examples": [
+ 6379
+ ]
+ },
+ "namespaces": {
+ "$id": "#/properties/db/properties/namespaces",
+ "type": "array",
+ "title": "The Namespaces Schema",
+ "items": {
+ "$id": "#/properties/db/properties/namespaces/items",
+ "type": "string",
+ "title": "The Items Schema",
+ "default": "",
+ "examples": [
+ "sdl",
+ "rnib"
+ ],
+ "pattern": "^(.*)$"
+ }
+ }
+ }
+ },
+ "controls": {
+ "$id": "#/properties/controls",
+ "type": "object",
+ "title": "The Controls Schema",
+ "required": [
+ "active",
+ "requestorId",
+ "ranFunctionId",
+ "ricActionId",
+ "interfaceId"
+ ],
+ "properties": {
+ "active": {
+ "$id": "#/properties/controls/properties/active",
+ "type": "boolean",
+ "title": "The Active Schema",
+ "default": False,
+ "examples": [
+ True
+ ]
+ },
+ "requestorId": {
+ "$id": "#/properties/controls/properties/requestorId",
+ "type": "integer",
+ "title": "The Requestorid Schema",
+ "default": 0,
+ "examples": [
+ 66
+ ]
+ },
+ "ranFunctionId": {
+ "$id": "#/properties/controls/properties/ranFunctionId",
+ "type": "integer",
+ "title": "The Ranfunctionid Schema",
+ "default": 0,
+ "examples": [
+ 1
+ ]
+ },
+ "ricActionId": {
+ "$id": "#/properties/controls/properties/ricActionId",
+ "type": "integer",
+ "title": "The Ricactionid Schema",
+ "default": 0,
+ "examples": [
+ 0
+ ]
+ },
+ "interfaceId": {
+ "$id": "#/properties/controls/properties/interfaceId",
+ "type": "object",
+ "title": "The Interfaceid Schema",
+ "required": [
+ "globalENBId"
+ ],
+ "properties": {
+ "globalENBId": {
+ "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId",
+ "type": "object",
+ "title": "The Globalenbid Schema",
+ "required": [
+ "plmnId",
+ "eNBId"
+ ],
+ "properties": {
+ "plmnId": {
+ "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/plmnId",
+ "type": "string",
+ "title": "The Plmnid Schema",
+ "default": "",
+ "examples": [
+ "310150"
+ ],
+ "pattern": "^(.*)$"
+ },
+ "eNBId": {
+ "$id": "#/properties/controls/properties/interfaceId/properties/globalENBId/properties/eNBId",
+ "type": "integer",
+ "title": "The Enbid Schema",
+ "default": 0,
+ "examples": [
+ 202251
+ ]
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "metrics": {
+ "$id": "#/properties/metrics",
+ "type": "array",
+ "title": "The Metrics Schema",
+ "items": {
+ "$id": "#/properties/metrics/items",
+ "type": "object",
+ "title": "The Items Schema",
+ "required": [
+ "objectName",
+ "objectInstance",
+ "name",
+ "type",
+ "description"
+ ],
+ "properties": {
+ "objectName": {
+ "$id": "#/properties/metrics/items/properties/objectName",
+ "type": "string",
+ "title": "The Objectname Schema",
+ "default": "",
+ "examples": [
+ "UEEventStreamingCounters"
+ ],
+ "pattern": "^(.*)$"
+ },
+ "objectInstance": {
+ "$id": "#/properties/metrics/items/properties/objectInstance",
+ "type": "string",
+ "title": "The Objectinstance Schema",
+ "default": "",
+ "examples": [
+ "SgNBAdditionRequest"
+ ],
+ "pattern": "^(.*)$"
+ },
+ "name": {
+ "$id": "#/properties/metrics/items/properties/name",
+ "type": "string",
+ "title": "The Name Schema",
+ "default": "",
+ "examples": [
+ "SgNBAdditionRequest"
+ ],
+ "pattern": "^(.*)$"
+ },
+ "type": {
+ "$id": "#/properties/metrics/items/properties/type",
+ "type": "string",
+ "title": "The Type Schema",
+ "default": "",
+ "examples": [
+ "counter"
+ ],
+ "pattern": "^(.*)$"
+ },
+ "description": {
+ "$id": "#/properties/metrics/items/properties/description",
+ "type": "string",
+ "title": "The Description Schema",
+ "default": "",
+ "examples": [
+ "The total number of SG addition request events processed"
+ ],
+ "pattern": "^(.*)$"
+ }
+ }
+ }
+ }
+ }
+}
+
+config_file = {
+ "xapp_name": "test_xapp",
+ "version": "1.0.0",
+ "containers": [{
+ "name": "test1",
+ "image": {
+ "registry": "test_repo",
+ "name": "test_name",
+ "tag": "test_tag"
+ },
+ "command": "test command"
+ },
+ {
+ "name": "test2",
+ "image": {
+ "registry": "test2_repo",
+ "name": "test2_name",
+ "tag": "test2:_tag"
+ },
+ "command": "test2 command"
+ }],
+ "local": {
+ "host": ":8080"
+ },
+ "logger": {
+ "level": 3
+ },
+ "db": {
+ "host": "localhost",
+ "port": 6379,
+ "namespaces": ["sdl", "rnib"]
+ },
+ "controls": {
+ "active": True,
+ "requestorId": 66,
+ "ranFunctionId": 1,
+ "ricActionId": 0,
+ "interfaceId": {
+ "globalENBId": {
+ "plmnId": "310150",
+ "eNBId": 202251
+ }
+ }
+ },
+ "rmr": {
+ "protPort": "tcp:4560",
+ "maxSize": 10000,
+ "numWorkers": 1,
+ "rxMessages": [
+ "RIC_SUB_RESP",
+ "RIC_SUB_FAILURE",
+ "RIC_SUB_DEL_RESP",
+ "RIC_SUB_DEL_FAILURE",
+ "RIC_INDICATION"
+ ],
+ "txMessages": [
+ "RIC_SUB_REQ",
+ "RIC_SUB_DEL_REQ",
+ "RIC_SGNB_ADDITION_REQ",
+ "RIC_SGNB_ADDITION_ACK",
+ "RIC_SGNB_ADDITION_REJECT",
+ "RIC_SGNB_MOD_REQUEST",
+ "RIC_SGNB_MOD_REQUEST_ACK",
+ "RIC_SGNB_MOD_REQUEST_REJECT",
+ "RIC_SGNB_MOD_REQUIRED",
+ "RIC_SGNB_MOD_CONFIRM",
+ "RIC_SGNB_MOD_REFUSE",
+ "RIC_SGNB_RELEASE_REQUEST",
+ "RIC_SGNB_RELEASE_CONFIRM",
+ "RIC_SGNB_RELEASE_REQUIRED",
+ "RIC_SGNB_RELEASE_REQUEST_ACK",
+ "RIC_SGNB_RECONF_COMPLETE",
+ "RIC_UE_CONTEXT_RELEASE",
+ "RIC_RRC_TRANSFER",
+ "RIC_SECONDARY_RAT_DATA_USAGE_REPORT",
+ "RIC_SN_STATUS_TRANSFER"
+ ]
+ },
+ "metrics": [
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBAdditionRequest",
+ "name": "SgNBAdditionRequest",
+ "type": "counter",
+ "description": "The total number of SG addition request events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBAdditionRequestAcknowledge",
+ "name": "SgNBAdditionRequestAcknowledge",
+ "type": "counter",
+ "description": "The total number of SG addition request acknowledge events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBAdditionRequestReject",
+ "name": "SgNBAdditionRequestReject",
+ "type": "counter",
+ "description": "The total number of SG addition request reject events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBModificationRequest",
+ "name": "SgNBModificationRequest",
+ "type": "counter",
+ "description": "The total number of SG modification request events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBModificationRequestAcknowledge",
+ "name": "SgNBModificationRequestAcknowledge",
+ "type": "counter",
+ "description": "The total number of SG modification request acknowledge events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBModificationRequestReject",
+ "name": "SgNBModificationRequestReject",
+ "type": "counter",
+ "description": "The total number of SG modification request reject events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBModificationRequired",
+ "name": "SgNBModificationRequired",
+ "type": "counter",
+ "description": "The total number of SG modification required events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBModificationConfirm",
+ "name": "SgNBModificationConfirm",
+ "type": "counter",
+ "description": "The total number of SG modification confirm events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBModificationRefuse",
+ "name": "SgNBModificationRefuse",
+ "type": "counter",
+ "description": "The total number of SG modification refuse events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBReleaseRequest",
+ "name": "SgNBReleaseRequest",
+ "type": "counter",
+ "description": "The total number of SG release request events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBReleaseRequestAcknowledge",
+ "name": "SgNBReleaseRequestAcknowledge",
+ "type": "counter",
+ "description": "The total number of SG release request acknowledge events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBReleaseRequestReject",
+ "name": "SgNBReleaseRequestReject",
+ "type": "counter",
+ "description": "The total number of SG release request reject events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBReleaseRequired",
+ "name": "SgNBReleaseRequired",
+ "type": "counter",
+ "description": "The total number of SG release required events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBReleasenConfirm",
+ "name": "SgNBReleasenConfirm",
+ "type": "counter",
+ "description": "The total number of SG release confirm events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SgNBReconfigurationComplete",
+ "name": "SgNBReconfigurationComplete",
+ "type": "counter",
+ "description": "The total number of SG reconfiguration complete events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "UEContextRelease",
+ "name": "UEContextRelease",
+ "type": "counter",
+ "description": "The total number of SG UE context release events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "RRCTransfer",
+ "name": "RRCTransfer",
+ "type": "counter",
+ "description": "The total number of SG RRC transfers events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SNStatusTransfer",
+ "name": "SNStatusTransfer",
+ "type": "counter",
+ "description": "The total number of SG SN status transfers events processed"
+ },
+ {
+ "objectName": "UEEventStreamingCounters",
+ "objectInstance": "SecondaryRATDataUsageReport",
+ "name": "SecondaryRATDataUsageReport",
+ "type": "counter",
+ "description": "The total number of SG secondary RAT data usage reports events processed"
+ },
+ {
+ "objectName": "RMRCounters",
+ "objectInstance": "Transmitted",
+ "name": "Transmitted",
+ "type": "counter",
+ "description": "The total number of RMR messages transmited"
+ },
+ {
+ "objectName": "RMRCounters",
+ "objectInstance": "Received",
+ "name": "Received",
+ "type": "counter",
+ "description": "The total number of RMR messages received"
+ },
+ {
+ "objectName": "RMRCounters",
+ "objectInstance": "TransmitError",
+ "name": "TransmitError",
+ "type": "counter",
+ "description": "The total number of RMR messages transmission errors"
+ },
+ {
+ "objectName": "RMRCounters",
+ "objectInstance": "ReceiveError",
+ "name": "ReceiveError",
+ "type": "counter",
+ "description": "The total number of RMR messages receive errors"
+ },
+ {
+ "objectName": "SDLounters",
+ "objectInstance": "Stored",
+ "name": "Stored",
+ "type": "counter",
+ "description": "The total number of stored SDL transactions"
+ },
+ {
+ "objectName": "SDLounters",
+ "objectInstance": "StoreError",
+ "name": "StoreError",
+ "type": "counter",
+ "description": "The total number of SDL store errors"
+ }
+ ]
+}
+
+mock_json_body_url = {
+ 'config-file.json_url': 'http://0.0.0.0:8080/config-file.json',
+ 'schema.json_url': 'http://0.0.0.0:8080/schema.json'
+}
+
+mock_json_body = {
+ "config-file.json": config_file,
+ "schema.json": schema_file
+}
+
+helm_repo_index_response={'apiVersion': 'v1',
+ 'entries':{
+ 'test_xapp':[{
+ 'apiVersion': 'v1',
+ 'appVersion': '1.0',
+ 'created': '2020-03-12T19:10:17.178396719Z',
+ 'description': 'test xApp Helm Chart',
+ 'digest': 'd77dfb3f008e5174e90d79bfe982ef85b5dc5930141f6a1bd9995b2fa35',
+ 'name': 'test_xapp',
+ 'urls':['charts/test-1.0.0.tgz'],
+ 'version': '1.0.0'
+ }]
+ },
+ 'generated': '2020-03-16T16:54:44Z',
+ 'serverInfo':{}
+ }