Xapp registration/deregistration to RIC
Signed-off-by: wahidw <abdulwahid.w@nokia.com>
Change-Id: I62104203e6f2de9359a2ab184966395f4c758b48
diff --git a/pkg/models/config_metadata.go b/pkg/models/config_metadata.go
new file mode 100644
index 0000000..f564287
--- /dev/null
+++ b/pkg/models/config_metadata.go
@@ -0,0 +1,121 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+ "encoding/json"
+
+ strfmt "github.com/go-openapi/strfmt"
+
+ "github.com/go-openapi/errors"
+ "github.com/go-openapi/swag"
+ "github.com/go-openapi/validate"
+)
+
+// ConfigMetadata config metadata
+// swagger:model ConfigMetadata
+type ConfigMetadata struct {
+
+ // The type of the content
+ // Required: true
+ // Enum: [json xml other]
+ ConfigType *string `json:"configType"`
+
+ // Name of the xApp
+ // Required: true
+ XappName *string `json:"xappName"`
+}
+
+// Validate validates this config metadata
+func (m *ConfigMetadata) Validate(formats strfmt.Registry) error {
+ var res []error
+
+ if err := m.validateConfigType(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateXappName(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if len(res) > 0 {
+ return errors.CompositeValidationError(res...)
+ }
+ return nil
+}
+
+var configMetadataTypeConfigTypePropEnum []interface{}
+
+func init() {
+ var res []string
+ if err := json.Unmarshal([]byte(`["json","xml","other"]`), &res); err != nil {
+ panic(err)
+ }
+ for _, v := range res {
+ configMetadataTypeConfigTypePropEnum = append(configMetadataTypeConfigTypePropEnum, v)
+ }
+}
+
+const (
+
+ // ConfigMetadataConfigTypeJSON captures enum value "json"
+ ConfigMetadataConfigTypeJSON string = "json"
+
+ // ConfigMetadataConfigTypeXML captures enum value "xml"
+ ConfigMetadataConfigTypeXML string = "xml"
+
+ // ConfigMetadataConfigTypeOther captures enum value "other"
+ ConfigMetadataConfigTypeOther string = "other"
+)
+
+// prop value enum
+func (m *ConfigMetadata) validateConfigTypeEnum(path, location string, value string) error {
+ if err := validate.Enum(path, location, value, configMetadataTypeConfigTypePropEnum); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (m *ConfigMetadata) validateConfigType(formats strfmt.Registry) error {
+
+ if err := validate.Required("configType", "body", m.ConfigType); err != nil {
+ return err
+ }
+
+ // value enum
+ if err := m.validateConfigTypeEnum("configType", "body", *m.ConfigType); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *ConfigMetadata) validateXappName(formats strfmt.Registry) error {
+
+ if err := validate.Required("xappName", "body", m.XappName); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+// MarshalBinary interface implementation
+func (m *ConfigMetadata) MarshalBinary() ([]byte, error) {
+ if m == nil {
+ return nil, nil
+ }
+ return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *ConfigMetadata) UnmarshalBinary(b []byte) error {
+ var res ConfigMetadata
+ if err := swag.ReadJSON(b, &res); err != nil {
+ return err
+ }
+ *m = res
+ return nil
+}
diff --git a/pkg/models/x_app_config.go b/pkg/models/x_app_config.go
new file mode 100644
index 0000000..076e314
--- /dev/null
+++ b/pkg/models/x_app_config.go
@@ -0,0 +1,90 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+ strfmt "github.com/go-openapi/strfmt"
+
+ "github.com/go-openapi/errors"
+ "github.com/go-openapi/swag"
+ "github.com/go-openapi/validate"
+)
+
+// XAppConfig x app config
+// swagger:model XAppConfig
+type XAppConfig struct {
+
+ // Configuration in JSON format
+ // Required: true
+ Config interface{} `json:"config"`
+
+ // metadata
+ // Required: true
+ Metadata *ConfigMetadata `json:"metadata"`
+}
+
+// Validate validates this x app config
+func (m *XAppConfig) Validate(formats strfmt.Registry) error {
+ var res []error
+
+ if err := m.validateConfig(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if err := m.validateMetadata(formats); err != nil {
+ res = append(res, err)
+ }
+
+ if len(res) > 0 {
+ return errors.CompositeValidationError(res...)
+ }
+ return nil
+}
+
+func (m *XAppConfig) validateConfig(formats strfmt.Registry) error {
+
+ if err := validate.Required("config", "body", m.Config); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func (m *XAppConfig) validateMetadata(formats strfmt.Registry) error {
+
+ if err := validate.Required("metadata", "body", m.Metadata); err != nil {
+ return err
+ }
+
+ if m.Metadata != nil {
+ if err := m.Metadata.Validate(formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName("metadata")
+ }
+ return err
+ }
+ }
+
+ return nil
+}
+
+// MarshalBinary interface implementation
+func (m *XAppConfig) MarshalBinary() ([]byte, error) {
+ if m == nil {
+ return nil, nil
+ }
+ return swag.WriteJSON(m)
+}
+
+// UnmarshalBinary interface implementation
+func (m *XAppConfig) UnmarshalBinary(b []byte) error {
+ var res XAppConfig
+ if err := swag.ReadJSON(b, &res); err != nil {
+ return err
+ }
+ *m = res
+ return nil
+}
diff --git a/pkg/models/xapp_config_list.go b/pkg/models/xapp_config_list.go
new file mode 100644
index 0000000..e57ed02
--- /dev/null
+++ b/pkg/models/xapp_config_list.go
@@ -0,0 +1,45 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package models
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+ "strconv"
+
+ strfmt "github.com/go-openapi/strfmt"
+
+ "github.com/go-openapi/errors"
+ "github.com/go-openapi/swag"
+)
+
+// XappConfigList xapp config list
+// swagger:model XappConfigList
+type XappConfigList []*XAppConfig
+
+// Validate validates this xapp config list
+func (m XappConfigList) Validate(formats strfmt.Registry) error {
+ var res []error
+
+ for i := 0; i < len(m); i++ {
+ if swag.IsZero(m[i]) { // not required
+ continue
+ }
+
+ if m[i] != nil {
+ if err := m[i].Validate(formats); err != nil {
+ if ve, ok := err.(*errors.Validation); ok {
+ return ve.ValidateName(strconv.Itoa(i))
+ }
+ return err
+ }
+ }
+
+ }
+
+ if len(res) > 0 {
+ return errors.CompositeValidationError(res...)
+ }
+ return nil
+}
diff --git a/pkg/restapi/doc.go b/pkg/restapi/doc.go
index 8cc5aad..c73c1aa 100644
--- a/pkg/restapi/doc.go
+++ b/pkg/restapi/doc.go
@@ -17,6 +17,7 @@
Produces:
- application/json
+ - application/xml
swagger:meta
*/
diff --git a/pkg/restapi/embedded_spec.go b/pkg/restapi/embedded_spec.go
index 8cb57e1..dd67843 100644
--- a/pkg/restapi/embedded_spec.go
+++ b/pkg/restapi/embedded_spec.go
@@ -34,6 +34,30 @@
"host": "hostname",
"basePath": "/ric/v1",
"paths": {
+ "/config": {
+ "get": {
+ "produces": [
+ "application/json",
+ "application/xml"
+ ],
+ "tags": [
+ "xapp"
+ ],
+ "summary": "Returns the configuration of all xapps",
+ "operationId": "getXappConfigList",
+ "responses": {
+ "200": {
+ "description": "successful query of xApp config",
+ "schema": {
+ "$ref": "#/definitions/XappConfigList"
+ }
+ },
+ "500": {
+ "description": "Internal error"
+ }
+ }
+ }
+ },
"/subscriptions": {
"get": {
"produces": [
@@ -187,6 +211,28 @@
}
}
},
+ "ConfigMetadata": {
+ "type": "object",
+ "required": [
+ "xappName",
+ "configType"
+ ],
+ "properties": {
+ "configType": {
+ "description": "The type of the content",
+ "type": "string",
+ "enum": [
+ "json",
+ "xml",
+ "other"
+ ]
+ },
+ "xappName": {
+ "description": "Name of the xApp",
+ "type": "string"
+ }
+ }
+ },
"EventTrigger": {
"type": "object",
"properties": {
@@ -443,6 +489,28 @@
"policy",
"report"
]
+ },
+ "XAppConfig": {
+ "type": "object",
+ "required": [
+ "metadata",
+ "config"
+ ],
+ "properties": {
+ "config": {
+ "description": "Configuration in JSON format",
+ "type": "object"
+ },
+ "metadata": {
+ "$ref": "#/definitions/ConfigMetadata"
+ }
+ }
+ },
+ "XappConfigList": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/XAppConfig"
+ }
}
}
}`))
@@ -463,6 +531,30 @@
"host": "hostname",
"basePath": "/ric/v1",
"paths": {
+ "/config": {
+ "get": {
+ "produces": [
+ "application/json",
+ "application/xml"
+ ],
+ "tags": [
+ "xapp"
+ ],
+ "summary": "Returns the configuration of all xapps",
+ "operationId": "getXappConfigList",
+ "responses": {
+ "200": {
+ "description": "successful query of xApp config",
+ "schema": {
+ "$ref": "#/definitions/XappConfigList"
+ }
+ },
+ "500": {
+ "description": "Internal error"
+ }
+ }
+ }
+ },
"/subscriptions": {
"get": {
"produces": [
@@ -616,6 +708,28 @@
}
}
},
+ "ConfigMetadata": {
+ "type": "object",
+ "required": [
+ "xappName",
+ "configType"
+ ],
+ "properties": {
+ "configType": {
+ "description": "The type of the content",
+ "type": "string",
+ "enum": [
+ "json",
+ "xml",
+ "other"
+ ]
+ },
+ "xappName": {
+ "description": "Name of the xApp",
+ "type": "string"
+ }
+ }
+ },
"EventTrigger": {
"type": "object",
"properties": {
@@ -872,6 +986,28 @@
"policy",
"report"
]
+ },
+ "XAppConfig": {
+ "type": "object",
+ "required": [
+ "metadata",
+ "config"
+ ],
+ "properties": {
+ "config": {
+ "description": "Configuration in JSON format",
+ "type": "object"
+ },
+ "metadata": {
+ "$ref": "#/definitions/ConfigMetadata"
+ }
+ }
+ },
+ "XappConfigList": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/XAppConfig"
+ }
}
}
}`))
diff --git a/pkg/restapi/operations/xapp/get_xapp_config_list.go b/pkg/restapi/operations/xapp/get_xapp_config_list.go
new file mode 100644
index 0000000..9fc02d3
--- /dev/null
+++ b/pkg/restapi/operations/xapp/get_xapp_config_list.go
@@ -0,0 +1,58 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package xapp
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the generate command
+
+import (
+ "net/http"
+
+ middleware "github.com/go-openapi/runtime/middleware"
+)
+
+// GetXappConfigListHandlerFunc turns a function with the right signature into a get xapp config list handler
+type GetXappConfigListHandlerFunc func(GetXappConfigListParams) middleware.Responder
+
+// Handle executing the request and returning a response
+func (fn GetXappConfigListHandlerFunc) Handle(params GetXappConfigListParams) middleware.Responder {
+ return fn(params)
+}
+
+// GetXappConfigListHandler interface for that can handle valid get xapp config list params
+type GetXappConfigListHandler interface {
+ Handle(GetXappConfigListParams) middleware.Responder
+}
+
+// NewGetXappConfigList creates a new http.Handler for the get xapp config list operation
+func NewGetXappConfigList(ctx *middleware.Context, handler GetXappConfigListHandler) *GetXappConfigList {
+ return &GetXappConfigList{Context: ctx, Handler: handler}
+}
+
+/*GetXappConfigList swagger:route GET /config xapp getXappConfigList
+
+Returns the configuration of all xapps
+
+*/
+type GetXappConfigList struct {
+ Context *middleware.Context
+ Handler GetXappConfigListHandler
+}
+
+func (o *GetXappConfigList) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
+ route, rCtx, _ := o.Context.RouteInfo(r)
+ if rCtx != nil {
+ r = rCtx
+ }
+ var Params = NewGetXappConfigListParams()
+
+ if err := o.Context.BindValidRequest(r, route, &Params); err != nil { // bind params
+ o.Context.Respond(rw, r, route.Produces, route, err)
+ return
+ }
+
+ res := o.Handler.Handle(Params) // actually handle the request
+
+ o.Context.Respond(rw, r, route.Produces, route, res)
+
+}
diff --git a/pkg/restapi/operations/xapp/get_xapp_config_list_parameters.go b/pkg/restapi/operations/xapp/get_xapp_config_list_parameters.go
new file mode 100644
index 0000000..0339c0f
--- /dev/null
+++ b/pkg/restapi/operations/xapp/get_xapp_config_list_parameters.go
@@ -0,0 +1,45 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package xapp
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+ "net/http"
+
+ "github.com/go-openapi/errors"
+ "github.com/go-openapi/runtime/middleware"
+)
+
+// NewGetXappConfigListParams creates a new GetXappConfigListParams object
+// no default values defined in spec.
+func NewGetXappConfigListParams() GetXappConfigListParams {
+
+ return GetXappConfigListParams{}
+}
+
+// GetXappConfigListParams contains all the bound params for the get xapp config list operation
+// typically these are obtained from a http.Request
+//
+// swagger:parameters getXappConfigList
+type GetXappConfigListParams struct {
+
+ // HTTP Request Object
+ HTTPRequest *http.Request `json:"-"`
+}
+
+// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface
+// for simple values it will use straight method calls.
+//
+// To ensure default values, the struct must have been initialized with NewGetXappConfigListParams() beforehand.
+func (o *GetXappConfigListParams) BindRequest(r *http.Request, route *middleware.MatchedRoute) error {
+ var res []error
+
+ o.HTTPRequest = r
+
+ if len(res) > 0 {
+ return errors.CompositeValidationError(res...)
+ }
+ return nil
+}
diff --git a/pkg/restapi/operations/xapp/get_xapp_config_list_responses.go b/pkg/restapi/operations/xapp/get_xapp_config_list_responses.go
new file mode 100644
index 0000000..bddbfea
--- /dev/null
+++ b/pkg/restapi/operations/xapp/get_xapp_config_list_responses.go
@@ -0,0 +1,85 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package xapp
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the swagger generate command
+
+import (
+ "net/http"
+
+ "github.com/go-openapi/runtime"
+
+ models "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
+)
+
+// GetXappConfigListOKCode is the HTTP code returned for type GetXappConfigListOK
+const GetXappConfigListOKCode int = 200
+
+/*GetXappConfigListOK successful query of xApp config
+
+swagger:response getXappConfigListOK
+*/
+type GetXappConfigListOK struct {
+
+ /*
+ In: Body
+ */
+ Payload models.XappConfigList `json:"body,omitempty"`
+}
+
+// NewGetXappConfigListOK creates GetXappConfigListOK with default headers values
+func NewGetXappConfigListOK() *GetXappConfigListOK {
+
+ return &GetXappConfigListOK{}
+}
+
+// WithPayload adds the payload to the get xapp config list o k response
+func (o *GetXappConfigListOK) WithPayload(payload models.XappConfigList) *GetXappConfigListOK {
+ o.Payload = payload
+ return o
+}
+
+// SetPayload sets the payload to the get xapp config list o k response
+func (o *GetXappConfigListOK) SetPayload(payload models.XappConfigList) {
+ o.Payload = payload
+}
+
+// WriteResponse to the client
+func (o *GetXappConfigListOK) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {
+
+ rw.WriteHeader(200)
+ payload := o.Payload
+ if payload == nil {
+ // return empty array
+ payload = models.XappConfigList{}
+ }
+
+ if err := producer.Produce(rw, payload); err != nil {
+ panic(err) // let the recovery middleware deal with this
+ }
+}
+
+// GetXappConfigListInternalServerErrorCode is the HTTP code returned for type GetXappConfigListInternalServerError
+const GetXappConfigListInternalServerErrorCode int = 500
+
+/*GetXappConfigListInternalServerError Internal error
+
+swagger:response getXappConfigListInternalServerError
+*/
+type GetXappConfigListInternalServerError struct {
+}
+
+// NewGetXappConfigListInternalServerError creates GetXappConfigListInternalServerError with default headers values
+func NewGetXappConfigListInternalServerError() *GetXappConfigListInternalServerError {
+
+ return &GetXappConfigListInternalServerError{}
+}
+
+// WriteResponse to the client
+func (o *GetXappConfigListInternalServerError) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) {
+
+ rw.Header().Del(runtime.HeaderContentType) //Remove Content-Type on empty responses
+
+ rw.WriteHeader(500)
+}
diff --git a/pkg/restapi/operations/xapp/get_xapp_config_list_urlbuilder.go b/pkg/restapi/operations/xapp/get_xapp_config_list_urlbuilder.go
new file mode 100644
index 0000000..6c0df06
--- /dev/null
+++ b/pkg/restapi/operations/xapp/get_xapp_config_list_urlbuilder.go
@@ -0,0 +1,87 @@
+// Code generated by go-swagger; DO NOT EDIT.
+
+package xapp
+
+// This file was generated by the swagger tool.
+// Editing this file might prove futile when you re-run the generate command
+
+import (
+ "errors"
+ "net/url"
+ golangswaggerpaths "path"
+)
+
+// GetXappConfigListURL generates an URL for the get xapp config list operation
+type GetXappConfigListURL struct {
+ _basePath string
+}
+
+// WithBasePath sets the base path for this url builder, only required when it's different from the
+// base path specified in the swagger spec.
+// When the value of the base path is an empty string
+func (o *GetXappConfigListURL) WithBasePath(bp string) *GetXappConfigListURL {
+ o.SetBasePath(bp)
+ return o
+}
+
+// SetBasePath sets the base path for this url builder, only required when it's different from the
+// base path specified in the swagger spec.
+// When the value of the base path is an empty string
+func (o *GetXappConfigListURL) SetBasePath(bp string) {
+ o._basePath = bp
+}
+
+// Build a url path and query string
+func (o *GetXappConfigListURL) Build() (*url.URL, error) {
+ var _result url.URL
+
+ var _path = "/config"
+
+ _basePath := o._basePath
+ if _basePath == "" {
+ _basePath = "/ric/v1"
+ }
+ _result.Path = golangswaggerpaths.Join(_basePath, _path)
+
+ return &_result, nil
+}
+
+// Must is a helper function to panic when the url builder returns an error
+func (o *GetXappConfigListURL) Must(u *url.URL, err error) *url.URL {
+ if err != nil {
+ panic(err)
+ }
+ if u == nil {
+ panic("url can't be nil")
+ }
+ return u
+}
+
+// String returns the string representation of the path with query string
+func (o *GetXappConfigListURL) String() string {
+ return o.Must(o.Build()).String()
+}
+
+// BuildFull builds a full url with scheme, host, path and query string
+func (o *GetXappConfigListURL) BuildFull(scheme, host string) (*url.URL, error) {
+ if scheme == "" {
+ return nil, errors.New("scheme is required for a full url on GetXappConfigListURL")
+ }
+ if host == "" {
+ return nil, errors.New("host is required for a full url on GetXappConfigListURL")
+ }
+
+ base, err := o.Build()
+ if err != nil {
+ return nil, err
+ }
+
+ base.Scheme = scheme
+ base.Host = host
+ return base, nil
+}
+
+// StringFull returns the string representation of a complete url
+func (o *GetXappConfigListURL) StringFull(scheme, host string) string {
+ return o.Must(o.BuildFull(scheme, host)).String()
+}
diff --git a/pkg/restapi/operations/xapp_framework_api.go b/pkg/restapi/operations/xapp_framework_api.go
index 10da039..c2ef01b 100644
--- a/pkg/restapi/operations/xapp_framework_api.go
+++ b/pkg/restapi/operations/xapp_framework_api.go
@@ -23,6 +23,7 @@
"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/policy"
"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/query"
"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/report"
+ "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/xapp"
)
// NewXappFrameworkAPI creates a new XappFramework instance
@@ -42,12 +43,16 @@
BearerAuthenticator: security.BearerAuth,
JSONConsumer: runtime.JSONConsumer(),
JSONProducer: runtime.JSONProducer(),
+ XMLProducer: runtime.XMLProducer(),
CommonUnsubscribeHandler: common.UnsubscribeHandlerFunc(func(params common.UnsubscribeParams) middleware.Responder {
return middleware.NotImplemented("operation CommonUnsubscribe has not yet been implemented")
}),
QueryGetAllSubscriptionsHandler: query.GetAllSubscriptionsHandlerFunc(func(params query.GetAllSubscriptionsParams) middleware.Responder {
return middleware.NotImplemented("operation QueryGetAllSubscriptions has not yet been implemented")
}),
+ XappGetXappConfigListHandler: xapp.GetXappConfigListHandlerFunc(func(params xapp.GetXappConfigListParams) middleware.Responder {
+ return middleware.NotImplemented("operation XappGetXappConfigList has not yet been implemented")
+ }),
PolicySubscribePolicyHandler: policy.SubscribePolicyHandlerFunc(func(params policy.SubscribePolicyParams) middleware.Responder {
return middleware.NotImplemented("operation PolicySubscribePolicy has not yet been implemented")
}),
@@ -84,11 +89,15 @@
// JSONProducer registers a producer for a "application/json" mime type
JSONProducer runtime.Producer
+ // XMLProducer registers a producer for a "application/xml" mime type
+ XMLProducer runtime.Producer
// CommonUnsubscribeHandler sets the operation handler for the unsubscribe operation
CommonUnsubscribeHandler common.UnsubscribeHandler
// QueryGetAllSubscriptionsHandler sets the operation handler for the get all subscriptions operation
QueryGetAllSubscriptionsHandler query.GetAllSubscriptionsHandler
+ // XappGetXappConfigListHandler sets the operation handler for the get xapp config list operation
+ XappGetXappConfigListHandler xapp.GetXappConfigListHandler
// PolicySubscribePolicyHandler sets the operation handler for the subscribe policy operation
PolicySubscribePolicyHandler policy.SubscribePolicyHandler
// ReportSubscribeReportHandler sets the operation handler for the subscribe report operation
@@ -156,6 +165,10 @@
unregistered = append(unregistered, "JSONProducer")
}
+ if o.XMLProducer == nil {
+ unregistered = append(unregistered, "XMLProducer")
+ }
+
if o.CommonUnsubscribeHandler == nil {
unregistered = append(unregistered, "common.UnsubscribeHandler")
}
@@ -164,6 +177,10 @@
unregistered = append(unregistered, "query.GetAllSubscriptionsHandler")
}
+ if o.XappGetXappConfigListHandler == nil {
+ unregistered = append(unregistered, "xapp.GetXappConfigListHandler")
+ }
+
if o.PolicySubscribePolicyHandler == nil {
unregistered = append(unregistered, "policy.SubscribePolicyHandler")
}
@@ -228,6 +245,9 @@
case "application/json":
result["application/json"] = o.JSONProducer
+ case "application/xml":
+ result["application/xml"] = o.XMLProducer
+
}
if p, ok := o.customProducers[mt]; ok {
@@ -280,6 +300,11 @@
}
o.handlers["GET"]["/subscriptions"] = query.NewGetAllSubscriptions(o.context, o.QueryGetAllSubscriptionsHandler)
+ if o.handlers["GET"] == nil {
+ o.handlers["GET"] = make(map[string]http.Handler)
+ }
+ o.handlers["GET"]["/config"] = xapp.NewGetXappConfigList(o.context, o.XappGetXappConfigListHandler)
+
if o.handlers["POST"] == nil {
o.handlers["POST"] = make(map[string]http.Handler)
}
diff --git a/pkg/xapp/restapi.go b/pkg/xapp/restapi.go
index 6562dc5..46e81f6 100755
--- a/pkg/xapp/restapi.go
+++ b/pkg/xapp/restapi.go
@@ -22,14 +22,19 @@
import (
"encoding/json"
"github.com/gorilla/mux"
+ "github.com/spf13/viper"
"io/ioutil"
"net/http"
+ "os"
+
+ "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
)
const (
- ReadyURL = "/ric/v1/health/ready"
- AliveURL = "/ric/v1/health/alive"
- ConfigURL = "/ric/v1/cm/{name}"
+ ReadyURL = "/ric/v1/health/ready"
+ AliveURL = "/ric/v1/health/alive"
+ ConfigURL = "/ric/v1/cm/{name}"
+ AppConfigURL = "/ric/v1/config"
)
type StatusCb func() bool
@@ -49,6 +54,7 @@
r.InjectRoute(ReadyURL, readyHandler, "GET")
r.InjectRoute(AliveURL, aliveHandler, "GET")
r.InjectRoute(ConfigURL, configHandler, "POST")
+ r.InjectRoute(AppConfigURL, appconfigHandler, "GET")
return r
}
@@ -130,3 +136,36 @@
w.Write(response)
}
}
+
+func appconfigHandler(w http.ResponseWriter, r *http.Request) {
+
+ Logger.Info("Inside appconfigHandler")
+
+ var appconfig models.XappConfigList
+ var metadata models.ConfigMetadata
+ var xappconfig models.XAppConfig
+ name := viper.GetString("name")
+ configtype := "json"
+ metadata.XappName = &name
+ metadata.ConfigType = &configtype
+
+ configFile, err := os.Open("/opt/ric/config/config-file.json")
+ if err != nil {
+ Logger.Error("Cannot open config file: %v", err)
+ respondWithJSON(w, http.StatusInternalServerError, nil)
+ // return nil,errors.New("Could Not parse the config file")
+ }
+
+ body, err := ioutil.ReadAll(configFile)
+
+ defer configFile.Close()
+
+ xappconfig.Metadata = &metadata
+ xappconfig.Config = string(body)
+
+ appconfig = append(appconfig, &xappconfig)
+
+ respondWithJSON(w, http.StatusOK, appconfig)
+
+ //return appconfig,nil
+}
diff --git a/pkg/xapp/subscription.go b/pkg/xapp/subscription.go
index 4ecc262..bf140c4 100755
--- a/pkg/xapp/subscription.go
+++ b/pkg/xapp/subscription.go
@@ -33,6 +33,7 @@
"net/http"
"os"
"time"
+ //"errors"
apiclient "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/clientapi"
apicommon "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/clientapi/common"
@@ -47,6 +48,7 @@
"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/policy"
"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/query"
"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/report"
+ //"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/restapi/operations/xapp"
)
type SubscriptionHandler func(models.SubscriptionType, interface{}) (*models.SubscriptionResponse, error)
@@ -149,6 +151,16 @@
return common.NewUnsubscribeInternalServerError()
})
+ // XApp: Get Config
+ /*api.XappGetXappConfigListHandler = xapp.GetXappConfigListHandlerFunc(
+ func(p xapp.GetXappConfigListParams) middleware.Responder {
+ Logger.Info("Hitting xapp config")
+ if resp,err := r.getXappConfig(); err == nil {
+ return xapp.NewGetXappConfigListOK().WithPayload(resp)
+ }
+ return xapp.NewGetXappConfigListInternalServerError()
+ })*/
+
server := restapi.NewServer(api)
defer server.Shutdown()
server.Host = r.localAddr
@@ -262,3 +274,32 @@
func (r *Subscriber) CreateTransport() *apiclient.RICSubscription {
return apiclient.New(httptransport.New(r.remoteHost, r.remoteUrl, r.remoteProt), strfmt.Default)
}
+
+/*func (r *Subscriber) getXappConfig() (appconfig models.XappConfigList, err error) {
+
+ Logger.Error("Inside getXappConfig")
+
+ var metadata models.ConfigMetadata
+ var xappconfig models.XAppConfig
+ name := viper.GetString("name")
+ configtype := "json"
+ metadata.XappName = &name
+ metadata.ConfigType = &configtype
+
+ configFile, err := os.Open("/opt/ric/config/config-file.json")
+ if err != nil {
+ Logger.Error("Cannot open config file: %v", err)
+ return nil,errors.New("Could Not parse the config file")
+ }
+
+ body, err := ioutil.ReadAll(configFile)
+
+ defer configFile.Close()
+
+ xappconfig.Metadata = &metadata
+ xappconfig.Config = body
+
+ appconfig = append(appconfig,&xappconfig)
+
+ return appconfig,nil
+}*/
diff --git a/pkg/xapp/xapp.go b/pkg/xapp/xapp.go
index 1ab7ee0..2bf7799 100755
--- a/pkg/xapp/xapp.go
+++ b/pkg/xapp/xapp.go
@@ -20,11 +20,15 @@
package xapp
import (
+ "bytes"
+ "encoding/json"
"fmt"
"github.com/spf13/viper"
+ "io/ioutil"
"net/http"
"os"
"os/signal"
+ "strings"
"sync/atomic"
"syscall"
"time"
@@ -67,6 +71,140 @@
}
}
+func xappShutdownCb() {
+ SendDeregistermsg()
+ Logger.Info("Wait for xapp to get unregistered")
+ time.Sleep(10 * time.Second)
+}
+
+func registerxapp() {
+ var (
+ retries int = 10
+ )
+ for retries > 0 {
+ name, _ := os.Hostname()
+ httpservicename := "SERVICE_RICXAPP_" + strings.ToUpper(name) + "_HTTP_PORT"
+ httpendpoint := os.Getenv(strings.Replace(httpservicename, "-", "_", -1))
+ urlString := strings.Split(httpendpoint, "//")
+ // Added this check to make UT pass
+ if urlString[0] == "" {
+ return
+ }
+ resp, err := http.Get(fmt.Sprintf("http://%s/ric/v1/health/ready", urlString[1]))
+ retries -= 1
+ time.Sleep(5 * time.Second)
+ if err != nil {
+ Logger.Error("Error in health check: %v", err)
+ }
+ if err == nil {
+ retries -= 10
+ Logger.Info("Health Probe Success with resp.StatusCode is %v", resp.StatusCode)
+ if resp.StatusCode >= 200 && resp.StatusCode <= 299 {
+ go SendRegistermsg()
+ }
+ } else {
+ Logger.Info("Health Probe failed, retrying...")
+ }
+ }
+}
+
+func SendRegistermsg() {
+ name, _ := os.Hostname()
+ xappname := viper.GetString("name")
+ xappversion := viper.GetString("version")
+ appnamespace := os.Getenv("APP_NAMESPACE")
+ if appnamespace == "" {
+ appnamespace = "ricxapp"
+ }
+ httpservicename := "SERVICE_" + strings.ToUpper(appnamespace) + "_" + strings.ToUpper(name) + "_HTTP_PORT"
+ rmrservicename := "SERVICE_" + strings.ToUpper(appnamespace) + "_" + strings.ToUpper(name) + "_RMR_PORT"
+ httpendpointstr := os.Getenv(strings.Replace(httpservicename, "-", "_", -1))
+ rmrendpointstr := os.Getenv(strings.Replace(rmrservicename, "-", "_", -1))
+ httpendpoint := strings.Split(httpendpointstr, "//")
+ rmrendpoint := strings.Split(rmrendpointstr, "//")
+ if httpendpoint[0] == "" || rmrendpoint[0] == "" {
+ return
+ }
+
+ pltnamespace := os.Getenv("PLT_NAMESPACE")
+ if pltnamespace == "" {
+ pltnamespace = "ricplt"
+ }
+
+ configpath := "/ric/v1/config"
+
+ requestBody, err := json.Marshal(map[string]string{
+ "appName": name,
+ "httpEndpoint": httpendpoint[1],
+ "rmrEndpoint": rmrendpoint[1],
+ "appInstanceName": xappname,
+ "appVersion": xappversion,
+ "configPath": configpath,
+ })
+
+ if err != nil {
+ Logger.Info("Error while compiling request to appmgr: %v", err)
+ } else {
+ url := fmt.Sprintf("http://service-%v-appmgr-http.%v:8080/ric/v1/register", pltnamespace, pltnamespace)
+ resp, err := http.Post(url, "application/json", bytes.NewBuffer(requestBody))
+ Logger.Info(" Resp is %v", resp)
+ if err != nil {
+ Logger.Info("Error compiling request to appmgr: %v", err)
+ }
+ Logger.Info("Registering request sent. Response received is :%v", resp)
+
+ if resp != nil {
+ body, err := ioutil.ReadAll(resp.Body)
+ Logger.Info("Post body is %v", resp.Body)
+ if err != nil {
+ Logger.Info("rsp: Error compiling request to appmgr: %v", string(body))
+ }
+ defer resp.Body.Close()
+ }
+ }
+}
+
+func SendDeregistermsg() {
+
+ name, _ := os.Hostname()
+ xappname := viper.GetString("name")
+
+ appnamespace := os.Getenv("APP_NAMESPACE")
+ if appnamespace == "" {
+ appnamespace = "ricxapp"
+ }
+ pltnamespace := os.Getenv("PLT_NAMESPACE")
+ if pltnamespace == "" {
+ pltnamespace = "ricplt"
+ }
+
+ requestBody, err := json.Marshal(map[string]string{
+ "appName": name,
+ "appInstanceName": xappname,
+ })
+
+ if err != nil {
+ Logger.Info("Error while compiling request to appmgr: %v", err)
+ } else {
+ url := fmt.Sprintf("http://service-%v-appmgr-http.%v:8080/ric/v1/deregister", pltnamespace, pltnamespace)
+ resp, err := http.Post(url, "application/json", bytes.NewBuffer(requestBody))
+ Logger.Info(" Resp is %v", resp)
+ if err != nil {
+ Logger.Info("Error compiling request to appmgr: %v", err)
+ }
+ Logger.Info("Deregistering request sent. Response received is :%v", resp)
+
+ if resp != nil {
+ body, err := ioutil.ReadAll(resp.Body)
+ Logger.Info("Post body is %v", resp.Body)
+ if err != nil {
+ Logger.Info("rsp: Error compiling request to appmgr: %v", string(body))
+ }
+ defer resp.Body.Close()
+ }
+ }
+}
+
func SetShutdownCB(cb ShutdownCB) {
shutdownCb = cb
}
@@ -143,13 +281,14 @@
func RunWithParams(c MessageConsumer, sdlcheck bool) {
Rmr = NewRMRClient()
Rmr.SetReadyCB(XappReadyCb, nil)
-
+ SetShutdownCB(xappShutdownCb)
host := fmt.Sprintf(":%d", GetPortData("http").Port)
go http.ListenAndServe(host, Resource.router)
Logger.Info(fmt.Sprintf("Xapp started, listening on: %s", host))
if sdlcheck {
Sdl.TestConnection()
}
+ go registerxapp()
Rmr.Start(c)
}
diff --git a/pkg/xapp/xapp_test.go b/pkg/xapp/xapp_test.go
index 04bbbb8..173b57f 100755
--- a/pkg/xapp/xapp_test.go
+++ b/pkg/xapp/xapp_test.go
@@ -20,16 +20,16 @@
package xapp
import (
+ "bytes"
"github.com/gorilla/mux"
"github.com/spf13/viper"
+ "github.com/stretchr/testify/assert"
"net/http"
"net/http/httptest"
- "github.com/stretchr/testify/assert"
"os"
"strings"
"testing"
"time"
- "bytes"
)
//var _ = func() bool {
@@ -118,8 +118,8 @@
params.Payload = []byte{1, 2, 3, 4, 5, 6}
params.Meid = &RMRMeid{PlmnID: "1234", EnbID: "7788", RanName: "RanName-1234"}
params.Xid = "TestXID"
-
- if i % 2 == 0 {
+
+ if i%2 == 0 {
Rmr.SendMsg(params)
} else {
Rmr.SendWithRetry(params, false, 1)
@@ -332,11 +332,11 @@
func TestConfigAccess(t *testing.T) {
Logger.Info("CASE: AddConfigChangeListener")
-
- assert.Equal(t, Config.GetString("name"), "xapp")
- assert.Equal(t, Config.GetInt("controls.logger.level"), 3)
- assert.Equal(t, Config.GetUint32("controls.logger.level"), uint32(3))
- assert.Equal(t, Config.GetBool("controls.waitForSdl"), false)
+
+ assert.Equal(t, Config.GetString("name"), "xapp")
+ assert.Equal(t, Config.GetInt("controls.logger.level"), 3)
+ assert.Equal(t, Config.GetUint32("controls.logger.level"), uint32(3))
+ assert.Equal(t, Config.GetBool("controls.waitForSdl"), false)
Config.Get("controls")
Config.GetStringSlice("messaging.ports")
Config.GetStringMap("messaging.ports")
@@ -354,7 +354,7 @@
}
func TestNewRMRClient(t *testing.T) {
- c := map[string]interface{} {"protPort": "tcp:4560"}
+ c := map[string]interface{}{"protPort": "tcp:4560"}
viper.Set("rmr", c)
assert.NotNil(t, NewRMRClient(), "NewRMRClient failed")
@@ -423,6 +423,23 @@
executeRequest(req, handleFunc)
}
+func TestappconfigHandler(t *testing.T) {
+ Logger.Error("CASE: TestappconfigHandler")
+ req, _ := http.NewRequest("POST", "/ric/v1/config", bytes.NewBuffer([]byte{}))
+ handleFunc := http.HandlerFunc(appconfigHandler)
+ executeRequest(req, handleFunc)
+}
+
+func TestSendRegistermsg(t *testing.T) {
+ Logger.Error("CASE: TestSendRegistermsg")
+ SendRegistermsg()
+}
+
+func TestSendDeregistermsg(t *testing.T) {
+ Logger.Error("CASE: TestSendDeregistermsg")
+ SendDeregistermsg()
+}
+
func TestMisc(t *testing.T) {
Logger.Info("CASE: TestMisc")