From d05cd0ab9d74acdf4bee55e301e3849e7434a6b9 Mon Sep 17 00:00:00 2001 From: "Marikkannu, Suresh" Date: Thu, 28 Sep 2023 22:05:41 -0700 Subject: [PATCH 1/2] Added xApp policy ratio parameters to the slice config and updated api Signed-off-by: Marikkannu, Suresh --- api/aether-2.1.0-openapi3.yaml | 343 ++++++++++++- .../server/aether-2.1.0-convert-gnmi-oapi.go | 164 ++++-- .../server/aether-2.1.0-convert-oapi-gnmi.go | 238 ++++++++- pkg/aether_2_1_0/server/aether-2.1.0-impl.go | 475 +++++++++++++++++- .../server/aether-2.1.0-server.go | 249 +++++++++ pkg/aether_2_1_0/server/aether-2.1.0-spec.go | 280 ++++++----- pkg/aether_2_1_0/types/aether-2.1.0-types.go | 113 +++-- 7 files changed, 1647 insertions(+), 215 deletions(-) diff --git a/api/aether-2.1.0-openapi3.yaml b/api/aether-2.1.0-openapi3.yaml index 3dcde6f..e93fb74 100644 --- a/api/aether-2.1.0-openapi3.yaml +++ b/api/aether-2.1.0-openapi3.yaml @@ -49,6 +49,11 @@ components: application/json: schema: $ref: '#/components/schemas/Site_Connectivity-service_Core-5g' + RequestBody_Site_Connectivity-service_Ran-5g-service: + content: + application/json: + schema: + $ref: '#/components/schemas/Site_Connectivity-service_Ran-5g-service' RequestBody_Site_Device: content: application/json: @@ -124,6 +129,21 @@ components: application/json: schema: $ref: '#/components/schemas/Site_Slice_Priority-traffic-rule' + RequestBody_Site_Slice_Priority-traffic-rule_Gbr: + content: + application/json: + schema: + $ref: '#/components/schemas/Site_Slice_Priority-traffic-rule_Gbr' + RequestBody_Site_Slice_Priority-traffic-rule_Mbr: + content: + application/json: + schema: + $ref: '#/components/schemas/Site_Slice_Priority-traffic-rule_Mbr' + RequestBody_Site_Slice_Xapp: + content: + application/json: + schema: + $ref: '#/components/schemas/Site_Slice_Xapp' RequestBody_Site_Small-cell: content: application/json: @@ -185,7 +205,7 @@ components: type: object Application: additionalProperties: - $ref: '#/components/schemas/AdditionalPropertiesUnchTarget' + $ref: '#/components/schemas/AdditionalPropertyUnchanged' description: List of applications (single) properties: address: @@ -201,12 +221,14 @@ components: title: application-id type: string x-go-type: ListKey + x-yang-type: application-id description: description: long description field maxLength: 1024 minLength: 1 title: description type: string + x-yang-type: description display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -232,6 +254,7 @@ components: minLength: 1 title: description type: string + x-yang-type: description display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -246,6 +269,7 @@ components: title: endpoint-id type: string x-go-type: ListKey + x-yang-type: aether-identifier mbr: $ref: '#/components/schemas/Application_Endpoint_Mbr' port-end: @@ -268,6 +292,7 @@ components: pattern: TCP|UDP title: protocol type: string + x-yang-type: protocol traffic-class: description: Link to traffic class title: traffic-class @@ -288,6 +313,7 @@ components: description: list for endpoint (list) items: $ref: '#/components/schemas/Application_Endpoint' + title: Application_Endpoint_List type: array uniqueItems: true x-keys: @@ -314,6 +340,7 @@ components: description: List of applications (list) items: $ref: '#/components/schemas/Application' + title: Application_List type: array uniqueItems: true x-keys: @@ -350,6 +377,7 @@ components: minLength: 1 title: description type: string + x-yang-type: description device: $ref: '#/components/schemas/Site_Device_List' device-group: @@ -376,6 +404,7 @@ components: title: site-id type: string x-go-type: ListKey + x-yang-type: site-id slice: $ref: '#/components/schemas/Site_Slice_List' small-cell: @@ -399,6 +428,8 @@ components: $ref: '#/components/schemas/Site_Connectivity-service_Core-4g' core-5g: $ref: '#/components/schemas/Site_Connectivity-service_Core-5g' + ran-5g-service: + $ref: '#/components/schemas/Site_Connectivity-service_Ran-5g-service' title: Site_Connectivity-service type: object Site_Connectivity-service_Core-4g: @@ -408,10 +439,12 @@ components: description: URL of ACC prometheus title: acc-prometheus-url type: string + x-yang-type: uri endpoint: description: Endpoint URL title: endpoint type: string + x-yang-type: uri title: Site_Connectivity-service_Core-4g type: object Site_Connectivity-service_Core-5g: @@ -421,12 +454,24 @@ components: description: URL of ACC prometheus title: acc-prometheus-url type: string + x-yang-type: uri endpoint: description: Endpoint URL title: endpoint type: string + x-yang-type: uri title: Site_Connectivity-service_Core-5g type: object + Site_Connectivity-service_Ran-5g-service: + description: Connectivity to the xApp + properties: + xapp-endpoint: + description: xApp Endpoint URL + title: xapp-endpoint + type: string + x-yang-type: uri + title: Site_Connectivity-service_Ran-5g-service + type: object Site_Device: description: List of devices (single) properties: @@ -436,6 +481,7 @@ components: minLength: 1 title: description type: string + x-yang-type: description device-id: description: ID for this device. maxLength: 63 @@ -444,6 +490,7 @@ components: title: device-id type: string x-go-type: ListKey + x-yang-type: device-id display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -457,6 +504,7 @@ components: pattern: '[0-9]{14,16}' title: imei type: string + x-yang-type: imei sim-card: description: Link to simcard title: sim-card @@ -482,6 +530,7 @@ components: minLength: 1 title: description type: string + x-yang-type: description device: $ref: '#/components/schemas/Site_Device-group_Device_List' device-group-id: @@ -492,6 +541,7 @@ components: title: device-group-id type: string x-go-type: ListKey + x-yang-type: device-group-id display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -544,6 +594,7 @@ components: description: list of devices in this device-group (list) items: $ref: '#/components/schemas/Site_Device-group_Device' + title: Site_Device-group_Device_List type: array uniqueItems: true x-keys: @@ -553,6 +604,7 @@ components: description: List of device groups (list) items: $ref: '#/components/schemas/Site_Device-group' + title: Site_Device-group_List type: array uniqueItems: true x-keys: @@ -584,6 +636,7 @@ components: description: List of devices (list) items: $ref: '#/components/schemas/Site_Device' + title: Site_Device_List type: array uniqueItems: true x-keys: @@ -635,11 +688,13 @@ components: pattern: '[0-9]{3}' title: mcc type: string + x-yang-type: mcc mnc: description: mobile network code pattern: '[0-9]{2,3}' title: mnc type: string + x-yang-type: mnc required: - enterprise - format @@ -659,12 +714,14 @@ components: pattern: ENABLE|MAINTENANCE|DISABLE title: admin-status type: string + x-yang-type: admin-status description: description: long description field maxLength: 1024 minLength: 1 title: description type: string + x-yang-type: description display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -677,6 +734,7 @@ components: minLength: 1 title: dnn type: string + x-yang-type: dnn dns-primary: description: primary dns server name title: dns-primary @@ -693,6 +751,7 @@ components: title: ip-domain-id type: string x-go-type: ListKey + x-yang-type: ip-domain-id mtu: default: 1492 description: maximum transmission unit @@ -705,6 +764,7 @@ components: pattern: (([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2])) title: subnet type: string + x-yang-type: ipv4-prefix required: - dnn - ip-domain-id @@ -716,6 +776,7 @@ components: description: List of ip domains (list) items: $ref: '#/components/schemas/Site_Ip-domain' + title: Site_Ip-domain_List type: array uniqueItems: true x-keys: @@ -725,6 +786,7 @@ components: description: List of site (list) items: $ref: '#/components/schemas/Site' + title: Site_List type: array uniqueItems: true x-keys: @@ -737,12 +799,14 @@ components: description: URL of edge cluster prometheus title: edge-cluster-prometheus-url type: string + x-yang-type: uri edge-device: $ref: '#/components/schemas/Site_Monitoring_Edge-device_List' edge-monitoring-prometheus-url: description: URL of monitoring prometheus title: edge-monitoring-prometheus-url type: string + x-yang-type: uri title: Site_Monitoring type: object Site_Monitoring_Edge-device: @@ -754,6 +818,7 @@ components: minLength: 1 title: description type: string + x-yang-type: description display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -768,6 +833,7 @@ components: title: edge-device-id type: string x-go-type: ListKey + x-yang-type: aether-identifier required: - edge-device-id title: Site_Monitoring_Edge-device @@ -777,6 +843,7 @@ components: description: List of edge monitoring devices (list) items: $ref: '#/components/schemas/Site_Monitoring_Edge-device' + title: Site_Monitoring_Edge-device_List type: array uniqueItems: true x-keys: @@ -791,6 +858,7 @@ components: minLength: 1 title: description type: string + x-yang-type: description display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -810,6 +878,7 @@ components: pattern: '[0-9]{18,21}[0-9A-F]' title: iccid type: string + x-yang-type: iccid imsi: description: IMSI for this sim card maxLength: 15 @@ -817,6 +886,7 @@ components: pattern: '[0-9]{14,15}' title: imsi type: string + x-yang-type: imsi sim-id: description: ID for this sim card. maxLength: 63 @@ -825,6 +895,7 @@ components: title: sim-id type: string x-go-type: ListKey + x-yang-type: sim-card-id required: - sim-id title: Site_Sim-card @@ -835,6 +906,7 @@ components: description: List of sim cards (list) items: $ref: '#/components/schemas/Site_Sim-card' + title: Site_Sim-card_List type: array uniqueItems: true x-keys: @@ -858,12 +930,14 @@ components: pattern: DENY-ALL|ALLOW-ALL|ALLOW-PUBLIC title: default-behavior type: string + x-yang-type: behavior description: description: long description field maxLength: 1024 minLength: 1 title: description type: string + x-yang-type: description device-group: $ref: '#/components/schemas/Site_Slice_Device-group_List' display-name: @@ -885,6 +959,7 @@ components: pattern: '[0-9A-F\.]{1,6}' title: sd type: string + x-yang-type: sd slice-id: description: ID for this slice. maxLength: 63 @@ -893,6 +968,7 @@ components: title: slice-id type: string x-go-type: ListKey + x-yang-type: slice-id sst: description: Slice/Service type. Immutable. maxLength: 2 @@ -900,12 +976,15 @@ components: pattern: '[0-9A-F\.]{1,2}' title: sst type: string + x-yang-type: sst upf: description: Link to user plane that implements this vcf title: upf type: string x-leafref: ../../upf/upf-id x-leafref-resolver: /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/upf/values + xapp: + $ref: '#/components/schemas/Site_Slice_Xapp' required: - default-behavior - sd @@ -942,6 +1021,7 @@ components: the Slice if the enable field is set to True (list) items: $ref: '#/components/schemas/Site_Slice_Device-group' + title: Site_Slice_Device-group_List type: array uniqueItems: true x-keys: @@ -983,6 +1063,7 @@ components: of the packet. (list) items: $ref: '#/components/schemas/Site_Slice_Filter' + title: Site_Slice_Filter_List type: array uniqueItems: true x-keys: @@ -992,6 +1073,7 @@ components: description: List of Slices (list) items: $ref: '#/components/schemas/Site_Slice' + title: Site_Slice_List type: array uniqueItems: true x-keys: @@ -1045,6 +1127,7 @@ components: minLength: 1 title: description type: string + x-yang-type: description device: description: Link to device title: device @@ -1075,6 +1158,7 @@ components: title: priority-traffic-rule-id type: string x-go-type: ListKey + x-yang-type: priority-traffic-rule-id traffic-class: description: Link to traffic class title: traffic-class @@ -1091,7 +1175,7 @@ components: x-list-multiple: true x-must: [] Site_Slice_Priority-traffic-rule_Gbr: - description: For choice bitrate:gbr-case + description: Per-Device per-Application GBR (Guaranteed BitRate) in bps properties: downlink: description: Per-Device per application downlink data rate in bps @@ -1111,13 +1195,14 @@ components: description: List of priority traffic rules (list) items: $ref: '#/components/schemas/Site_Slice_Priority-traffic-rule' + title: Site_Slice_Priority-traffic-rule_List type: array uniqueItems: true x-keys: - priority-traffic-rule-id x-list-multiple: true Site_Slice_Priority-traffic-rule_Mbr: - description: For choice bitrate:mbr-case + description: Per-Device per-Application MBR (Maximum BitRate) in bps properties: downlink: description: Per-Device per application downlink data rate in bps @@ -1133,6 +1218,29 @@ components: type: integer title: Site_Slice_Priority-traffic-rule_Mbr type: object + Site_Slice_Xapp: + description: Params related to xApp + properties: + rrm-dedicated: + description: rRMPolicyDedicatedRatio + maximum: 100 + minimum: 0 + title: rrm-dedicated + type: integer + rrm-max: + description: rRMPolicyMaxRatio + maximum: 100 + minimum: 0 + title: rrm-max + type: integer + rrm-min: + description: rRMPolicyMinRatio + maximum: 100 + minimum: 0 + title: rrm-min + type: integer + title: Site_Slice_Xapp + type: object Site_Small-cell: additionalProperties: $ref: '#/components/schemas/AdditionalPropertyUnchanged' @@ -1148,6 +1256,7 @@ components: minLength: 1 title: description type: string + x-yang-type: description display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -1167,6 +1276,7 @@ components: title: small-cell-id type: string x-go-type: ListKey + x-yang-type: aether-identifier tac: description: Type Allocation Code maxLength: 6 @@ -1174,6 +1284,7 @@ components: pattern: '[0-9A-F\.]{1,6}' title: tac type: string + x-yang-type: tac required: - small-cell-id - tac @@ -1184,6 +1295,7 @@ components: description: List of small cell addresses (list) items: $ref: '#/components/schemas/Site_Small-cell' + title: Site_Small-cell_List type: array uniqueItems: true x-keys: @@ -1202,12 +1314,14 @@ components: description: url for configuring the UPF title: config-endpoint type: string + x-yang-type: uri description: description: long description field maxLength: 1024 minLength: 1 title: description type: string + x-yang-type: description display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -1228,6 +1342,7 @@ components: title: upf-id type: string x-go-type: ListKey + x-yang-type: upf-id required: - address - port @@ -1239,6 +1354,7 @@ components: description: A list of named upfs. (list) items: $ref: '#/components/schemas/Site_Upf' + title: Site_Upf_List type: array uniqueItems: true x-keys: @@ -1246,7 +1362,7 @@ components: x-list-multiple: true Template: additionalProperties: - $ref: '#/components/schemas/AdditionalPropertiesUnchTarget' + $ref: '#/components/schemas/AdditionalPropertyUnchanged' description: List of slice templates (single) properties: default-behavior: @@ -1255,12 +1371,14 @@ components: pattern: DENY-ALL|ALLOW-ALL|ALLOW-PUBLIC title: default-behavior type: string + x-yang-type: behavior description: description: long description field maxLength: 1024 minLength: 1 title: description type: string + x-yang-type: description display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -1276,6 +1394,7 @@ components: pattern: '[0-9A-F\.]{1,6}' title: sd type: string + x-yang-type: sd sst: description: Slice/Service type maxLength: 2 @@ -1283,6 +1402,7 @@ components: pattern: '[0-9A-F\.]{1,2}' title: sst type: string + x-yang-type: sst template-id: description: ID for this slice template. maxLength: 63 @@ -1291,6 +1411,7 @@ components: title: template-id type: string x-go-type: ListKey + x-yang-type: template-id required: - default-behavior - template-id @@ -1301,6 +1422,7 @@ components: description: List of slice templates (list) items: $ref: '#/components/schemas/Template' + title: Template_List type: array uniqueItems: true x-keys: @@ -1355,6 +1477,7 @@ components: minLength: 1 title: description type: string + x-yang-type: description display-name: description: display name to use in GUI or CLI maxLength: 80 @@ -1387,6 +1510,7 @@ components: title: traffic-class-id type: string x-go-type: ListKey + x-yang-type: traffic-class-id required: - traffic-class-id title: Traffic-class @@ -1396,6 +1520,7 @@ components: description: List of traffic class (list) items: $ref: '#/components/schemas/Traffic-class' + title: Traffic-class_List type: array uniqueItems: true x-keys: @@ -1814,6 +1939,48 @@ paths: summary: POST /site/{site-id}/connectivity-service/core-5g tags: - Site_Connectivity-service + /aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service: + delete: + operationId: deleteSite_Connectivity-service_Ran-5g-service + responses: + "200": + description: DELETE 200 OK + summary: DELETE /site/{site-id}/connectivity-service/ran-5g-service + tags: + - Site_Connectivity-service + description: Connectivity to the xApp + get: + operationId: getSite_Connectivity-service_Ran-5g-service + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/Site_Connectivity-service_Ran-5g-service' + description: GET OK 200 + summary: GET /site/{site-id}/connectivity-service/ran-5g-service Container + tags: + - Site_Connectivity-service + parameters: + - $ref: '#/components/parameters/enterprise-id' + - content: + text/plain; charset=utf-8: + schema: + type: string + description: key {site-id} + in: path + name: site-id + required: true + post: + operationId: postSite_Connectivity-service_Ran-5g-service + requestBody: + $ref: '#/components/requestBodies/RequestBody_Site_Connectivity-service_Ran-5g-service' + responses: + "201": + description: created + summary: POST /site/{site-id}/connectivity-service/ran-5g-service + tags: + - Site_Connectivity-service /aether/v2.1.x/{enterprise-id}/site/{site-id}/device: description: List of devices get: @@ -3190,6 +3357,124 @@ paths: in: path name: priority-traffic-rule-id required: true + /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr: + delete: + operationId: deleteSite_Slice_Priority-traffic-rule_Gbr + responses: + "200": + description: DELETE 200 OK + summary: DELETE /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr + tags: + - Site_Slice_Priority-traffic-rule + description: Per-Device per-Application GBR (Guaranteed BitRate) in bps + get: + operationId: getSite_Slice_Priority-traffic-rule_Gbr + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/Site_Slice_Priority-traffic-rule_Gbr' + description: GET OK 200 + summary: GET /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr + Container + tags: + - Site_Slice_Priority-traffic-rule + parameters: + - $ref: '#/components/parameters/enterprise-id' + - content: + text/plain; charset=utf-8: + schema: + type: string + description: key {site-id} + in: path + name: site-id + required: true + - content: + text/plain; charset=utf-8: + schema: + type: string + description: key {slice-id} + in: path + name: slice-id + required: true + - content: + text/plain; charset=utf-8: + schema: + type: string + description: key {priority-traffic-rule-id} + in: path + name: priority-traffic-rule-id + required: true + post: + operationId: postSite_Slice_Priority-traffic-rule_Gbr + requestBody: + $ref: '#/components/requestBodies/RequestBody_Site_Slice_Priority-traffic-rule_Gbr' + responses: + "201": + description: created + summary: POST /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr + tags: + - Site_Slice_Priority-traffic-rule + /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr: + delete: + operationId: deleteSite_Slice_Priority-traffic-rule_Mbr + responses: + "200": + description: DELETE 200 OK + summary: DELETE /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr + tags: + - Site_Slice_Priority-traffic-rule + description: Per-Device per-Application MBR (Maximum BitRate) in bps + get: + operationId: getSite_Slice_Priority-traffic-rule_Mbr + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/Site_Slice_Priority-traffic-rule_Mbr' + description: GET OK 200 + summary: GET /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr + Container + tags: + - Site_Slice_Priority-traffic-rule + parameters: + - $ref: '#/components/parameters/enterprise-id' + - content: + text/plain; charset=utf-8: + schema: + type: string + description: key {site-id} + in: path + name: site-id + required: true + - content: + text/plain; charset=utf-8: + schema: + type: string + description: key {slice-id} + in: path + name: slice-id + required: true + - content: + text/plain; charset=utf-8: + schema: + type: string + description: key {priority-traffic-rule-id} + in: path + name: priority-traffic-rule-id + required: true + post: + operationId: postSite_Slice_Priority-traffic-rule_Mbr + requestBody: + $ref: '#/components/requestBodies/RequestBody_Site_Slice_Priority-traffic-rule_Mbr' + responses: + "201": + description: created + summary: POST /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr + tags: + - Site_Slice_Priority-traffic-rule ? /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/traffic-class/values : description: Link to traffic class get: @@ -3263,6 +3548,56 @@ paths: in: path name: slice-id required: true + /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp: + delete: + operationId: deleteSite_Slice_Xapp + responses: + "200": + description: DELETE 200 OK + summary: DELETE /site/{site-id}/slice/{slice-id}/xapp + tags: + - Site_Slice + description: Params related to xApp + get: + operationId: getSite_Slice_Xapp + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/Site_Slice_Xapp' + description: GET OK 200 + summary: GET /site/{site-id}/slice/{slice-id}/xapp Container + tags: + - Site_Slice + parameters: + - $ref: '#/components/parameters/enterprise-id' + - content: + text/plain; charset=utf-8: + schema: + type: string + description: key {site-id} + in: path + name: site-id + required: true + - content: + text/plain; charset=utf-8: + schema: + type: string + description: key {slice-id} + in: path + name: slice-id + required: true + post: + operationId: postSite_Slice_Xapp + requestBody: + $ref: '#/components/requestBodies/RequestBody_Site_Slice_Xapp' + responses: + "201": + description: created + summary: POST /site/{site-id}/slice/{slice-id}/xapp + tags: + - Site_Slice /aether/v2.1.x/{enterprise-id}/site/{site-id}/small-cell: description: List of small cell addresses get: diff --git a/pkg/aether_2_1_0/server/aether-2.1.0-convert-gnmi-oapi.go b/pkg/aether_2_1_0/server/aether-2.1.0-convert-gnmi-oapi.go index 57b1ea9..85008b9 100644 --- a/pkg/aether_2_1_0/server/aether-2.1.0-convert-gnmi-oapi.go +++ b/pkg/aether_2_1_0/server/aether-2.1.0-convert-gnmi-oapi.go @@ -29,48 +29,6 @@ type ModelPluginDevice struct { device externalRef0.Device } -// ToAdditionalPropertiesUnchTarget converts gNMI to OAPI from the top level device. -func (d *ModelPluginDevice) ToAdditionalPropertiesUnchTarget(params ...string) (*types.AdditionalPropertiesUnchTarget, error) { - resource := new(types.AdditionalPropertiesUnchTarget) - - reflectAdditionalPropertiesUnchTarget, err := utils.FindModelPluginObject(d.device, "AdditionalPropertiesUnchTarget", params...) - if err != nil { - return nil, err - } - resource, err = ToAdditionalPropertiesUnchTarget(reflectAdditionalPropertiesUnchTarget, params...) - return resource, err - -} - -// ToAdditionalPropertiesUnchTarget converts gNMI to OAPI relative to a node in the tree. -func ToAdditionalPropertiesUnchTarget(ygotObjValue *reflect.Value, params ...string) (*types.AdditionalPropertiesUnchTarget, error) { - resource := new(types.AdditionalPropertiesUnchTarget) - - // Property: enterprise-id string - //encoding gNMI attribute to OAPI - reflectEnterpriseId, err := utils.FindModelPluginObject(ygotObjValue.Interface(), "EnterpriseId") - if err != nil { - return nil, err - } - if reflectEnterpriseId != nil { - attrEnterpriseId := fmt.Sprintf("%s", reflectEnterpriseId.Interface()) - resource.EnterpriseId = &attrEnterpriseId - } - - // Property: unchanged string - //encoding gNMI attribute to OAPI - reflectUnchanged, err := utils.FindModelPluginObject(ygotObjValue.Interface(), "Unchanged") - if err != nil { - return nil, err - } - if reflectUnchanged != nil { - attrUnchanged := fmt.Sprintf("%s", reflectUnchanged.Interface()) - resource.Unchanged = &attrUnchanged - } - - return resource, nil -} - // ToAdditionalPropertyEnterpriseId converts gNMI to OAPI from the top level device. func (d *ModelPluginDevice) ToAdditionalPropertyEnterpriseId(params ...string) (*types.AdditionalPropertyEnterpriseId, error) { resource := new(types.AdditionalPropertyEnterpriseId) @@ -690,6 +648,20 @@ func ToSiteConnectivityService(ygotObjValue *reflect.Value, params ...string) (* resource.Core5g = attrCore5g } + // Property: ran-5g-service SiteConnectivityServiceRan5gService + // Handle object + reflectRan5gService, err := utils.FindModelPluginObject(ygotObjValue.Interface(), "Ran5gService") + if err != nil { + return nil, err + } + if reflectRan5gService != nil { + attrRan5gService, err := ToSiteConnectivityServiceRan5gService(reflectRan5gService, params...) + if err != nil { + return nil, err + } + resource.Ran5gService = attrRan5gService + } + return resource, nil } @@ -777,6 +749,37 @@ func ToSiteConnectivityServiceCore5g(ygotObjValue *reflect.Value, params ...stri return resource, nil } +// ToSiteConnectivityServiceRan5gService converts gNMI to OAPI from the top level device. +func (d *ModelPluginDevice) ToSiteConnectivityServiceRan5gService(params ...string) (*types.SiteConnectivityServiceRan5gService, error) { + resource := new(types.SiteConnectivityServiceRan5gService) + + reflectSiteConnectivityServiceRan5gService, err := utils.FindModelPluginObject(d.device, "SiteConnectivityServiceRan5gService", params...) + if err != nil { + return nil, err + } + resource, err = ToSiteConnectivityServiceRan5gService(reflectSiteConnectivityServiceRan5gService, params...) + return resource, err + +} + +// ToSiteConnectivityServiceRan5gService converts gNMI to OAPI relative to a node in the tree. +func ToSiteConnectivityServiceRan5gService(ygotObjValue *reflect.Value, params ...string) (*types.SiteConnectivityServiceRan5gService, error) { + resource := new(types.SiteConnectivityServiceRan5gService) + + // Property: xapp-endpoint string + //encoding gNMI attribute to OAPI + reflectXappEndpoint, err := utils.FindModelPluginObject(ygotObjValue.Interface(), "XappEndpoint") + if err != nil { + return nil, err + } + if reflectXappEndpoint != nil { + attrXappEndpoint := fmt.Sprintf("%s", reflectXappEndpoint.Interface()) + resource.XappEndpoint = &attrXappEndpoint + } + + return resource, nil +} + // ToSiteDevice converts gNMI to OAPI from the top level device. func (d *ModelPluginDevice) ToSiteDevice(params ...string) (*types.SiteDevice, error) { resource := new(types.SiteDevice) @@ -1923,6 +1926,20 @@ func ToSiteSlice(ygotObjValue *reflect.Value, params ...string) (*types.SiteSlic resource.Upf = &attrUpf } + // Property: xapp SiteSliceXapp + // Handle object + reflectXapp, err := utils.FindModelPluginObject(ygotObjValue.Interface(), "Xapp") + if err != nil { + return nil, err + } + if reflectXapp != nil { + attrXapp, err := ToSiteSliceXapp(reflectXapp, params...) + if err != nil { + return nil, err + } + resource.Xapp = attrXapp + } + return resource, nil } @@ -2484,6 +2501,65 @@ func ToSiteSlicePriorityTrafficRuleMbr(ygotObjValue *reflect.Value, params ...st return resource, nil } +// ToSiteSliceXapp converts gNMI to OAPI from the top level device. +func (d *ModelPluginDevice) ToSiteSliceXapp(params ...string) (*types.SiteSliceXapp, error) { + resource := new(types.SiteSliceXapp) + + reflectSiteSliceXapp, err := utils.FindModelPluginObject(d.device, "SiteSliceXapp", params...) + if err != nil { + return nil, err + } + resource, err = ToSiteSliceXapp(reflectSiteSliceXapp, params...) + return resource, err + +} + +// ToSiteSliceXapp converts gNMI to OAPI relative to a node in the tree. +func ToSiteSliceXapp(ygotObjValue *reflect.Value, params ...string) (*types.SiteSliceXapp, error) { + resource := new(types.SiteSliceXapp) + + // Property: rrm-dedicated int + //encoding gNMI attribute to OAPI + reflectRrmDedicated, err := utils.FindModelPluginObject(ygotObjValue.Interface(), "RrmDedicated") + if err != nil { + return nil, err + } + if reflectRrmDedicated != nil { + //OpenAPI does not have unsigned numbers. + if resource.RrmDedicated, err = utils.ToIntPtr(reflectRrmDedicated); err != nil { + return nil, err + } + } + + // Property: rrm-max int + //encoding gNMI attribute to OAPI + reflectRrmMax, err := utils.FindModelPluginObject(ygotObjValue.Interface(), "RrmMax") + if err != nil { + return nil, err + } + if reflectRrmMax != nil { + //OpenAPI does not have unsigned numbers. + if resource.RrmMax, err = utils.ToIntPtr(reflectRrmMax); err != nil { + return nil, err + } + } + + // Property: rrm-min int + //encoding gNMI attribute to OAPI + reflectRrmMin, err := utils.FindModelPluginObject(ygotObjValue.Interface(), "RrmMin") + if err != nil { + return nil, err + } + if reflectRrmMin != nil { + //OpenAPI does not have unsigned numbers. + if resource.RrmMin, err = utils.ToIntPtr(reflectRrmMin); err != nil { + return nil, err + } + } + + return resource, nil +} + // ToSiteSmallCell converts gNMI to OAPI from the top level device. func (d *ModelPluginDevice) ToSiteSmallCell(params ...string) (*types.SiteSmallCell, error) { resource := new(types.SiteSmallCell) @@ -3114,6 +3190,7 @@ func ToEnterpriseId(ygotObjValue *reflect.Value, params ...string) (*types.Enter //Ignoring RequestBodySiteConnectivityService //Ignoring RequestBodySiteConnectivityServiceCore4g //Ignoring RequestBodySiteConnectivityServiceCore5g +//Ignoring RequestBodySiteConnectivityServiceRan5gService //Ignoring RequestBodySiteDevice //Ignoring RequestBodySiteDeviceGroup //Ignoring RequestBodySiteDeviceGroupDevice @@ -3128,6 +3205,9 @@ func ToEnterpriseId(ygotObjValue *reflect.Value, params ...string) (*types.Enter //Ignoring RequestBodySiteSliceFilter //Ignoring RequestBodySiteSliceMbr //Ignoring RequestBodySiteSlicePriorityTrafficRule +//Ignoring RequestBodySiteSlicePriorityTrafficRuleGbr +//Ignoring RequestBodySiteSlicePriorityTrafficRuleMbr +//Ignoring RequestBodySiteSliceXapp //Ignoring RequestBodySiteSmallCell //Ignoring RequestBodySiteUpf //Ignoring RequestBodyTemplate diff --git a/pkg/aether_2_1_0/server/aether-2.1.0-convert-oapi-gnmi.go b/pkg/aether_2_1_0/server/aether-2.1.0-convert-oapi-gnmi.go index c1bcdda..844b2d2 100644 --- a/pkg/aether_2_1_0/server/aether-2.1.0-convert-oapi-gnmi.go +++ b/pkg/aether_2_1_0/server/aether-2.1.0-convert-oapi-gnmi.go @@ -35,8 +35,6 @@ import ( var re *regexp.Regexp = regexp.MustCompile(`[A-Z][^A-Z]*`) -//Ignoring AdditionalPropertiesUnchTarget - //Ignoring AdditionalPropertyEnterpriseId //Ignoring AdditionalPropertyUnchanged @@ -856,6 +854,17 @@ func EncodeToGnmiSiteConnectivityService( } updates = append(updates, update...) } + // Property: ran-5g-service SiteConnectivityServiceRan5gService + if jsonObj.Ran5gService != nil { // Optional leaf + + update, err := EncodeToGnmiSiteConnectivityServiceRan5gService( + jsonObj.Ran5gService, false, removeIndex, enterpriseId, + fmt.Sprintf("%s/%s", parentPath, "ran-5g-service"), params...) + if err != nil { + return nil, err + } + updates = append(updates, update...) + } if needKey || removeIndex { reflectKey, err := utils.FindModelPluginObject(mp, "SiteConnectivityService", params...) @@ -1103,6 +1112,87 @@ func EncodeToGnmiSiteConnectivityServiceCore5g( return updates, nil } +// EncodeToGnmiSiteConnectivityServiceRan5gService converts OAPI to gNMI. +func EncodeToGnmiSiteConnectivityServiceRan5gService( + jsonObj *types.SiteConnectivityServiceRan5gService, needKey bool, removeIndex bool, enterpriseId types.EnterpriseId, parentPath string, params ...string) ( + []*gnmi.Update, error) { + + unchangedAttrs, tgt := utils.CheckForAdditionalProps(jsonObj) + if tgt != nil { + enterpriseId = types.EnterpriseId(*tgt) + } + _ = len(unchangedAttrs) + + updates := make([]*gnmi.Update, 0) + mp := externalRef0.Device{} + // For when the encode is called on the top level object + if len(params) == 1 && strings.HasSuffix(parentPath, params[0]) { + parentPath = strings.Replace(parentPath, params[0], fmt.Sprintf("{%s}", params[0]), 1) + } + + // Property: xapp-endpoint string + if jsonObj.XappEndpoint != nil { // Optional leaf + + paramsXappEndpoint := make([]string, len(params)) + copy(paramsXappEndpoint, params) + stringValXappEndpoint := fmt.Sprintf("%v", *jsonObj.XappEndpoint) + + paramsXappEndpoint = append(paramsXappEndpoint, stringValXappEndpoint) + mpField, err := utils.CreateModelPluginObject(&mp, "SiteConnectivityServiceRan5gServiceXappEndpoint", paramsXappEndpoint...) + if err != nil { + return nil, err + } + update, err := utils.UpdateForElement(mpField, fmt.Sprintf("%s%s", parentPath, "/xapp-endpoint"), paramsXappEndpoint...) + if err != nil { + return nil, err + } + if enterpriseId != "" { + update.Path.Target = string(enterpriseId) + } + updates = append(updates, update) + + } + + if needKey || removeIndex { + reflectKey, err := utils.FindModelPluginObject(mp, "SiteConnectivityServiceRan5gService", params...) + if err != nil { + return nil, err + } + if reflectKey == nil { + return updates, nil + } + reflectType := reflectKey.Type() + reflect2 := reflect.New(reflectType) // Needed so the type can be read to extract list + reflect2.Elem().Set(*reflectKey) + keyMap, err := utils.ExtractGnmiListKeyMap(reflect2.Interface()) + if err != nil { + return nil, err + } + indices := make([]int, 0) + for k, v := range keyMap { + // parentPath = fmt.Sprintf("%s/{%s}", parentPath, k) + for i, u := range updates { + if needKey { + if err := utils.ReplaceUnknownKey(u, k, v, utils.UnknownKey, keyMap); err != nil { + return nil, err + } + } + if removeIndex { + lastElem := u.Path.Elem[len(u.Path.Elem)-1] + if k == lastElem.Name { + indices = append(indices, i) + } + } + } + } + // Only remove the index field if it's not the only field + if removeIndex && len(indices) > 0 && len(updates) > 1 { + updates = utils.RemoveIndexAttributes(updates, indices) + } + } + return updates, nil +} + // EncodeToGnmiSiteDevice converts OAPI to gNMI. func EncodeToGnmiSiteDevice( jsonObj *types.SiteDevice, needKey bool, removeIndex bool, enterpriseId types.EnterpriseId, parentPath string, params ...string) ( @@ -3067,6 +3157,17 @@ func EncodeToGnmiSiteSlice( updates = append(updates, update) } + // Property: xapp SiteSliceXapp + if jsonObj.Xapp != nil { // Optional leaf + + update, err := EncodeToGnmiSiteSliceXapp( + jsonObj.Xapp, false, removeIndex, enterpriseId, + fmt.Sprintf("%s/%s", parentPath, "xapp"), params...) + if err != nil { + return nil, err + } + updates = append(updates, update...) + } if needKey || removeIndex { reflectKey, err := utils.FindModelPluginObject(mp, "SiteSlice", params...) @@ -4065,6 +4166,131 @@ func EncodeToGnmiSiteSlicePriorityTrafficRuleMbr( return updates, nil } +// EncodeToGnmiSiteSliceXapp converts OAPI to gNMI. +func EncodeToGnmiSiteSliceXapp( + jsonObj *types.SiteSliceXapp, needKey bool, removeIndex bool, enterpriseId types.EnterpriseId, parentPath string, params ...string) ( + []*gnmi.Update, error) { + + unchangedAttrs, tgt := utils.CheckForAdditionalProps(jsonObj) + if tgt != nil { + enterpriseId = types.EnterpriseId(*tgt) + } + _ = len(unchangedAttrs) + + updates := make([]*gnmi.Update, 0) + mp := externalRef0.Device{} + // For when the encode is called on the top level object + if len(params) == 1 && strings.HasSuffix(parentPath, params[0]) { + parentPath = strings.Replace(parentPath, params[0], fmt.Sprintf("{%s}", params[0]), 1) + } + + // Property: rrm-dedicated int + if jsonObj.RrmDedicated != nil { // Optional leaf + + paramsRrmDedicated := make([]string, len(params)) + copy(paramsRrmDedicated, params) + stringValRrmDedicated := fmt.Sprintf("%v", *jsonObj.RrmDedicated) + + paramsRrmDedicated = append(paramsRrmDedicated, stringValRrmDedicated) + mpField, err := utils.CreateModelPluginObject(&mp, "SiteSliceXappRrmDedicated", paramsRrmDedicated...) + if err != nil { + return nil, err + } + update, err := utils.UpdateForElement(mpField, fmt.Sprintf("%s%s", parentPath, "/rrm-dedicated"), paramsRrmDedicated...) + if err != nil { + return nil, err + } + if enterpriseId != "" { + update.Path.Target = string(enterpriseId) + } + updates = append(updates, update) + + } + // Property: rrm-max int + if jsonObj.RrmMax != nil { // Optional leaf + + paramsRrmMax := make([]string, len(params)) + copy(paramsRrmMax, params) + stringValRrmMax := fmt.Sprintf("%v", *jsonObj.RrmMax) + + paramsRrmMax = append(paramsRrmMax, stringValRrmMax) + mpField, err := utils.CreateModelPluginObject(&mp, "SiteSliceXappRrmMax", paramsRrmMax...) + if err != nil { + return nil, err + } + update, err := utils.UpdateForElement(mpField, fmt.Sprintf("%s%s", parentPath, "/rrm-max"), paramsRrmMax...) + if err != nil { + return nil, err + } + if enterpriseId != "" { + update.Path.Target = string(enterpriseId) + } + updates = append(updates, update) + + } + // Property: rrm-min int + if jsonObj.RrmMin != nil { // Optional leaf + + paramsRrmMin := make([]string, len(params)) + copy(paramsRrmMin, params) + stringValRrmMin := fmt.Sprintf("%v", *jsonObj.RrmMin) + + paramsRrmMin = append(paramsRrmMin, stringValRrmMin) + mpField, err := utils.CreateModelPluginObject(&mp, "SiteSliceXappRrmMin", paramsRrmMin...) + if err != nil { + return nil, err + } + update, err := utils.UpdateForElement(mpField, fmt.Sprintf("%s%s", parentPath, "/rrm-min"), paramsRrmMin...) + if err != nil { + return nil, err + } + if enterpriseId != "" { + update.Path.Target = string(enterpriseId) + } + updates = append(updates, update) + + } + + if needKey || removeIndex { + reflectKey, err := utils.FindModelPluginObject(mp, "SiteSliceXapp", params...) + if err != nil { + return nil, err + } + if reflectKey == nil { + return updates, nil + } + reflectType := reflectKey.Type() + reflect2 := reflect.New(reflectType) // Needed so the type can be read to extract list + reflect2.Elem().Set(*reflectKey) + keyMap, err := utils.ExtractGnmiListKeyMap(reflect2.Interface()) + if err != nil { + return nil, err + } + indices := make([]int, 0) + for k, v := range keyMap { + // parentPath = fmt.Sprintf("%s/{%s}", parentPath, k) + for i, u := range updates { + if needKey { + if err := utils.ReplaceUnknownKey(u, k, v, utils.UnknownKey, keyMap); err != nil { + return nil, err + } + } + if removeIndex { + lastElem := u.Path.Elem[len(u.Path.Elem)-1] + if k == lastElem.Name { + indices = append(indices, i) + } + } + } + } + // Only remove the index field if it's not the only field + if removeIndex && len(indices) > 0 && len(updates) > 1 { + updates = utils.RemoveIndexAttributes(updates, indices) + } + } + return updates, nil +} + // EncodeToGnmiSiteSmallCell converts OAPI to gNMI. func EncodeToGnmiSiteSmallCell( jsonObj *types.SiteSmallCell, needKey bool, removeIndex bool, enterpriseId types.EnterpriseId, parentPath string, params ...string) ( @@ -5166,6 +5392,8 @@ func EncodeToGnmiEnterpriseId( //Ignoring RequestBodySiteConnectivityServiceCore5g +//Ignoring RequestBodySiteConnectivityServiceRan5gService + //Ignoring RequestBodySiteDevice //Ignoring RequestBodySiteDeviceGroup @@ -5194,6 +5422,12 @@ func EncodeToGnmiEnterpriseId( //Ignoring RequestBodySiteSlicePriorityTrafficRule +//Ignoring RequestBodySiteSlicePriorityTrafficRuleGbr + +//Ignoring RequestBodySiteSlicePriorityTrafficRuleMbr + +//Ignoring RequestBodySiteSliceXapp + //Ignoring RequestBodySiteSmallCell //Ignoring RequestBodySiteUpf diff --git a/pkg/aether_2_1_0/server/aether-2.1.0-impl.go b/pkg/aether_2_1_0/server/aether-2.1.0-impl.go index 0ecdbeb..6249fca 100644 --- a/pkg/aether_2_1_0/server/aether-2.1.0-impl.go +++ b/pkg/aether_2_1_0/server/aether-2.1.0-impl.go @@ -42,8 +42,6 @@ const ( // // SPDX-License-Identifier: Apache-2.0 -//Ignoring AdditionalPropertiesUnchTarget - //Ignoring AdditionalPropertyEnterpriseId //Ignoring AdditionalPropertyUnchanged @@ -781,6 +779,87 @@ func (i *ServerImpl) GnmiPostSiteConnectivityServiceCore5g(ctx context.Context, return utils.ExtractResponseID(gnmiSetResponse) } +// GnmiDeleteSiteConnectivityServiceRan5gService deletes an instance of Site_Connectivity-service_Ran-5g-service. +func (i *ServerImpl) GnmiDeleteSiteConnectivityServiceRan5gService(ctx context.Context, + openApiPath string, enterpriseId externalRef1.EnterpriseId, args ...string) (*string, error) { + + // check to see if the item exists before deleting it + response, err := i.GnmiGetSiteConnectivityServiceRan5gService(ctx, openApiPath, enterpriseId, args...) + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + log.Infof("Item at path %s with args %v not found", openApiPath, args) + return nil, echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("item at path %s with args %v does not exists", openApiPath, args)) + } + + gnmiSet, err := utils.NewGnmiSetDeleteRequest(openApiPath, string(enterpriseId), args...) + if err != nil { + return nil, err + } + log.Infof("gnmiSetRequest %s", gnmiSet.String()) + gnmiSetResponse, err := i.GnmiClient.Set(ctx, gnmiSet) + if err != nil { + return nil, err + } + + return utils.ExtractResponseID(gnmiSetResponse) +} + +// GnmiGetSiteConnectivityServiceRan5gService returns an instance of Site_Connectivity-service_Ran-5g-service. +func (i *ServerImpl) GnmiGetSiteConnectivityServiceRan5gService(ctx context.Context, + openApiPath string, enterpriseId externalRef1.EnterpriseId, args ...string) (*externalRef1.SiteConnectivityServiceRan5gService, error) { + + gnmiGet, err := utils.NewGnmiGetRequest(openApiPath, string(enterpriseId), args...) + if err != nil { + return nil, err + } + log.Infof("gnmiGetRequest %s", gnmiGet.String()) + gnmiVal, err := utils.GetResponseUpdate(i.GnmiClient.Get(ctx, gnmiGet)) + if err != nil { + return nil, err + } + if gnmiVal == nil { + return nil, nil + } + gnmiJsonVal, ok := gnmiVal.Value.(*gnmi.TypedValue_JsonVal) + if !ok { + return nil, fmt.Errorf("unexpected type of reply from server %v", gnmiVal.Value) + } + + log.Debugf("gNMI Json %s", string(gnmiJsonVal.JsonVal)) + var gnmiResponse externalRef0.Device + if err = externalRef0.Unmarshal(gnmiJsonVal.JsonVal, &gnmiResponse); err != nil { + return nil, fmt.Errorf("error unmarshalling gnmiResponse %v", err) + } + mpd := ModelPluginDevice{ + device: gnmiResponse, + } + + return mpd.ToSiteConnectivityServiceRan5gService(args...) +} + +// GnmiPostSiteConnectivityServiceRan5gService adds an instance of Site_Connectivity-service_Ran-5g-service. +func (i *ServerImpl) GnmiPostSiteConnectivityServiceRan5gService(ctx context.Context, body []byte, + openApiPath string, enterpriseId externalRef1.EnterpriseId, args ...string) (*string, error) { + + jsonObj := new(externalRef1.SiteConnectivityServiceRan5gService) + if err := json.Unmarshal(body, jsonObj); err != nil { + return nil, fmt.Errorf("unable to unmarshal JSON as externalRef1.Site_Connectivity-service_Ran-5g-service %v", err) + } + gnmiUpdates, err := EncodeToGnmiSiteConnectivityServiceRan5gService(jsonObj, false, false, enterpriseId, "", args...) + if err != nil { + return nil, fmt.Errorf("unable to convert externalRef1.SiteConnectivityServiceRan5gService to gNMI %v", err) + } + gnmiSet, err := utils.NewGnmiSetUpdateRequestUpdates(openApiPath, string(enterpriseId), gnmiUpdates, args...) + if err != nil { + return nil, err + } + log.Infof("gnmiSetRequest %s", gnmiSet.String()) + gnmiSetResponse, err := i.GnmiClient.Set(ctx, gnmiSet) + if err != nil { + return nil, err + } + return utils.ExtractResponseID(gnmiSetResponse) +} + // GnmiDeleteSiteDevice deletes an instance of Site_Device. func (i *ServerImpl) GnmiDeleteSiteDevice(ctx context.Context, openApiPath string, enterpriseId externalRef1.EnterpriseId, args ...string) (*string, error) { @@ -3130,6 +3209,87 @@ func (i *ServerImpl) GnmiPostSiteSlicePriorityTrafficRuleMbr(ctx context.Context return utils.ExtractResponseID(gnmiSetResponse) } +// GnmiDeleteSiteSliceXapp deletes an instance of Site_Slice_Xapp. +func (i *ServerImpl) GnmiDeleteSiteSliceXapp(ctx context.Context, + openApiPath string, enterpriseId externalRef1.EnterpriseId, args ...string) (*string, error) { + + // check to see if the item exists before deleting it + response, err := i.GnmiGetSiteSliceXapp(ctx, openApiPath, enterpriseId, args...) + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + log.Infof("Item at path %s with args %v not found", openApiPath, args) + return nil, echo.NewHTTPError(http.StatusNotFound, fmt.Sprintf("item at path %s with args %v does not exists", openApiPath, args)) + } + + gnmiSet, err := utils.NewGnmiSetDeleteRequest(openApiPath, string(enterpriseId), args...) + if err != nil { + return nil, err + } + log.Infof("gnmiSetRequest %s", gnmiSet.String()) + gnmiSetResponse, err := i.GnmiClient.Set(ctx, gnmiSet) + if err != nil { + return nil, err + } + + return utils.ExtractResponseID(gnmiSetResponse) +} + +// GnmiGetSiteSliceXapp returns an instance of Site_Slice_Xapp. +func (i *ServerImpl) GnmiGetSiteSliceXapp(ctx context.Context, + openApiPath string, enterpriseId externalRef1.EnterpriseId, args ...string) (*externalRef1.SiteSliceXapp, error) { + + gnmiGet, err := utils.NewGnmiGetRequest(openApiPath, string(enterpriseId), args...) + if err != nil { + return nil, err + } + log.Infof("gnmiGetRequest %s", gnmiGet.String()) + gnmiVal, err := utils.GetResponseUpdate(i.GnmiClient.Get(ctx, gnmiGet)) + if err != nil { + return nil, err + } + if gnmiVal == nil { + return nil, nil + } + gnmiJsonVal, ok := gnmiVal.Value.(*gnmi.TypedValue_JsonVal) + if !ok { + return nil, fmt.Errorf("unexpected type of reply from server %v", gnmiVal.Value) + } + + log.Debugf("gNMI Json %s", string(gnmiJsonVal.JsonVal)) + var gnmiResponse externalRef0.Device + if err = externalRef0.Unmarshal(gnmiJsonVal.JsonVal, &gnmiResponse); err != nil { + return nil, fmt.Errorf("error unmarshalling gnmiResponse %v", err) + } + mpd := ModelPluginDevice{ + device: gnmiResponse, + } + + return mpd.ToSiteSliceXapp(args...) +} + +// GnmiPostSiteSliceXapp adds an instance of Site_Slice_Xapp. +func (i *ServerImpl) GnmiPostSiteSliceXapp(ctx context.Context, body []byte, + openApiPath string, enterpriseId externalRef1.EnterpriseId, args ...string) (*string, error) { + + jsonObj := new(externalRef1.SiteSliceXapp) + if err := json.Unmarshal(body, jsonObj); err != nil { + return nil, fmt.Errorf("unable to unmarshal JSON as externalRef1.Site_Slice_Xapp %v", err) + } + gnmiUpdates, err := EncodeToGnmiSiteSliceXapp(jsonObj, false, false, enterpriseId, "", args...) + if err != nil { + return nil, fmt.Errorf("unable to convert externalRef1.SiteSliceXapp to gNMI %v", err) + } + gnmiSet, err := utils.NewGnmiSetUpdateRequestUpdates(openApiPath, string(enterpriseId), gnmiUpdates, args...) + if err != nil { + return nil, err + } + log.Infof("gnmiSetRequest %s", gnmiSet.String()) + gnmiSetResponse, err := i.GnmiClient.Set(ctx, gnmiSet) + if err != nil { + return nil, err + } + return utils.ExtractResponseID(gnmiSetResponse) +} + // GnmiDeleteSiteSmallCell deletes an instance of Site_Small-cell. func (i *ServerImpl) GnmiDeleteSiteSmallCell(ctx context.Context, openApiPath string, enterpriseId externalRef1.EnterpriseId, args ...string) (*string, error) { @@ -3875,6 +4035,8 @@ func (i *ServerImpl) GnmiPostTrafficClassList(ctx context.Context, body []byte, //Ignoring RequestBodySiteConnectivityServiceCore5g +//Ignoring RequestBodySiteConnectivityServiceRan5gService + //Ignoring RequestBodySiteDevice //Ignoring RequestBodySiteDeviceGroup @@ -3903,6 +4065,12 @@ func (i *ServerImpl) GnmiPostTrafficClassList(ctx context.Context, body []byte, //Ignoring RequestBodySiteSlicePriorityTrafficRule +//Ignoring RequestBodySiteSlicePriorityTrafficRuleGbr + +//Ignoring RequestBodySiteSlicePriorityTrafficRuleMbr + +//Ignoring RequestBodySiteSliceXapp + //Ignoring RequestBodySiteSmallCell //Ignoring RequestBodySiteUpf @@ -3914,7 +4082,6 @@ func (i *ServerImpl) GnmiPostTrafficClassList(ctx context.Context, body []byte, //Ignoring RequestBodyTrafficClass type Translator interface { - toAdditionalPropertiesUnchTarget(args ...string) (*externalRef1.AdditionalPropertiesUnchTarget, error) toAdditionalPropertyEnterpriseId(args ...string) (*externalRef1.AdditionalPropertyEnterpriseId, error) toAdditionalPropertyUnchanged(args ...string) (*externalRef1.AdditionalPropertyUnchanged, error) toApplication(args ...string) (*externalRef1.Application, error) @@ -3928,6 +4095,7 @@ type Translator interface { toSiteConnectivityService(args ...string) (*externalRef1.SiteConnectivityService, error) toSiteConnectivityServiceCore4g(args ...string) (*externalRef1.SiteConnectivityServiceCore4g, error) toSiteConnectivityServiceCore5g(args ...string) (*externalRef1.SiteConnectivityServiceCore5g, error) + toSiteConnectivityServiceRan5gService(args ...string) (*externalRef1.SiteConnectivityServiceRan5gService, error) toSiteDevice(args ...string) (*externalRef1.SiteDevice, error) toSiteDeviceGroup(args ...string) (*externalRef1.SiteDeviceGroup, error) toSiteDeviceGroupDevice(args ...string) (*externalRef1.SiteDeviceGroupDevice, error) @@ -3957,6 +4125,7 @@ type Translator interface { toSiteSlicePriorityTrafficRuleGbr(args ...string) (*externalRef1.SiteSlicePriorityTrafficRuleGbr, error) toSiteSlicePriorityTrafficRuleList(args ...string) (*externalRef1.SiteSlicePriorityTrafficRuleList, error) toSiteSlicePriorityTrafficRuleMbr(args ...string) (*externalRef1.SiteSlicePriorityTrafficRuleMbr, error) + toSiteSliceXapp(args ...string) (*externalRef1.SiteSliceXapp, error) toSiteSmallCell(args ...string) (*externalRef1.SiteSmallCell, error) toSiteSmallCellList(args ...string) (*externalRef1.SiteSmallCellList, error) toSiteUpf(args ...string) (*externalRef1.SiteUpf, error) @@ -4621,6 +4790,81 @@ func (i *ServerImpl) PostSiteConnectivityServiceCore5g(ctx echo.Context, enterpr return ctx.JSON(http.StatusOK, response) } +// DeleteSiteConnectivityServiceRan5gService impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service +func (i *ServerImpl) DeleteSiteConnectivityServiceRan5gService(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response DELETE 200 OK + extension100, err := i.GnmiDeleteSiteConnectivityServiceRan5gService(gnmiCtx, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service", enterpriseId, siteId) + if err == nil { + log.Infof("Delete succeded %s", *extension100) + return ctx.JSON(http.StatusOK, extension100) + } + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("DeleteSiteConnectivityServiceRan5gService") + return ctx.JSON(http.StatusOK, response) +} + +// GetSiteConnectivityServiceRan5gService impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service +func (i *ServerImpl) GetSiteConnectivityServiceRan5gService(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response GET OK 200 + response, err = i.GnmiGetSiteConnectivityServiceRan5gService(gnmiCtx, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service", enterpriseId, siteId) + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("GetSiteConnectivityServiceRan5gService") + return ctx.JSON(http.StatusOK, response) +} + +// PostSiteConnectivityServiceRan5gService impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service +func (i *ServerImpl) PostSiteConnectivityServiceRan5gService(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response created + body, err := utils.ReadRequestBody(ctx.Request().Body) + if err != nil { + return err + } + extension100, err := i.GnmiPostSiteConnectivityServiceRan5gService(gnmiCtx, body, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service", enterpriseId, siteId) + if err == nil { + log.Infof("Post succeded %s", *extension100) + return ctx.JSON(http.StatusCreated, extension100) + } + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("PostSiteConnectivityServiceRan5gService") + return ctx.JSON(http.StatusOK, response) +} + // GetSiteDeviceList impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/device func (i *ServerImpl) GetSiteDeviceList(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string) error { var response interface{} @@ -6091,6 +6335,156 @@ func (i *ServerImpl) GetSiteSlicePriorityTrafficRuleEndpointValuesLeafref(ctx ec return ctx.JSON(http.StatusOK, response) } +// DeleteSiteSlicePriorityTrafficRuleGbr impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr +func (i *ServerImpl) DeleteSiteSlicePriorityTrafficRuleGbr(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response DELETE 200 OK + extension100, err := i.GnmiDeleteSiteSlicePriorityTrafficRuleGbr(gnmiCtx, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr", enterpriseId, siteId, sliceId, priorityTrafficRuleId) + if err == nil { + log.Infof("Delete succeded %s", *extension100) + return ctx.JSON(http.StatusOK, extension100) + } + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("DeleteSiteSlicePriorityTrafficRuleGbr") + return ctx.JSON(http.StatusOK, response) +} + +// GetSiteSlicePriorityTrafficRuleGbr impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr +func (i *ServerImpl) GetSiteSlicePriorityTrafficRuleGbr(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response GET OK 200 + response, err = i.GnmiGetSiteSlicePriorityTrafficRuleGbr(gnmiCtx, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr", enterpriseId, siteId, sliceId, priorityTrafficRuleId) + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("GetSiteSlicePriorityTrafficRuleGbr") + return ctx.JSON(http.StatusOK, response) +} + +// PostSiteSlicePriorityTrafficRuleGbr impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr +func (i *ServerImpl) PostSiteSlicePriorityTrafficRuleGbr(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response created + body, err := utils.ReadRequestBody(ctx.Request().Body) + if err != nil { + return err + } + extension100, err := i.GnmiPostSiteSlicePriorityTrafficRuleGbr(gnmiCtx, body, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr", enterpriseId, siteId, sliceId, priorityTrafficRuleId) + if err == nil { + log.Infof("Post succeded %s", *extension100) + return ctx.JSON(http.StatusCreated, extension100) + } + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("PostSiteSlicePriorityTrafficRuleGbr") + return ctx.JSON(http.StatusOK, response) +} + +// DeleteSiteSlicePriorityTrafficRuleMbr impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr +func (i *ServerImpl) DeleteSiteSlicePriorityTrafficRuleMbr(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response DELETE 200 OK + extension100, err := i.GnmiDeleteSiteSlicePriorityTrafficRuleMbr(gnmiCtx, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr", enterpriseId, siteId, sliceId, priorityTrafficRuleId) + if err == nil { + log.Infof("Delete succeded %s", *extension100) + return ctx.JSON(http.StatusOK, extension100) + } + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("DeleteSiteSlicePriorityTrafficRuleMbr") + return ctx.JSON(http.StatusOK, response) +} + +// GetSiteSlicePriorityTrafficRuleMbr impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr +func (i *ServerImpl) GetSiteSlicePriorityTrafficRuleMbr(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response GET OK 200 + response, err = i.GnmiGetSiteSlicePriorityTrafficRuleMbr(gnmiCtx, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr", enterpriseId, siteId, sliceId, priorityTrafficRuleId) + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("GetSiteSlicePriorityTrafficRuleMbr") + return ctx.JSON(http.StatusOK, response) +} + +// PostSiteSlicePriorityTrafficRuleMbr impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr +func (i *ServerImpl) PostSiteSlicePriorityTrafficRuleMbr(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response created + body, err := utils.ReadRequestBody(ctx.Request().Body) + if err != nil { + return err + } + extension100, err := i.GnmiPostSiteSlicePriorityTrafficRuleMbr(gnmiCtx, body, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr", enterpriseId, siteId, sliceId, priorityTrafficRuleId) + if err == nil { + log.Infof("Post succeded %s", *extension100) + return ctx.JSON(http.StatusCreated, extension100) + } + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("PostSiteSlicePriorityTrafficRuleMbr") + return ctx.JSON(http.StatusOK, response) +} + // GetSiteSlicePriorityTrafficRuleTrafficClassValuesLeafref impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/traffic-class/values func (i *ServerImpl) GetSiteSlicePriorityTrafficRuleTrafficClassValuesLeafref(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error { var response interface{} @@ -6133,6 +6527,81 @@ func (i *ServerImpl) GetSiteSliceUpfValuesLeafref(ctx echo.Context, enterpriseId return ctx.JSON(http.StatusOK, response) } +// DeleteSiteSliceXapp impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp +func (i *ServerImpl) DeleteSiteSliceXapp(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response DELETE 200 OK + extension100, err := i.GnmiDeleteSiteSliceXapp(gnmiCtx, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp", enterpriseId, siteId, sliceId) + if err == nil { + log.Infof("Delete succeded %s", *extension100) + return ctx.JSON(http.StatusOK, extension100) + } + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("DeleteSiteSliceXapp") + return ctx.JSON(http.StatusOK, response) +} + +// GetSiteSliceXapp impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp +func (i *ServerImpl) GetSiteSliceXapp(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response GET OK 200 + response, err = i.GnmiGetSiteSliceXapp(gnmiCtx, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp", enterpriseId, siteId, sliceId) + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("GetSiteSliceXapp") + return ctx.JSON(http.StatusOK, response) +} + +// PostSiteSliceXapp impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp +func (i *ServerImpl) PostSiteSliceXapp(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string, sliceId string) error { + var response interface{} + var err error + + gnmiCtx, cancel := utils.NewGnmiContext(ctx, i.GnmiTimeout) + defer cancel() + // Response created + body, err := utils.ReadRequestBody(ctx.Request().Body) + if err != nil { + return err + } + extension100, err := i.GnmiPostSiteSliceXapp(gnmiCtx, body, "/aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp", enterpriseId, siteId, sliceId) + if err == nil { + log.Infof("Post succeded %s", *extension100) + return ctx.JSON(http.StatusCreated, extension100) + } + if err != nil { + return utils.ConvertGrpcError(err) + } + // It's not enough to check if response==nil - see https://medium.com/@glucn/golang-an-interface-holding-a-nil-value-is-not-nil-bb151f472cc7 + if reflect.ValueOf(response).Kind() == reflect.Ptr && reflect.ValueOf(response).IsNil() { + return ctx.NoContent(http.StatusNotFound) + } + + log.Infof("PostSiteSliceXapp") + return ctx.JSON(http.StatusOK, response) +} + // GetSiteSmallCellList impl of gNMI access at /aether/v2.1.x/{enterprise-id}/site/{site-id}/small-cell func (i *ServerImpl) GetSiteSmallCellList(ctx echo.Context, enterpriseId externalRef1.EnterpriseId, siteId string) error { var response interface{} diff --git a/pkg/aether_2_1_0/server/aether-2.1.0-server.go b/pkg/aether_2_1_0/server/aether-2.1.0-server.go index 850c5e7..c6f3aee 100644 --- a/pkg/aether_2_1_0/server/aether-2.1.0-server.go +++ b/pkg/aether_2_1_0/server/aether-2.1.0-server.go @@ -92,6 +92,15 @@ type ServerInterface interface { // POST /site/{site-id}/connectivity-service/core-5g // (POST /aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/core-5g) PostSiteConnectivityServiceCore5g(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string) error + // DELETE /site/{site-id}/connectivity-service/ran-5g-service + // (DELETE /aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service) + DeleteSiteConnectivityServiceRan5gService(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string) error + // GET /site/{site-id}/connectivity-service/ran-5g-service Container + // (GET /aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service) + GetSiteConnectivityServiceRan5gService(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string) error + // POST /site/{site-id}/connectivity-service/ran-5g-service + // (POST /aether/v2.1.x/{enterprise-id}/site/{site-id}/connectivity-service/ran-5g-service) + PostSiteConnectivityServiceRan5gService(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string) error // GET /site/{site-id}/device List // (GET /aether/v2.1.x/{enterprise-id}/site/{site-id}/device) GetSiteDeviceList(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string) error @@ -278,12 +287,39 @@ type ServerInterface interface { // GET /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/endpoint/values Leafref // (GET /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/endpoint/values) GetSiteSlicePriorityTrafficRuleEndpointValuesLeafref(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error + // DELETE /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr + // (DELETE /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr) + DeleteSiteSlicePriorityTrafficRuleGbr(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error + // GET /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr Container + // (GET /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr) + GetSiteSlicePriorityTrafficRuleGbr(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error + // POST /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr + // (POST /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/gbr) + PostSiteSlicePriorityTrafficRuleGbr(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error + // DELETE /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr + // (DELETE /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr) + DeleteSiteSlicePriorityTrafficRuleMbr(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error + // GET /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr Container + // (GET /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr) + GetSiteSlicePriorityTrafficRuleMbr(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error + // POST /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr + // (POST /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/mbr) + PostSiteSlicePriorityTrafficRuleMbr(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error // GET /site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/traffic-class/values Leafref // (GET /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/priority-traffic-rule/{priority-traffic-rule-id}/traffic-class/values) GetSiteSlicePriorityTrafficRuleTrafficClassValuesLeafref(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string, priorityTrafficRuleId string) error // GET /site/{site-id}/slice/{slice-id}/upf/values Leafref // (GET /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/upf/values) GetSiteSliceUpfValuesLeafref(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string) error + // DELETE /site/{site-id}/slice/{slice-id}/xapp + // (DELETE /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp) + DeleteSiteSliceXapp(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string) error + // GET /site/{site-id}/slice/{slice-id}/xapp Container + // (GET /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp) + GetSiteSliceXapp(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string) error + // POST /site/{site-id}/slice/{slice-id}/xapp + // (POST /aether/v2.1.x/{enterprise-id}/site/{site-id}/slice/{slice-id}/xapp) + PostSiteSliceXapp(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string, sliceId string) error // GET /site/{site-id}/small-cell List // (GET /aether/v2.1.x/{enterprise-id}/site/{site-id}/small-cell) GetSiteSmallCellList(ctx echo.Context, enterpriseId externalRef0.EnterpriseId, siteId string) error @@ -693,6 +729,45 @@ func (w *serverInterfaceWrapper) PostSiteConnectivityServiceCore5g(ctx echo.Cont return w.handler.PostSiteConnectivityServiceCore5g(ctx, enterpriseId, siteId) } +// DeleteSiteConnectivityServiceRan5gService converts echo context to params. +func (w *serverInterfaceWrapper) DeleteSiteConnectivityServiceRan5gService(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.DeleteSiteConnectivityServiceRan5gService(ctx, enterpriseId, siteId) +} + +// GetSiteConnectivityServiceRan5gService converts echo context to params. +func (w *serverInterfaceWrapper) GetSiteConnectivityServiceRan5gService(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.GetSiteConnectivityServiceRan5gService(ctx, enterpriseId, siteId) +} + +// PostSiteConnectivityServiceRan5gService converts echo context to params. +func (w *serverInterfaceWrapper) PostSiteConnectivityServiceRan5gService(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.PostSiteConnectivityServiceRan5gService(ctx, enterpriseId, siteId) +} + // GetSiteDeviceList converts echo context to params. func (w *serverInterfaceWrapper) GetSiteDeviceList(ctx echo.Context) error { // ------------- Path parameter "enterprise-id" ------------- @@ -1703,6 +1778,120 @@ func (w *serverInterfaceWrapper) GetSiteSlicePriorityTrafficRuleEndpointValuesLe return w.handler.GetSiteSlicePriorityTrafficRuleEndpointValuesLeafref(ctx, enterpriseId, siteId, sliceId, priorityTrafficRuleId) } +// DeleteSiteSlicePriorityTrafficRuleGbr converts echo context to params. +func (w *serverInterfaceWrapper) DeleteSiteSlicePriorityTrafficRuleGbr(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + // ------------- Path parameter "slice-id" ------------- + var sliceId string + sliceId = ctx.Param("slice-id") + // ------------- Path parameter "priority-traffic-rule-id" ------------- + var priorityTrafficRuleId string + priorityTrafficRuleId = ctx.Param("priority-traffic-rule-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.DeleteSiteSlicePriorityTrafficRuleGbr(ctx, enterpriseId, siteId, sliceId, priorityTrafficRuleId) +} + +// GetSiteSlicePriorityTrafficRuleGbr converts echo context to params. +func (w *serverInterfaceWrapper) GetSiteSlicePriorityTrafficRuleGbr(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + // ------------- Path parameter "slice-id" ------------- + var sliceId string + sliceId = ctx.Param("slice-id") + // ------------- Path parameter "priority-traffic-rule-id" ------------- + var priorityTrafficRuleId string + priorityTrafficRuleId = ctx.Param("priority-traffic-rule-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.GetSiteSlicePriorityTrafficRuleGbr(ctx, enterpriseId, siteId, sliceId, priorityTrafficRuleId) +} + +// PostSiteSlicePriorityTrafficRuleGbr converts echo context to params. +func (w *serverInterfaceWrapper) PostSiteSlicePriorityTrafficRuleGbr(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + // ------------- Path parameter "slice-id" ------------- + var sliceId string + sliceId = ctx.Param("slice-id") + // ------------- Path parameter "priority-traffic-rule-id" ------------- + var priorityTrafficRuleId string + priorityTrafficRuleId = ctx.Param("priority-traffic-rule-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.PostSiteSlicePriorityTrafficRuleGbr(ctx, enterpriseId, siteId, sliceId, priorityTrafficRuleId) +} + +// DeleteSiteSlicePriorityTrafficRuleMbr converts echo context to params. +func (w *serverInterfaceWrapper) DeleteSiteSlicePriorityTrafficRuleMbr(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + // ------------- Path parameter "slice-id" ------------- + var sliceId string + sliceId = ctx.Param("slice-id") + // ------------- Path parameter "priority-traffic-rule-id" ------------- + var priorityTrafficRuleId string + priorityTrafficRuleId = ctx.Param("priority-traffic-rule-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.DeleteSiteSlicePriorityTrafficRuleMbr(ctx, enterpriseId, siteId, sliceId, priorityTrafficRuleId) +} + +// GetSiteSlicePriorityTrafficRuleMbr converts echo context to params. +func (w *serverInterfaceWrapper) GetSiteSlicePriorityTrafficRuleMbr(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + // ------------- Path parameter "slice-id" ------------- + var sliceId string + sliceId = ctx.Param("slice-id") + // ------------- Path parameter "priority-traffic-rule-id" ------------- + var priorityTrafficRuleId string + priorityTrafficRuleId = ctx.Param("priority-traffic-rule-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.GetSiteSlicePriorityTrafficRuleMbr(ctx, enterpriseId, siteId, sliceId, priorityTrafficRuleId) +} + +// PostSiteSlicePriorityTrafficRuleMbr converts echo context to params. +func (w *serverInterfaceWrapper) PostSiteSlicePriorityTrafficRuleMbr(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + // ------------- Path parameter "slice-id" ------------- + var sliceId string + sliceId = ctx.Param("slice-id") + // ------------- Path parameter "priority-traffic-rule-id" ------------- + var priorityTrafficRuleId string + priorityTrafficRuleId = ctx.Param("priority-traffic-rule-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.PostSiteSlicePriorityTrafficRuleMbr(ctx, enterpriseId, siteId, sliceId, priorityTrafficRuleId) +} + // GetSiteSlicePriorityTrafficRuleTrafficClassValuesLeafref converts echo context to params. func (w *serverInterfaceWrapper) GetSiteSlicePriorityTrafficRuleTrafficClassValuesLeafref(ctx echo.Context) error { // ------------- Path parameter "enterprise-id" ------------- @@ -1738,6 +1927,54 @@ func (w *serverInterfaceWrapper) GetSiteSliceUpfValuesLeafref(ctx echo.Context) return w.handler.GetSiteSliceUpfValuesLeafref(ctx, enterpriseId, siteId, sliceId) } +// DeleteSiteSliceXapp converts echo context to params. +func (w *serverInterfaceWrapper) DeleteSiteSliceXapp(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + // ------------- Path parameter "slice-id" ------------- + var sliceId string + sliceId = ctx.Param("slice-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.DeleteSiteSliceXapp(ctx, enterpriseId, siteId, sliceId) +} + +// GetSiteSliceXapp converts echo context to params. +func (w *serverInterfaceWrapper) GetSiteSliceXapp(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + // ------------- Path parameter "slice-id" ------------- + var sliceId string + sliceId = ctx.Param("slice-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.GetSiteSliceXapp(ctx, enterpriseId, siteId, sliceId) +} + +// PostSiteSliceXapp converts echo context to params. +func (w *serverInterfaceWrapper) PostSiteSliceXapp(ctx echo.Context) error { + // ------------- Path parameter "enterprise-id" ------------- + var enterpriseId externalRef0.EnterpriseId + enterpriseId = externalRef0.EnterpriseId(ctx.Param("enterprise-id")) + // ------------- Path parameter "site-id" ------------- + var siteId string + siteId = ctx.Param("site-id") + // ------------- Path parameter "slice-id" ------------- + var sliceId string + sliceId = ctx.Param("slice-id") + + // Invoke the callback with all the unmarshalled arguments + return w.handler.PostSiteSliceXapp(ctx, enterpriseId, siteId, sliceId) +} + // GetSiteSmallCellList converts echo context to params. func (w *serverInterfaceWrapper) GetSiteSmallCellList(ctx echo.Context) error { // ------------- Path parameter "enterprise-id" ------------- @@ -2052,6 +2289,9 @@ func RegisterHandlers(router EchoRouter, si ServerInterface, validateResponse bo router.DELETE("/aether/v2.1.x/:enterprise-id/site/:site-id/connectivity-service/core-5g", wrapper.DeleteSiteConnectivityServiceCore5g, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/connectivity-service/core-5g", wrapper.GetSiteConnectivityServiceCore5g, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.POST("/aether/v2.1.x/:enterprise-id/site/:site-id/connectivity-service/core-5g", wrapper.PostSiteConnectivityServiceCore5g, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.DELETE("/aether/v2.1.x/:enterprise-id/site/:site-id/connectivity-service/ran-5g-service", wrapper.DeleteSiteConnectivityServiceRan5gService, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/connectivity-service/ran-5g-service", wrapper.GetSiteConnectivityServiceRan5gService, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.POST("/aether/v2.1.x/:enterprise-id/site/:site-id/connectivity-service/ran-5g-service", wrapper.PostSiteConnectivityServiceRan5gService, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/device", wrapper.GetSiteDeviceList, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/device-group", wrapper.GetSiteDeviceGroupList, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.DELETE("/aether/v2.1.x/:enterprise-id/site/:site-id/device-group/:device-group-id", wrapper.DeleteSiteDeviceGroup, openapi3mw.ValidateOpenapi3(openApiDefinition)) @@ -2114,8 +2354,17 @@ func RegisterHandlers(router EchoRouter, si ServerInterface, validateResponse bo router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/application/values", wrapper.GetSiteSlicePriorityTrafficRuleApplicationValuesLeafref, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/device/values", wrapper.GetSiteSlicePriorityTrafficRuleDeviceValuesLeafref, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/endpoint/values", wrapper.GetSiteSlicePriorityTrafficRuleEndpointValuesLeafref, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.DELETE("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/gbr", wrapper.DeleteSiteSlicePriorityTrafficRuleGbr, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/gbr", wrapper.GetSiteSlicePriorityTrafficRuleGbr, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.POST("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/gbr", wrapper.PostSiteSlicePriorityTrafficRuleGbr, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.DELETE("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/mbr", wrapper.DeleteSiteSlicePriorityTrafficRuleMbr, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/mbr", wrapper.GetSiteSlicePriorityTrafficRuleMbr, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.POST("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/mbr", wrapper.PostSiteSlicePriorityTrafficRuleMbr, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/priority-traffic-rule/:priority-traffic-rule-id/traffic-class/values", wrapper.GetSiteSlicePriorityTrafficRuleTrafficClassValuesLeafref, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/upf/values", wrapper.GetSiteSliceUpfValuesLeafref, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.DELETE("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/xapp", wrapper.DeleteSiteSliceXapp, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/xapp", wrapper.GetSiteSliceXapp, openapi3mw.ValidateOpenapi3(openApiDefinition)) + router.POST("/aether/v2.1.x/:enterprise-id/site/:site-id/slice/:slice-id/xapp", wrapper.PostSiteSliceXapp, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/small-cell", wrapper.GetSiteSmallCellList, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.DELETE("/aether/v2.1.x/:enterprise-id/site/:site-id/small-cell/:small-cell-id", wrapper.DeleteSiteSmallCell, openapi3mw.ValidateOpenapi3(openApiDefinition)) router.GET("/aether/v2.1.x/:enterprise-id/site/:site-id/small-cell/:small-cell-id", wrapper.GetSiteSmallCell, openapi3mw.ValidateOpenapi3(openApiDefinition)) diff --git a/pkg/aether_2_1_0/server/aether-2.1.0-spec.go b/pkg/aether_2_1_0/server/aether-2.1.0-spec.go index 90307c7..d285ef9 100644 --- a/pkg/aether_2_1_0/server/aether-2.1.0-spec.go +++ b/pkg/aether_2_1_0/server/aether-2.1.0-spec.go @@ -19,141 +19,151 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "DQAA//9McquGvFgBAA==", + "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", + "nby1IbWmbD89Pf1/AAAA//8IuOU2KnsBAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/pkg/aether_2_1_0/types/aether-2.1.0-types.go b/pkg/aether_2_1_0/types/aether-2.1.0-types.go index c906e0b..9f9c96d 100644 --- a/pkg/aether_2_1_0/types/aether-2.1.0-types.go +++ b/pkg/aether_2_1_0/types/aether-2.1.0-types.go @@ -18,16 +18,6 @@ const ( SiteSliceConnectivityServiceG1 SiteSliceConnectivityService = "5g" ) -// both the additional property 'unchanged' and the 'enterprise-id' -type AdditionalPropertiesUnchTarget struct { - - // an override of the enterprise-id (target) - EnterpriseId *string `json:"enterprise-id,omitempty"` - - // A comma seperated list of unchanged mandatory attribute names - Unchanged *string `json:"unchanged,omitempty"` -} - // Optionally specify a enterprise-id other than the default (only on PATCH method) type AdditionalPropertyEnterpriseId struct { @@ -58,8 +48,8 @@ type Application struct { DisplayName *string `json:"display-name,omitempty"` // list for endpoint (list) - Endpoint *ApplicationEndpointList `json:"endpoint,omitempty"` - AdditionalProperties map[string]AdditionalPropertiesUnchTarget `json:"-"` + Endpoint *ApplicationEndpointList `json:"endpoint,omitempty"` + AdditionalProperties map[string]AdditionalPropertyUnchanged `json:"-"` } // list for endpoint (single) @@ -172,6 +162,9 @@ type SiteConnectivityService struct { // The 5g core endpoint Core5g *SiteConnectivityServiceCore5g `json:"core-5g,omitempty"` + + // Connectivity to the xApp + Ran5gService *SiteConnectivityServiceRan5gService `json:"ran-5g-service,omitempty"` } // The 4g core endpoint @@ -194,6 +187,13 @@ type SiteConnectivityServiceCore5g struct { Endpoint *string `json:"endpoint,omitempty"` } +// Connectivity to the xApp +type SiteConnectivityServiceRan5gService struct { + + // xApp Endpoint URL + XappEndpoint *string `json:"xapp-endpoint,omitempty"` +} + // List of devices (single) type SiteDevice struct { @@ -435,7 +435,10 @@ type SiteSlice struct { Sst string `json:"sst"` // Link to user plane that implements this vcf - Upf *string `json:"upf,omitempty"` + Upf *string `json:"upf,omitempty"` + + // Params related to xApp + Xapp *SiteSliceXapp `json:"xapp,omitempty"` AdditionalProperties map[string]AdditionalPropertyUnchanged `json:"-"` } @@ -514,10 +517,10 @@ type SiteSlicePriorityTrafficRule struct { // Link to endpoint in application Endpoint string `json:"endpoint"` - // For choice bitrate:gbr-case + // Per-Device per-Application GBR (Guaranteed BitRate) in bps Gbr *SiteSlicePriorityTrafficRuleGbr `json:"gbr,omitempty"` - // For choice bitrate:mbr-case + // Per-Device per-Application MBR (Maximum BitRate) in bps Mbr *SiteSlicePriorityTrafficRuleMbr `json:"mbr,omitempty"` // ID for this priority traffic class. @@ -528,7 +531,7 @@ type SiteSlicePriorityTrafficRule struct { AdditionalProperties map[string]AdditionalPropertyUnchanged `json:"-"` } -// For choice bitrate:gbr-case +// Per-Device per-Application GBR (Guaranteed BitRate) in bps type SiteSlicePriorityTrafficRuleGbr struct { // Per-Device per application downlink data rate in bps @@ -541,7 +544,7 @@ type SiteSlicePriorityTrafficRuleGbr struct { // List of priority traffic rules (list) type SiteSlicePriorityTrafficRuleList []SiteSlicePriorityTrafficRule -// For choice bitrate:mbr-case +// Per-Device per-Application MBR (Maximum BitRate) in bps type SiteSlicePriorityTrafficRuleMbr struct { // Per-Device per application downlink data rate in bps @@ -551,6 +554,19 @@ type SiteSlicePriorityTrafficRuleMbr struct { Uplink *int64 `json:"uplink,omitempty"` } +// Params related to xApp +type SiteSliceXapp struct { + + // rRMPolicyDedicatedRatio + RrmDedicated *int `json:"rrm-dedicated,omitempty"` + + // rRMPolicyMaxRatio + RrmMax *int `json:"rrm-max,omitempty"` + + // rRMPolicyMinRatio + RrmMin *int `json:"rrm-min,omitempty"` +} + // List of small cell addresses (single) type SiteSmallCell struct { @@ -625,8 +641,8 @@ type Template struct { Sst *string `json:"sst,omitempty"` // ID for this slice template. - TemplateId ListKey `json:"template-id"` - AdditionalProperties map[string]AdditionalPropertiesUnchTarget `json:"-"` + TemplateId ListKey `json:"template-id"` + AdditionalProperties map[string]AdditionalPropertyUnchanged `json:"-"` } // List of slice templates (list) @@ -701,6 +717,9 @@ type RequestBodySiteConnectivityServiceCore4g SiteConnectivityServiceCore4g // The 5g core endpoint type RequestBodySiteConnectivityServiceCore5g SiteConnectivityServiceCore5g +// Connectivity to the xApp +type RequestBodySiteConnectivityServiceRan5gService SiteConnectivityServiceRan5gService + // List of devices (single) type RequestBodySiteDevice SiteDevice @@ -746,6 +765,15 @@ type RequestBodySiteSliceMbr SiteSliceMbr // List of priority traffic rules (single) type RequestBodySiteSlicePriorityTrafficRule SiteSlicePriorityTrafficRule +// Per-Device per-Application GBR (Guaranteed BitRate) in bps +type RequestBodySiteSlicePriorityTrafficRuleGbr SiteSlicePriorityTrafficRuleGbr + +// Per-Device per-Application MBR (Maximum BitRate) in bps +type RequestBodySiteSlicePriorityTrafficRuleMbr SiteSlicePriorityTrafficRuleMbr + +// Params related to xApp +type RequestBodySiteSliceXapp SiteSliceXapp + // List of small cell addresses (single) type RequestBodySiteSmallCell SiteSmallCell @@ -782,6 +810,9 @@ type PostSiteConnectivityServiceCore4gJSONRequestBody RequestBodySiteConnectivit // PostSiteConnectivityServiceCore5gJSONRequestBody defines body for PostSiteConnectivityServiceCore5g for application/json ContentType. type PostSiteConnectivityServiceCore5gJSONRequestBody RequestBodySiteConnectivityServiceCore5g +// PostSiteConnectivityServiceRan5gServiceJSONRequestBody defines body for PostSiteConnectivityServiceRan5gService for application/json ContentType. +type PostSiteConnectivityServiceRan5gServiceJSONRequestBody RequestBodySiteConnectivityServiceRan5gService + // PostSiteDeviceGroupJSONRequestBody defines body for PostSiteDeviceGroup for application/json ContentType. type PostSiteDeviceGroupJSONRequestBody RequestBodySiteDeviceGroup @@ -824,6 +855,15 @@ type PostSiteSliceMbrJSONRequestBody RequestBodySiteSliceMbr // PostSiteSlicePriorityTrafficRuleJSONRequestBody defines body for PostSiteSlicePriorityTrafficRule for application/json ContentType. type PostSiteSlicePriorityTrafficRuleJSONRequestBody RequestBodySiteSlicePriorityTrafficRule +// PostSiteSlicePriorityTrafficRuleGbrJSONRequestBody defines body for PostSiteSlicePriorityTrafficRuleGbr for application/json ContentType. +type PostSiteSlicePriorityTrafficRuleGbrJSONRequestBody RequestBodySiteSlicePriorityTrafficRuleGbr + +// PostSiteSlicePriorityTrafficRuleMbrJSONRequestBody defines body for PostSiteSlicePriorityTrafficRuleMbr for application/json ContentType. +type PostSiteSlicePriorityTrafficRuleMbrJSONRequestBody RequestBodySiteSlicePriorityTrafficRuleMbr + +// PostSiteSliceXappJSONRequestBody defines body for PostSiteSliceXapp for application/json ContentType. +type PostSiteSliceXappJSONRequestBody RequestBodySiteSliceXapp + // PostSiteSmallCellJSONRequestBody defines body for PostSiteSmallCell for application/json ContentType. type PostSiteSmallCellJSONRequestBody RequestBodySiteSmallCell @@ -841,7 +881,7 @@ type PostTrafficClassJSONRequestBody RequestBodyTrafficClass // Getter for additional properties for Application. Returns the specified // element and whether it was found -func (a Application) Get(fieldName string) (value AdditionalPropertiesUnchTarget, found bool) { +func (a Application) Get(fieldName string) (value AdditionalPropertyUnchanged, found bool) { if a.AdditionalProperties != nil { value, found = a.AdditionalProperties[fieldName] } @@ -849,9 +889,9 @@ func (a Application) Get(fieldName string) (value AdditionalPropertiesUnchTarget } // Setter for additional properties for Application -func (a *Application) Set(fieldName string, value AdditionalPropertiesUnchTarget) { +func (a *Application) Set(fieldName string, value AdditionalPropertyUnchanged) { if a.AdditionalProperties == nil { - a.AdditionalProperties = make(map[string]AdditionalPropertiesUnchTarget) + a.AdditionalProperties = make(map[string]AdditionalPropertyUnchanged) } a.AdditionalProperties[fieldName] = value } @@ -905,9 +945,9 @@ func (a *Application) UnmarshalJSON(b []byte) error { } if len(object) != 0 { - a.AdditionalProperties = make(map[string]AdditionalPropertiesUnchTarget) + a.AdditionalProperties = make(map[string]AdditionalPropertyUnchanged) for fieldName, fieldBuf := range object { - var fieldVal AdditionalPropertiesUnchTarget + var fieldVal AdditionalPropertyUnchanged err := json.Unmarshal(fieldBuf, &fieldVal) if err != nil { return errors.Wrap(err, fmt.Sprintf("error unmarshaling field %s", fieldName)) @@ -2019,6 +2059,14 @@ func (a *SiteSlice) UnmarshalJSON(b []byte) error { delete(object, "upf") } + if raw, found := object["xapp"]; found { + err = json.Unmarshal(raw, &a.Xapp) + if err != nil { + return errors.Wrap(err, "error reading 'xapp'") + } + delete(object, "xapp") + } + if len(object) != 0 { a.AdditionalProperties = make(map[string]AdditionalPropertyUnchanged) for fieldName, fieldBuf := range object { @@ -2114,6 +2162,13 @@ func (a SiteSlice) MarshalJSON() ([]byte, error) { } } + if a.Xapp != nil { + object["xapp"], err = json.Marshal(a.Xapp) + if err != nil { + return nil, errors.Wrap(err, fmt.Sprintf("error marshaling 'xapp'")) + } + } + for fieldName, field := range a.AdditionalProperties { object[fieldName], err = json.Marshal(field) if err != nil { @@ -2581,7 +2636,7 @@ func (a SiteUpf) MarshalJSON() ([]byte, error) { // Getter for additional properties for Template. Returns the specified // element and whether it was found -func (a Template) Get(fieldName string) (value AdditionalPropertiesUnchTarget, found bool) { +func (a Template) Get(fieldName string) (value AdditionalPropertyUnchanged, found bool) { if a.AdditionalProperties != nil { value, found = a.AdditionalProperties[fieldName] } @@ -2589,9 +2644,9 @@ func (a Template) Get(fieldName string) (value AdditionalPropertiesUnchTarget, f } // Setter for additional properties for Template -func (a *Template) Set(fieldName string, value AdditionalPropertiesUnchTarget) { +func (a *Template) Set(fieldName string, value AdditionalPropertyUnchanged) { if a.AdditionalProperties == nil { - a.AdditionalProperties = make(map[string]AdditionalPropertiesUnchTarget) + a.AdditionalProperties = make(map[string]AdditionalPropertyUnchanged) } a.AdditionalProperties[fieldName] = value } @@ -2661,9 +2716,9 @@ func (a *Template) UnmarshalJSON(b []byte) error { } if len(object) != 0 { - a.AdditionalProperties = make(map[string]AdditionalPropertiesUnchTarget) + a.AdditionalProperties = make(map[string]AdditionalPropertyUnchanged) for fieldName, fieldBuf := range object { - var fieldVal AdditionalPropertiesUnchTarget + var fieldVal AdditionalPropertyUnchanged err := json.Unmarshal(fieldBuf, &fieldVal) if err != nil { return errors.Wrap(err, fmt.Sprintf("error unmarshaling field %s", fieldName)) From aacf70ddaadaf3cca0dc79e305719ac334e560a1 Mon Sep 17 00:00:00 2001 From: "Marikkannu, Suresh" Date: Sun, 4 Feb 2024 21:42:23 -0800 Subject: [PATCH 2/2] Resolved unit test failure issues Due to compiler version change the target values are not populated as expected. It causes few tests to fail due to tagrget mismatch. Updated the tests to resolve the same. Signed-off-by: Marikkannu, Suresh --- pkg/toplevel/server/convert-oapi-gnmi_test.go | 4 ++-- pkg/toplevel/server/validation_test.go | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pkg/toplevel/server/convert-oapi-gnmi_test.go b/pkg/toplevel/server/convert-oapi-gnmi_test.go index 0439e41..f78b540 100644 --- a/pkg/toplevel/server/convert-oapi-gnmi_test.go +++ b/pkg/toplevel/server/convert-oapi-gnmi_test.go @@ -145,8 +145,8 @@ func Test_encodeToGnmiPatchBody(t *testing.T) { assert.Equal(t, 4, len(pb.Deletes)) for _, del := range pb.Deletes { switch path := strings.ReplaceAll(del.String(), " ", " "); path { - case `elem:{name:"application" key:{key:"application-id" value:"app-10"}} elem:{name:"endpoint" key:{key:"endpoint-id" value:"ep-10"}} elem:{name:"endpoint-id"} target:"acme"`: - case `elem:{name:"application" key:{key:"application-id" value:"app-10"}} elem:{name:"endpoint" key:{key:"endpoint-id" value:"ep-11"}} elem:{name:"endpoint-id"} target:"acme"`: + case `elem:{name:"application" key:{key:"application-id" value:"app-10"}} elem:{name:"endpoint" key:{key:"endpoint-id" value:"ep-10"}} elem:{name:"endpoint-id"} target:"defaultent"`: + case `elem:{name:"application" key:{key:"application-id" value:"app-10"}} elem:{name:"endpoint" key:{key:"endpoint-id" value:"ep-11"}} elem:{name:"endpoint-id"} target:"defaultent"`: case `elem:{name:"traffic-class" key:{key:"traffic-class-id" value:"class-4"}} elem:{name:"traffic-class-id"} target:"acme"`: case `elem:{name:"traffic-class" key:{key:"traffic-class-id" value:"class-5"}} elem:{name:"traffic-class-id"} target:"acme"`: default: diff --git a/pkg/toplevel/server/validation_test.go b/pkg/toplevel/server/validation_test.go index 60cb145..6dfc17b 100644 --- a/pkg/toplevel/server/validation_test.go +++ b/pkg/toplevel/server/validation_test.go @@ -65,7 +65,8 @@ Schema: "maxLength": 1024, "minLength": 1, "title": "description", - "type": "string" + "type": "string", + "x-yang-type": "description" } Value: