RIC Dashboard Release Notes
===========================
-Version 1.0.3, 20 May 2019
+Version 1.0.3, 21 May 2019
--------------------------
* Add AC xapp controller
* Add RAN type radio selector to connection setup
* Update ANR xApp client to spec version 0.0.5
* Update E2 manager client to spec version 20190515
+* Update xApp manager client to spec version 0.1.3
* Add get-version methods to all controllers
* Add simple page footer with copyright and version
* Add AC and ANR xApp services
<dependency>
<groupId>org.o-ran-sc.ric.xappmgr.client</groupId>
<artifactId>xapp-mgr-client</artifactId>
- <version>0.1.2-SNAPSHOT</version>
+ <version>0.1.3-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
when(mockApi.getApiClient()).thenReturn(mockClient);
doAnswer(i -> {
return null;
- }).when(mockApi).getHealth();
+ }).when(mockApi).getHealthAlive();
+ doAnswer(i -> {
+ return null;
+ }).when(mockApi).getHealthReady();
return mockApi;
}
doAnswer(i -> {
return null;
- }).when(mockApi).deleteSubscription(any(Integer.class));
+ }).when(mockApi).deleteSubscription(any(String.class));
when(mockApi.deployXapp(any(XAppInfo.class))).thenReturn(new Xapp());
return new SuccessTransport(200, DashboardApplication.getImplementationVersion(HealthApi.class));
}
- @ApiOperation(value = "Calls the xApp Manager health check.")
- @RequestMapping(value = "/health", method = RequestMethod.GET)
+ @ApiOperation(value = "Calls the xApp Manager liveness health check.")
+ @RequestMapping(value = "/health/alive", method = RequestMethod.GET)
public void getHealth(HttpServletResponse response) {
- logger.debug("getHealt");
- healthApi.getHealth();
+ logger.debug("getHealth");
+ healthApi.getHealthAlive();
+ response.setStatus(healthApi.getApiClient().getStatusCode().value());
+ }
+
+ @ApiOperation(value = "Calls the xApp Manager readiness health check.")
+ @RequestMapping(value = "/health/ready", method = RequestMethod.GET)
+ public void getHealthReady(HttpServletResponse response) {
+ logger.debug("getHealthReady");
+ healthApi.getHealthReady();
response.setStatus(healthApi.getApiClient().getStatusCode().value());
}
+/*-
+ * ========================LICENSE_START=================================
+ * O-RAN-SC
+ * %%
+ * Copyright (C) 2019 AT&T Intellectual Property and Nokia
+ * %%
+ * 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.
+ * ========================LICENSE_END===================================
+ */
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { AnrXappComponent } from './anr-xapp.component';
+/*-
+ * ========================LICENSE_START=================================
+ * O-RAN-SC
+ * %%
+ * Copyright (C) 2019 AT&T Intellectual Property and Nokia
+ * %%
+ * 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.
+ * ========================LICENSE_END===================================
+ */
import { Component, OnInit } from '@angular/core';
@Component({
+/*-
+ * ========================LICENSE_START=================================
+ * O-RAN-SC
+ * %%
+ * Copyright (C) 2019 AT&T Intellectual Property and Nokia
+ * %%
+ * 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.
+ * ========================LICENSE_END===================================
+ */
import { TestBed } from '@angular/core/testing';
import { AcXappService } from './ac-xapp.service';
<groupId>org.o-ran-sc.ric.xappmgr.client</groupId>
<artifactId>xapp-mgr-client</artifactId>
<name>RIC xApp Manager client</name>
- <version>0.1.2-SNAPSHOT</version>
+ <version>0.1.3-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<goal>generate</goal>
</goals>
<configuration>
- <inputSpec>${project.basedir}/src/main/resources/xapp_manager_rest_api_v0_1_2.yaml</inputSpec>
+ <inputSpec>${project.basedir}/src/main/resources/xapp_manager_rest_api_v0_1_3.yaml</inputSpec>
<language>java</language>
<configOptions>
<groupId>${project.groupId}</groupId>
+++ /dev/null
-{
- "swagger": "2.0",
- "info": {
- "description": "This is a draft API for RIC xapp-manager",
- "version": "0.0.10",
- "title": "RIC xapp-manager"
- },
- "host": "hostname",
- "basePath": "/ric/v1/xapps",
- "schemes": [
- "https",
- "http"
- ],
- "paths": {
- "/ric/v1/health": {
- "get": {
- "summary": "Health check of xApp Manager",
- "operationId": "getHealth",
- "responses": {
- "200": {
- "description": "Status of xApp Manager is ok"
- }
- }
- }
- },
- "/ric/v1/xapps": {
- "post": {
- "summary": "Deploy a xapp",
- "operationId": "deployXapp",
- "consumes": [
- "application/json"
- ],
- "produces": [
- "application/json"
- ],
- "parameters": [
- {
- "name": "xAppInfo",
- "in": "body",
- "description": "xApp information",
- "schema": {
- "type": "object",
- "required": [
- "xAppName"
- ],
- "properties": {
- "xAppName": {
- "type":"string",
- "description":"Name of the xApp",
- "example": "xapp-dummy"
- }
- }
- }
- }
- ],
- "responses": {
- "201": {
- "description": "xApp successfully created",
- "schema": {
- "$ref": "#/definitions/Xapp"
- }
- },
- "400": {
- "description": "Invalid input"
- },
- "500": {
- "description": "Internal error"
- }
- }
- },
- "get": {
- "summary": "Returns the status of all xapps",
- "operationId": "getAllXapps",
- "produces": [
- "application/json"
- ],
- "responses": {
- "200": {
- "description": "successful query of xApps",
- "schema": {
- "$ref": "#/definitions/AllXapps"
- }
- },
- "500": {
- "description": "Internal error"
- }
- }
- }
- },
- "/ric/v1/xapps/{xAppName}": {
- "get": {
- "summary": "Returns the status of a given xapp",
- "operationId": "getXappByName",
- "produces": [
- "application/json"
- ],
- "parameters": [
- {
- "name": "xAppName",
- "in": "path",
- "description": "Name of xApp",
- "required": true,
- "type": "string"
- }
- ],
- "responses": {
- "200": {
- "description": "successful operation",
- "schema": {
- "$ref": "#/definitions/Xapp"
- }
- },
- "400": {
- "description": "Invalid ID supplied"
- },
- "404": {
- "description": "Xapp not found"
- },
- "500": {
- "description": "Internal error"
- }
- }
- },
- "delete": {
- "summary": "Undeploy an existing xapp",
- "operationId": "undeployXapp",
- "parameters": [
- {
- "name": "xAppName",
- "in": "path",
- "description": "Xapp to be undeployed",
- "required": true,
- "type": "string"
- }
- ],
- "responses": {
- "204": {
- "description": "Successful deletion of xApp"
- },
- "400": {
- "description": "Invalid xApp name supplied"
- },
- "500": {
- "description": "Internal error"
- }
- }
- }
- },
- "/ric/v1/xapps/{xAppName}/instances/{xAppInstanceName}": {
- "get": {
- "summary": "Returns the status of a given xapp",
- "operationId": "getXappInstanceByName",
- "produces": [
- "application/json"
- ],
- "parameters": [
- {
- "name": "xAppName",
- "in": "path",
- "description": "Name of xApp",
- "required": true,
- "type": "string"
- },
- {
- "name": "xAppInstanceName",
- "in": "path",
- "description": "Name of xApp instance to get information",
- "required": true,
- "type": "string"
- }
- ],
- "responses": {
- "200": {
- "description": "successful operation",
- "schema": {
- "$ref": "#/definitions/XappInstance"
- }
- },
- "400": {
- "description": "Invalid name supplied"
- },
- "404": {
- "description": "Xapp not found"
- },
- "500": {
- "description": "Internal error"
- }
- }
- }
- },
- "/ric/v1/subscriptions": {
- "post": {
- "summary": "Subscribe event",
- "operationId": "addSubscription",
- "consumes": [
- "application/json"
- ],
- "produces": [
- "application/json"
- ],
- "parameters": [
- {
- "name": "subscriptionRequest",
- "in": "body",
- "description": "New subscription",
- "required": true,
- "schema": {
- "$ref": "#/definitions/subscriptionRequest"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Subscription successful",
- "schema": {
- "$ref": "#/definitions/subscriptionResponse"
- }
- },
- "400": {
- "description": "Invalid input"
- }
- }
- },
- "get": {
- "summary": "Returns all subscriptions",
- "operationId": "getSubscriptions",
- "produces": [
- "application/json"
- ],
- "responses": {
- "200": {
- "description": "successful query of subscriptions",
- "schema": {
- "$ref": "#/definitions/allSubscriptions"
- }
- }
- }
- }
- },
- "/ric/v1/subscriptions/{subscriptionId}": {
- "get": {
- "summary": "Returns the information of subscription",
- "operationId": "getSubscriptionById",
- "produces": [
- "application/json"
- ],
- "parameters": [
- {
- "name": "subscriptionId",
- "in": "path",
- "description": "ID of subscription",
- "required": true,
- "type": "integer"
- }
- ],
- "responses": {
- "200": {
- "description": "successful operation",
- "schema": {
- "$ref": "#/definitions/subscription"
- }
- },
- "400": {
- "description": "Invalid ID supplied"
- },
- "404": {
- "description": "Subscription not found"
- }
- }
- },
- "put": {
- "summary": "Modify event subscription",
- "operationId": "modifySubscription",
- "consumes": [
- "application/json"
- ],
- "produces": [
- "application/json"
- ],
- "parameters": [
- {
- "name": "subscriptionId",
- "in": "path",
- "description": "ID of subscription",
- "required": true,
- "type": "integer"
- },
- {
- "in": "body",
- "name": "subscriptionRequest",
- "description": "Modified subscription",
- "required": true,
- "schema": {
- "$ref": "#/definitions/subscriptionRequest"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "Subscription modification successful",
- "schema": {
- "$ref": "#/definitions/subscriptionResponse"
- }
- },
- "400": {
- "description": "Invalid input"
- }
- }
- },
- "delete": {
- "summary": "Unsubscribe event",
- "description": "",
- "operationId": "deleteSubscription",
- "parameters": [
- {
- "name": "subscriptionId",
- "in": "path",
- "description": "ID of subscription",
- "required": true,
- "type": "integer"
- }
- ],
- "responses": {
- "204": {
- "description": "Successful deletion of subscription"
- },
- "400": {
- "description": "Invalid subscription supplied"
- }
- }
- }
- }
- },
- "definitions": {
- "AllXapps": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/Xapp"
- }
- },
- "Xapp": {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "type": "string",
- "example": "xapp-dummy"
- },
- "status": {
- "type": "string",
- "description": "xapp status in the RIC",
- "enum": [
- "unknown",
- "deployed",
- "deleted",
- "superseded",
- "failed",
- "deleting"
- ]
- },
- "version": {
- "type": "string",
- "example": "1.2.3"
- },
- "instances": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/XappInstance"
- }
- }
- }
- },
- "XappInstance": {
- "type": "object",
- "required": [
- "name"
- ],
- "properties": {
- "name": {
- "type": "string",
- "example": "xapp-dummy-6cd577d9-4v255"
- },
- "status": {
- "type": "string",
- "description": "xapp instance status",
- "enum": [
- "pending",
- "running",
- "succeeded",
- "failed",
- "unknown",
- "completed",
- "crashLoopBackOff"
- ]
- },
- "ip": {
- "type": "string",
- "example": "192.168.0.1"
- },
- "port": {
- "type": "integer",
- "example": 32300
- },
- "txMessages" : {
- "type": "array",
- "items": {
- "type" : "string",
- "example" : "ControlIndication"
- }
- },
- "rxMessages" : {
- "type": "array",
- "items": {
- "type" : "string",
- "example" : "LoadIndication"
- }
- }
- }
- },
- "subscriptionRequest": {
- "type": "object",
- "required": [
- "targetUrl",
- "eventType",
- "maxRetries",
- "retryTimer"
- ],
- "properties": {
- "targetUrl": {
- "type": "string",
- "example": "http://localhost:11111/apps/webhook/"
- },
- "eventType": {
- "type": "string",
- "description": "Event which is subscribed",
- "enum": [
- "created",
- "deleted",
- "all"
- ]
- },
- "maxRetries": {
- "type": "integer",
- "description": "Maximum number of retries",
- "example": 11
- },
- "retryTimer": {
- "type": "integer",
- "description": "Time in seconds to wait before next retry",
- "example": 22
- }
- }
- },
- "subscriptionResponse": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string",
- "example": "1ILBltYYzEGzWRrVPZKmuUmhwcc"
- },
- "version": {
- "type": "integer",
- "example": 2
- },
- "eventType": {
- "type": "string",
- "description": "Event which is subscribed",
- "enum": [
- "created",
- "deleted",
- "all"
- ]
- }
- }
- },
- "allSubscriptions": {
- "type": "array",
- "items": {
- "$ref": "#/definitions/subscription"
- }
- },
- "subscription": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string",
- "example": "1ILBltYYzEGzWRrVPZKmuUmhwcc"
- },
- "targetUrl": {
- "type": "string",
- "example": "http://localhost:11111/apps/webhook/"
- },
- "eventType": {
- "type": "string",
- "description": "Event which is subscribed",
- "enum": [
- "created",
- "deleted",
- "all"
- ]
- },
- "maxRetries": {
- "type": "integer",
- "description": "Maximum number of retries",
- "example": 11
- },
- "retryTimer": {
- "type": "integer",
- "description": "Time in seconds to wait before next retry",
- "example": 22
- }
- }
- },
- "subscriptionNotification": {
- "type": "object",
- "properties": {
- "id": {
- "type": "string",
- "example": "1ILBltYYzEGzWRrVPZKmuUmhwcc"
- },
- "version": {
- "type": "integer",
- "example": 2
- },
- "eventType": {
- "type": "string",
- "description": "Event to be notified",
- "enum": [
- "created",
- "deleted"
- ]
- },
- "xApps": {
- "$ref": "#/definitions/AllXapps"
- }
- }
- }
- }
- }
\ No newline at end of file
-# ========================LICENSE_START=================================
-# O-RAN-SC
-# %%
-# Copyright (C) 2019 AT&T Intellectual Property and Nokia
-# %%
-# 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.
-# ========================LICENSE_END===================================
swagger: '2.0'
info:
description: This is a draft API for RIC appmgr
- version: 0.1.2
+ version: 0.1.3
title: RIC appmgr
license:
name: Apache 2.0
- https
- http
paths:
- /health:
- get:
- summary: Health check of xApp Manager
- tags:
+ /health/alive :
+ get :
+ summary : Health check of xApp Manager - Liveness probe
+ tags :
- health
- operationId: getHealth
- responses:
+ operationId : getHealthAlive
+ responses :
+ '200' :
+ description : Status of xApp Manager is ok
+ /health/ready :
+ get :
+ summary : Readiness check of xApp Manager - Readiness probe
+ tags :
+ - health
+ operationId : getHealthReady
+ responses :
'200':
- description: Status of xApp Manager is ok
+ description : xApp Manager is ready for service
+ '503':
+ description: xApp Manager is not ready for service
/xapps:
post:
summary: Deploy a xapp
schema:
type: object
required:
- - xAppName
+ - name
properties:
- xAppName:
+ name:
type: string
- description: Name of the xApp
+ description: Name of the xApp.
+ example: xapp-dummy
+ configName:
+ type: string
+ description: Name of the xApp configmap. Overrides the value given in Helm chart value file.
+ example: xapp-dummy-configmap
+ namespace:
+ type: string
+ description: Name of the namespace to which xApp is deployed. Overrides the value given in Helm chart value file.
+ example: ricxapps
+ serviceName:
+ type: string
+ description: Name of the service xApp is providing. Overrides the value given in Helm chart value file.
+ example: xapp-dummy-service
+ imageRepo:
+ type: string
+ description: Name of the docker repository xApp is located. Overrides the value given in Helm chart value file.
+ example: xapprepo
+ hostname:
+ type: string
+ description: Hostname for the pod. Used by messaging library. Overrides the value given in Helm chart value file.
example: xapp-dummy
responses:
'201':
produces:
- application/json
parameters:
- - name: xAppConfig
+ - name: XAppConfig
in: body
description: xApp config
schema:
- $ref: '#/definitions/xAppConfig'
+ $ref: '#/definitions/XAppConfig'
responses:
'201':
description: xApp config successfully created
schema:
- $ref: '#/definitions/xAppConfig'
+ $ref: '#/definitions/XAppConfig'
'400':
description: Invalid input
'422':
produces:
- application/json
parameters:
- - name: xAppConfig
+ - name: XAppConfig
in: body
description: xApp config
schema:
- $ref: '#/definitions/xAppConfig'
+ $ref: '#/definitions/XAppConfig'
responses:
'200':
description: xApp config successfully modified
schema:
- $ref: '#/definitions/xAppConfig'
+ $ref: '#/definitions/XAppConfig'
'400':
description: Invalid input
'422':
- xapp
operationId: deleteXappConfig
parameters:
- - name: xAppConfigInfo
+ - name: ConfigMetadata
in: body
description: xApp configuration information
schema:
- $ref: '#/definitions/xAppConfigInfo'
+ $ref: '#/definitions/ConfigMetadata'
responses:
'204':
description: Successful deletion of xApp
in: path
description: ID of subscription
required: true
- type: integer
+ type: string
responses:
'200':
description: successful operation
in: path
description: ID of subscription
required: true
- type: integer
+ type: string
- in: body
name: subscriptionRequest
description: Modified subscription
in: path
description: ID of subscription
required: true
- type: integer
+ type: string
responses:
'204':
description: Successful deletion of subscription
items:
type: string
example: LoadIndication
- xAppConfigInfo:
+ ConfigMetadata:
type: object
required:
- - xAppName
- - configMapName
+ - name
+ - configName
- namespace
properties:
- xAppName:
+ name:
type: string
description: Name of the xApp
example: xapp-dummy
- configMapName:
+ configName:
type: string
description: Name of the config map
example: xapp-dummy-config-map
type: string
description: Name of the namespace
example: ricxapp
- xAppConfig:
+ XAppConfig:
type: object
required:
- - xAppConfigInfo
- - configSchema
- - configMap
+ - metadata
+ - descriptor
+ - config
properties:
- xAppConfigInfo:
- $ref: '#/definitions/xAppConfigInfo'
- configSchema:
+ metadata:
+ $ref: '#/definitions/ConfigMetadata'
+ descriptor:
type: object
description: Schema of configuration in JSON format
- configMap:
+ config:
type: object
description: Configuration in JSON format
AllXappConfig:
type: array
items:
- $ref: '#/definitions/xAppConfig'
+ $ref: '#/definitions/XAppConfig'
subscriptionRequest:
type: object
required:
apiClient.setBasePath("http://localhost:30099/");
try {
HealthApi healthApi = new HealthApi(apiClient);
- healthApi.getHealth();
- System.out.println("getHealth answered: " + apiClient.getStatusCode().toString());
+ healthApi.getHealthAlive();
+ System.out.println("getHealthAlive answered: " + apiClient.getStatusCode().toString());
} catch (RestClientException e) {
- System.err.println("getHealth failed: " + e.toString());
+ System.err.println("getHealthAlive failed: " + e.toString());
}
try {
XappApi xappApi = new XappApi(apiClient);