From: Anssi Mannila Date: Thu, 30 Sep 2021 05:33:34 +0000 (+0300) Subject: Subscription REST interface update X-Git-Tag: v0.9.3^0 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=30c8dd99d62f5e4eb0b7a4b966e790493f2e194f;p=ric-plt%2Fxapp-frame.git Subscription REST interface update - Two new Http error causes 404, 503 added for REST subscription request - Earlier added Reject Cause element removed as it did not worked as planned - Some default values removed as they did not worked as planned. Those are set in Submgr code Change-Id: Iac336f678478f4b34a1f76c99b09c827d124d365 Signed-off-by: Anssi Mannila --- diff --git a/api/xapp_rest_api.yaml b/api/xapp_rest_api.yaml index 8f08dd9..c2e1be0 100644 --- a/api/xapp_rest_api.yaml +++ b/api/xapp_rest_api.yaml @@ -1,7 +1,7 @@ swagger: '2.0' info: description: This is the initial REST API for RIC subscription - version: 0.0.3 + version: 0.0.4 title: RIC subscription license: name: Apache 2.0 @@ -63,9 +63,13 @@ paths: schema: $ref: '#/definitions/SubscriptionResponse' '400': + description: Not Found + '404': description: Invalid input '500': description: Internal error + '503': + description: Service Unavailable '/subscriptions/{subscriptionId}': delete: tags: @@ -244,24 +248,22 @@ definitions: minimum: 0 maximum: 4095 E2SubscriptionDirectives: + description: Optional. If not set Submgr uses its default values type: object properties: E2TimeoutTimerValue: description: How long time response is waited from E2 node type: integer - default: 2 minimum: 1 maximum: 10 E2RetryCount: description: How many times E2 subscription request is retried type: integer - default: 2 minimum: 0 maximum: 10 RMRRoutingNeeded: description: Subscription needs RMR route from E2Term to xApp type: boolean - default: True SubscriptionDetails: $ref: '#/definitions/SubscriptionDetailsList' SubscriptionResponse: @@ -281,9 +283,6 @@ definitions: required: - XappEventInstanceId - E2EventInstanceId - - ErrorCause - - ErrorSource - - TimeoutType properties: XappEventInstanceId: type: integer @@ -293,32 +292,17 @@ definitions: type: integer minimum: 0 maximum: 65535 - RejectCause: - description: Reason for REST subscription rejection. - type: string - default: None - enum: - - None - - REST-subscription-ongoing # xApp should retry after delay - - REST-subscription-delete-ongoing # xApp should retry after delay - - Invalid-REST-request-message - - REST-subscription-with-given-id-does-not-exist - - E2-interface-down - - Other ErrorCause: description: Descriptive error cause. Empty string when no error. type: string - default: '' ErrorSource: description: Source of error cause. type: string - default: None - enum: [None, SUBMGR, RTMGR, DBAAS, ASN1, E2Node] + enum: [SUBMGR, RTMGR, DBAAS, ASN1, E2Node] TimeoutType: - description: Type timeout. xApp should retry if timeout occours. + description: Type timeout. xApp should retry if timeout occurs. type: string - default: None - enum: [None, E2-Timeout, RTMGR-Timeout, DBAAS-Timeout] + enum: [E2-Timeout, RTMGR-Timeout, DBAAS-Timeout] SubscriptionData: type: object properties: diff --git a/pkg/clientapi/common/subscribe_responses.go b/pkg/clientapi/common/subscribe_responses.go index db86016..a50361a 100644 --- a/pkg/clientapi/common/subscribe_responses.go +++ b/pkg/clientapi/common/subscribe_responses.go @@ -35,12 +35,24 @@ func (o *SubscribeReader) ReadResponse(response runtime.ClientResponse, consumer return nil, err } return nil, result + case 404: + result := NewSubscribeNotFound() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return nil, result case 500: result := NewSubscribeInternalServerError() if err := result.readResponse(response, consumer, o.formats); err != nil { return nil, err } return nil, result + case 503: + result := NewSubscribeServiceUnavailable() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return nil, result default: return nil, runtime.NewAPIError("unknown error", response, response.Code()) @@ -87,7 +99,7 @@ func NewSubscribeBadRequest() *SubscribeBadRequest { /*SubscribeBadRequest handles this case with default header values. -Invalid input +Not Found */ type SubscribeBadRequest struct { } @@ -101,6 +113,27 @@ func (o *SubscribeBadRequest) readResponse(response runtime.ClientResponse, cons return nil } +// NewSubscribeNotFound creates a SubscribeNotFound with default headers values +func NewSubscribeNotFound() *SubscribeNotFound { + return &SubscribeNotFound{} +} + +/*SubscribeNotFound handles this case with default header values. + +Invalid input +*/ +type SubscribeNotFound struct { +} + +func (o *SubscribeNotFound) Error() string { + return fmt.Sprintf("[POST /subscriptions][%d] subscribeNotFound ", 404) +} + +func (o *SubscribeNotFound) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + return nil +} + // NewSubscribeInternalServerError creates a SubscribeInternalServerError with default headers values func NewSubscribeInternalServerError() *SubscribeInternalServerError { return &SubscribeInternalServerError{} @@ -121,3 +154,24 @@ func (o *SubscribeInternalServerError) readResponse(response runtime.ClientRespo return nil } + +// NewSubscribeServiceUnavailable creates a SubscribeServiceUnavailable with default headers values +func NewSubscribeServiceUnavailable() *SubscribeServiceUnavailable { + return &SubscribeServiceUnavailable{} +} + +/*SubscribeServiceUnavailable handles this case with default header values. + +Service Unavailable +*/ +type SubscribeServiceUnavailable struct { +} + +func (o *SubscribeServiceUnavailable) Error() string { + return fmt.Sprintf("[POST /subscriptions][%d] subscribeServiceUnavailable ", 503) +} + +func (o *SubscribeServiceUnavailable) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + + return nil +} diff --git a/pkg/clientmodel/subscription_instance.go b/pkg/clientmodel/subscription_instance.go index 8c6ae48..9cdf5d9 100644 --- a/pkg/clientmodel/subscription_instance.go +++ b/pkg/clientmodel/subscription_instance.go @@ -26,22 +26,15 @@ type SubscriptionInstance struct { E2EventInstanceID *int64 `json:"E2EventInstanceId"` // Descriptive error cause. Empty string when no error. - // Required: true - ErrorCause *string `json:"ErrorCause"` + ErrorCause string `json:"ErrorCause,omitempty"` // Source of error cause. - // Required: true - // Enum: [None SUBMGR RTMGR DBAAS ASN1 E2Node] - ErrorSource *string `json:"ErrorSource"` + // Enum: [SUBMGR RTMGR DBAAS ASN1 E2Node] + ErrorSource string `json:"ErrorSource,omitempty"` - // Reason for REST subscription rejection. - // Enum: [None REST-subscription-ongoing REST-subscription-delete-ongoing Invalid-REST-request-message REST-subscription-with-given-id-does-not-exist E2-interface-down Other] - RejectCause *string `json:"RejectCause,omitempty"` - - // Type timeout. xApp should retry if timeout occours. - // Required: true - // Enum: [None E2-Timeout RTMGR-Timeout DBAAS-Timeout] - TimeoutType *string `json:"TimeoutType"` + // Type timeout. xApp should retry if timeout occurs. + // Enum: [E2-Timeout RTMGR-Timeout DBAAS-Timeout] + TimeoutType string `json:"TimeoutType,omitempty"` // xapp event instance Id // Required: true @@ -58,18 +51,10 @@ func (m *SubscriptionInstance) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := m.validateErrorCause(formats); err != nil { - res = append(res, err) - } - if err := m.validateErrorSource(formats); err != nil { res = append(res, err) } - if err := m.validateRejectCause(formats); err != nil { - res = append(res, err) - } - if err := m.validateTimeoutType(formats); err != nil { res = append(res, err) } @@ -101,20 +86,11 @@ func (m *SubscriptionInstance) validateE2EventInstanceID(formats strfmt.Registry return nil } -func (m *SubscriptionInstance) validateErrorCause(formats strfmt.Registry) error { - - if err := validate.Required("ErrorCause", "body", m.ErrorCause); err != nil { - return err - } - - return nil -} - var subscriptionInstanceTypeErrorSourcePropEnum []interface{} func init() { var res []string - if err := json.Unmarshal([]byte(`["None","SUBMGR","RTMGR","DBAAS","ASN1","E2Node"]`), &res); err != nil { + if err := json.Unmarshal([]byte(`["SUBMGR","RTMGR","DBAAS","ASN1","E2Node"]`), &res); err != nil { panic(err) } for _, v := range res { @@ -124,9 +100,6 @@ func init() { const ( - // SubscriptionInstanceErrorSourceNone captures enum value "None" - SubscriptionInstanceErrorSourceNone string = "None" - // SubscriptionInstanceErrorSourceSUBMGR captures enum value "SUBMGR" SubscriptionInstanceErrorSourceSUBMGR string = "SUBMGR" @@ -153,70 +126,12 @@ func (m *SubscriptionInstance) validateErrorSourceEnum(path, location string, va func (m *SubscriptionInstance) validateErrorSource(formats strfmt.Registry) error { - if err := validate.Required("ErrorSource", "body", m.ErrorSource); err != nil { - return err - } - - // value enum - if err := m.validateErrorSourceEnum("ErrorSource", "body", *m.ErrorSource); err != nil { - return err - } - - return nil -} - -var subscriptionInstanceTypeRejectCausePropEnum []interface{} - -func init() { - var res []string - if err := json.Unmarshal([]byte(`["None","REST-subscription-ongoing","REST-subscription-delete-ongoing","Invalid-REST-request-message","REST-subscription-with-given-id-does-not-exist","E2-interface-down","Other"]`), &res); err != nil { - panic(err) - } - for _, v := range res { - subscriptionInstanceTypeRejectCausePropEnum = append(subscriptionInstanceTypeRejectCausePropEnum, v) - } -} - -const ( - - // SubscriptionInstanceRejectCauseNone captures enum value "None" - SubscriptionInstanceRejectCauseNone string = "None" - - // SubscriptionInstanceRejectCauseRESTSubscriptionOngoing captures enum value "REST-subscription-ongoing" - SubscriptionInstanceRejectCauseRESTSubscriptionOngoing string = "REST-subscription-ongoing" - - // SubscriptionInstanceRejectCauseRESTSubscriptionDeleteOngoing captures enum value "REST-subscription-delete-ongoing" - SubscriptionInstanceRejectCauseRESTSubscriptionDeleteOngoing string = "REST-subscription-delete-ongoing" - - // SubscriptionInstanceRejectCauseInvalidRESTRequestMessage captures enum value "Invalid-REST-request-message" - SubscriptionInstanceRejectCauseInvalidRESTRequestMessage string = "Invalid-REST-request-message" - - // SubscriptionInstanceRejectCauseRESTSubscriptionWithGivenIDDoesNotExist captures enum value "REST-subscription-with-given-id-does-not-exist" - SubscriptionInstanceRejectCauseRESTSubscriptionWithGivenIDDoesNotExist string = "REST-subscription-with-given-id-does-not-exist" - - // SubscriptionInstanceRejectCauseE2InterfaceDown captures enum value "E2-interface-down" - SubscriptionInstanceRejectCauseE2InterfaceDown string = "E2-interface-down" - - // SubscriptionInstanceRejectCauseOther captures enum value "Other" - SubscriptionInstanceRejectCauseOther string = "Other" -) - -// prop value enum -func (m *SubscriptionInstance) validateRejectCauseEnum(path, location string, value string) error { - if err := validate.Enum(path, location, value, subscriptionInstanceTypeRejectCausePropEnum); err != nil { - return err - } - return nil -} - -func (m *SubscriptionInstance) validateRejectCause(formats strfmt.Registry) error { - - if swag.IsZero(m.RejectCause) { // not required + if swag.IsZero(m.ErrorSource) { // not required return nil } // value enum - if err := m.validateRejectCauseEnum("RejectCause", "body", *m.RejectCause); err != nil { + if err := m.validateErrorSourceEnum("ErrorSource", "body", m.ErrorSource); err != nil { return err } @@ -227,7 +142,7 @@ var subscriptionInstanceTypeTimeoutTypePropEnum []interface{} func init() { var res []string - if err := json.Unmarshal([]byte(`["None","E2-Timeout","RTMGR-Timeout","DBAAS-Timeout"]`), &res); err != nil { + if err := json.Unmarshal([]byte(`["E2-Timeout","RTMGR-Timeout","DBAAS-Timeout"]`), &res); err != nil { panic(err) } for _, v := range res { @@ -237,9 +152,6 @@ func init() { const ( - // SubscriptionInstanceTimeoutTypeNone captures enum value "None" - SubscriptionInstanceTimeoutTypeNone string = "None" - // SubscriptionInstanceTimeoutTypeE2Timeout captures enum value "E2-Timeout" SubscriptionInstanceTimeoutTypeE2Timeout string = "E2-Timeout" @@ -260,12 +172,12 @@ func (m *SubscriptionInstance) validateTimeoutTypeEnum(path, location string, va func (m *SubscriptionInstance) validateTimeoutType(formats strfmt.Registry) error { - if err := validate.Required("TimeoutType", "body", m.TimeoutType); err != nil { - return err + if swag.IsZero(m.TimeoutType) { // not required + return nil } // value enum - if err := m.validateTimeoutTypeEnum("TimeoutType", "body", *m.TimeoutType); err != nil { + if err := m.validateTimeoutTypeEnum("TimeoutType", "body", m.TimeoutType); err != nil { return err } diff --git a/pkg/clientmodel/subscription_params.go b/pkg/clientmodel/subscription_params.go index b116e50..8e22633 100644 --- a/pkg/clientmodel/subscription_params.go +++ b/pkg/clientmodel/subscription_params.go @@ -257,7 +257,7 @@ func (m *SubscriptionParamsClientEndpoint) UnmarshalBinary(b []byte) error { return nil } -// SubscriptionParamsE2SubscriptionDirectives subscription params e2 subscription directives +// SubscriptionParamsE2SubscriptionDirectives Optional. If not set Submgr uses its default values // // swagger:model SubscriptionParamsE2SubscriptionDirectives type SubscriptionParamsE2SubscriptionDirectives struct { @@ -273,7 +273,7 @@ type SubscriptionParamsE2SubscriptionDirectives struct { E2TimeoutTimerValue int64 `json:"E2TimeoutTimerValue,omitempty"` // Subscription needs RMR route from E2Term to xApp - RMRRoutingNeeded *bool `json:"RMRRoutingNeeded,omitempty"` + RMRRoutingNeeded bool `json:"RMRRoutingNeeded,omitempty"` } // Validate validates this subscription params e2 subscription directives diff --git a/pkg/models/subscription_instance.go b/pkg/models/subscription_instance.go index e028de9..970ae26 100644 --- a/pkg/models/subscription_instance.go +++ b/pkg/models/subscription_instance.go @@ -26,22 +26,15 @@ type SubscriptionInstance struct { E2EventInstanceID *int64 `json:"E2EventInstanceId"` // Descriptive error cause. Empty string when no error. - // Required: true - ErrorCause *string `json:"ErrorCause"` + ErrorCause string `json:"ErrorCause,omitempty"` // Source of error cause. - // Required: true - // Enum: [None SUBMGR RTMGR DBAAS ASN1 E2Node] - ErrorSource *string `json:"ErrorSource"` + // Enum: [SUBMGR RTMGR DBAAS ASN1 E2Node] + ErrorSource string `json:"ErrorSource,omitempty"` - // Reason for REST subscription rejection. - // Enum: [None REST-subscription-ongoing REST-subscription-delete-ongoing Invalid-REST-request-message REST-subscription-with-given-id-does-not-exist E2-interface-down Other] - RejectCause *string `json:"RejectCause,omitempty"` - - // Type timeout. xApp should retry if timeout occours. - // Required: true - // Enum: [None E2-Timeout RTMGR-Timeout DBAAS-Timeout] - TimeoutType *string `json:"TimeoutType"` + // Type timeout. xApp should retry if timeout occurs. + // Enum: [E2-Timeout RTMGR-Timeout DBAAS-Timeout] + TimeoutType string `json:"TimeoutType,omitempty"` // xapp event instance Id // Required: true @@ -58,18 +51,10 @@ func (m *SubscriptionInstance) Validate(formats strfmt.Registry) error { res = append(res, err) } - if err := m.validateErrorCause(formats); err != nil { - res = append(res, err) - } - if err := m.validateErrorSource(formats); err != nil { res = append(res, err) } - if err := m.validateRejectCause(formats); err != nil { - res = append(res, err) - } - if err := m.validateTimeoutType(formats); err != nil { res = append(res, err) } @@ -101,20 +86,11 @@ func (m *SubscriptionInstance) validateE2EventInstanceID(formats strfmt.Registry return nil } -func (m *SubscriptionInstance) validateErrorCause(formats strfmt.Registry) error { - - if err := validate.Required("ErrorCause", "body", m.ErrorCause); err != nil { - return err - } - - return nil -} - var subscriptionInstanceTypeErrorSourcePropEnum []interface{} func init() { var res []string - if err := json.Unmarshal([]byte(`["None","SUBMGR","RTMGR","DBAAS","ASN1","E2Node"]`), &res); err != nil { + if err := json.Unmarshal([]byte(`["SUBMGR","RTMGR","DBAAS","ASN1","E2Node"]`), &res); err != nil { panic(err) } for _, v := range res { @@ -124,9 +100,6 @@ func init() { const ( - // SubscriptionInstanceErrorSourceNone captures enum value "None" - SubscriptionInstanceErrorSourceNone string = "None" - // SubscriptionInstanceErrorSourceSUBMGR captures enum value "SUBMGR" SubscriptionInstanceErrorSourceSUBMGR string = "SUBMGR" @@ -153,70 +126,12 @@ func (m *SubscriptionInstance) validateErrorSourceEnum(path, location string, va func (m *SubscriptionInstance) validateErrorSource(formats strfmt.Registry) error { - if err := validate.Required("ErrorSource", "body", m.ErrorSource); err != nil { - return err - } - - // value enum - if err := m.validateErrorSourceEnum("ErrorSource", "body", *m.ErrorSource); err != nil { - return err - } - - return nil -} - -var subscriptionInstanceTypeRejectCausePropEnum []interface{} - -func init() { - var res []string - if err := json.Unmarshal([]byte(`["None","REST-subscription-ongoing","REST-subscription-delete-ongoing","Invalid-REST-request-message","REST-subscription-with-given-id-does-not-exist","E2-interface-down","Other"]`), &res); err != nil { - panic(err) - } - for _, v := range res { - subscriptionInstanceTypeRejectCausePropEnum = append(subscriptionInstanceTypeRejectCausePropEnum, v) - } -} - -const ( - - // SubscriptionInstanceRejectCauseNone captures enum value "None" - SubscriptionInstanceRejectCauseNone string = "None" - - // SubscriptionInstanceRejectCauseRESTSubscriptionOngoing captures enum value "REST-subscription-ongoing" - SubscriptionInstanceRejectCauseRESTSubscriptionOngoing string = "REST-subscription-ongoing" - - // SubscriptionInstanceRejectCauseRESTSubscriptionDeleteOngoing captures enum value "REST-subscription-delete-ongoing" - SubscriptionInstanceRejectCauseRESTSubscriptionDeleteOngoing string = "REST-subscription-delete-ongoing" - - // SubscriptionInstanceRejectCauseInvalidRESTRequestMessage captures enum value "Invalid-REST-request-message" - SubscriptionInstanceRejectCauseInvalidRESTRequestMessage string = "Invalid-REST-request-message" - - // SubscriptionInstanceRejectCauseRESTSubscriptionWithGivenIDDoesNotExist captures enum value "REST-subscription-with-given-id-does-not-exist" - SubscriptionInstanceRejectCauseRESTSubscriptionWithGivenIDDoesNotExist string = "REST-subscription-with-given-id-does-not-exist" - - // SubscriptionInstanceRejectCauseE2InterfaceDown captures enum value "E2-interface-down" - SubscriptionInstanceRejectCauseE2InterfaceDown string = "E2-interface-down" - - // SubscriptionInstanceRejectCauseOther captures enum value "Other" - SubscriptionInstanceRejectCauseOther string = "Other" -) - -// prop value enum -func (m *SubscriptionInstance) validateRejectCauseEnum(path, location string, value string) error { - if err := validate.Enum(path, location, value, subscriptionInstanceTypeRejectCausePropEnum); err != nil { - return err - } - return nil -} - -func (m *SubscriptionInstance) validateRejectCause(formats strfmt.Registry) error { - - if swag.IsZero(m.RejectCause) { // not required + if swag.IsZero(m.ErrorSource) { // not required return nil } // value enum - if err := m.validateRejectCauseEnum("RejectCause", "body", *m.RejectCause); err != nil { + if err := m.validateErrorSourceEnum("ErrorSource", "body", m.ErrorSource); err != nil { return err } @@ -227,7 +142,7 @@ var subscriptionInstanceTypeTimeoutTypePropEnum []interface{} func init() { var res []string - if err := json.Unmarshal([]byte(`["None","E2-Timeout","RTMGR-Timeout","DBAAS-Timeout"]`), &res); err != nil { + if err := json.Unmarshal([]byte(`["E2-Timeout","RTMGR-Timeout","DBAAS-Timeout"]`), &res); err != nil { panic(err) } for _, v := range res { @@ -237,9 +152,6 @@ func init() { const ( - // SubscriptionInstanceTimeoutTypeNone captures enum value "None" - SubscriptionInstanceTimeoutTypeNone string = "None" - // SubscriptionInstanceTimeoutTypeE2Timeout captures enum value "E2-Timeout" SubscriptionInstanceTimeoutTypeE2Timeout string = "E2-Timeout" @@ -260,12 +172,12 @@ func (m *SubscriptionInstance) validateTimeoutTypeEnum(path, location string, va func (m *SubscriptionInstance) validateTimeoutType(formats strfmt.Registry) error { - if err := validate.Required("TimeoutType", "body", m.TimeoutType); err != nil { - return err + if swag.IsZero(m.TimeoutType) { // not required + return nil } // value enum - if err := m.validateTimeoutTypeEnum("TimeoutType", "body", *m.TimeoutType); err != nil { + if err := m.validateTimeoutTypeEnum("TimeoutType", "body", m.TimeoutType); err != nil { return err } diff --git a/pkg/models/subscription_params.go b/pkg/models/subscription_params.go index a7151d5..5eda090 100644 --- a/pkg/models/subscription_params.go +++ b/pkg/models/subscription_params.go @@ -257,7 +257,7 @@ func (m *SubscriptionParamsClientEndpoint) UnmarshalBinary(b []byte) error { return nil } -// SubscriptionParamsE2SubscriptionDirectives subscription params e2 subscription directives +// SubscriptionParamsE2SubscriptionDirectives Optional. If not set Submgr uses its default values // // swagger:model SubscriptionParamsE2SubscriptionDirectives type SubscriptionParamsE2SubscriptionDirectives struct { @@ -273,7 +273,7 @@ type SubscriptionParamsE2SubscriptionDirectives struct { E2TimeoutTimerValue int64 `json:"E2TimeoutTimerValue,omitempty"` // Subscription needs RMR route from E2Term to xApp - RMRRoutingNeeded *bool `json:"RMRRoutingNeeded,omitempty"` + RMRRoutingNeeded bool `json:"RMRRoutingNeeded,omitempty"` } // Validate validates this subscription params e2 subscription directives diff --git a/pkg/restapi/operations/common/subscribe_responses.go b/pkg/restapi/operations/common/subscribe_responses.go index 4af5582..34c5d19 100644 --- a/pkg/restapi/operations/common/subscribe_responses.go +++ b/pkg/restapi/operations/common/subscribe_responses.go @@ -60,7 +60,7 @@ func (o *SubscribeCreated) WriteResponse(rw http.ResponseWriter, producer runtim // SubscribeBadRequestCode is the HTTP code returned for type SubscribeBadRequest const SubscribeBadRequestCode int = 400 -/*SubscribeBadRequest Invalid input +/*SubscribeBadRequest Not Found swagger:response subscribeBadRequest */ @@ -81,6 +81,30 @@ func (o *SubscribeBadRequest) WriteResponse(rw http.ResponseWriter, producer run rw.WriteHeader(400) } +// SubscribeNotFoundCode is the HTTP code returned for type SubscribeNotFound +const SubscribeNotFoundCode int = 404 + +/*SubscribeNotFound Invalid input + +swagger:response subscribeNotFound +*/ +type SubscribeNotFound struct { +} + +// NewSubscribeNotFound creates SubscribeNotFound with default headers values +func NewSubscribeNotFound() *SubscribeNotFound { + + return &SubscribeNotFound{} +} + +// WriteResponse to the client +func (o *SubscribeNotFound) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.Header().Del(runtime.HeaderContentType) //Remove Content-Type on empty responses + + rw.WriteHeader(404) +} + // SubscribeInternalServerErrorCode is the HTTP code returned for type SubscribeInternalServerError const SubscribeInternalServerErrorCode int = 500 @@ -104,3 +128,27 @@ func (o *SubscribeInternalServerError) WriteResponse(rw http.ResponseWriter, pro rw.WriteHeader(500) } + +// SubscribeServiceUnavailableCode is the HTTP code returned for type SubscribeServiceUnavailable +const SubscribeServiceUnavailableCode int = 503 + +/*SubscribeServiceUnavailable Service Unavailable + +swagger:response subscribeServiceUnavailable +*/ +type SubscribeServiceUnavailable struct { +} + +// NewSubscribeServiceUnavailable creates SubscribeServiceUnavailable with default headers values +func NewSubscribeServiceUnavailable() *SubscribeServiceUnavailable { + + return &SubscribeServiceUnavailable{} +} + +// WriteResponse to the client +func (o *SubscribeServiceUnavailable) WriteResponse(rw http.ResponseWriter, producer runtime.Producer) { + + rw.Header().Del(runtime.HeaderContentType) //Remove Content-Type on empty responses + + rw.WriteHeader(503) +} diff --git a/pkg/xapp/subscription.go b/pkg/xapp/subscription.go index 01e351f..8f49e99 100755 --- a/pkg/xapp/subscription.go +++ b/pkg/xapp/subscription.go @@ -120,11 +120,14 @@ func (r *Subscriber) Listen(createSubscription SubscriptionHandler, getSubscript // Subscription: Subscribe api.CommonSubscribeHandler = common.SubscribeHandlerFunc( func(params common.SubscribeParams) middleware.Responder { - Logger.Error("Subscribe: Params=%+v", params.SubscriptionParams) resp, retCode := createSubscription(params.SubscriptionParams) if retCode != common.SubscribeCreatedCode { if retCode == common.SubscribeBadRequestCode { return common.NewSubscribeBadRequest() + } else if retCode == common.SubscribeNotFoundCode { + return common.NewSubscribeNotFound() + } else if retCode == common.SubscribeServiceUnavailableCode { + return common.NewSubscribeServiceUnavailable() } else { return common.NewSubscribeInternalServerError() } @@ -135,7 +138,6 @@ func (r *Subscriber) Listen(createSubscription SubscriptionHandler, getSubscript // Subscription: Unsubscribe api.CommonUnsubscribeHandler = common.UnsubscribeHandlerFunc( func(p common.UnsubscribeParams) middleware.Responder { - Logger.Error("Unsubscribe: SubscriptionID=%+v", p.SubscriptionID) retCode := delSubscription(p.SubscriptionID) if retCode != common.UnsubscribeNoContentCode { if retCode == common.UnsubscribeBadRequestCode { @@ -209,7 +211,6 @@ func (r *Subscriber) Subscribe(p *apimodel.SubscriptionParams) (*apimodel.Subscr if err != nil { return &apimodel.SubscriptionResponse{}, err } - return result.Payload, err } diff --git a/pkg/xapp/subscription_test.go b/pkg/xapp/subscription_test.go index d41649f..ffdea34 100755 --- a/pkg/xapp/subscription_test.go +++ b/pkg/xapp/subscription_test.go @@ -35,7 +35,7 @@ var ( procedureCode = int64(27) typeOfMessage = int64(1) subscriptionId = "" - hPort = int64(8080) + hPort = int64(8086) // See log: "Xapp started, listening on: :8086" rPort = int64(4560) clientEndpoint = clientmodel.SubscriptionParamsClientEndpoint{Host: "localhost", HTTPPort: &hPort, RMRPort: &rPort} ) @@ -56,12 +56,14 @@ func TestSubscriptionQueryHandling(t *testing.T) { assert.Equal(t, resp[0].SubscriptionID, int64(11)) assert.Equal(t, resp[0].Meid, "Test-Gnb") assert.Equal(t, resp[0].ClientEndpoint, []string{"127.0.0.1:4056"}) + <-time.After(1 * time.Second) } func TestSubscriptionHandling(t *testing.T) { subscriptionParams := GetSubscriptionparams() Subscription.SetResponseCB(func(resp *clientmodel.SubscriptionResponse) { + fmt.Println("TestSubscriptionHandling: notification received") assert.Equal(t, len(resp.SubscriptionInstances), 1) assert.Equal(t, *resp.SubscriptionInstances[0].XappEventInstanceID, int64(11)) assert.Equal(t, *resp.SubscriptionInstances[0].E2EventInstanceID, int64(22)) @@ -69,13 +71,15 @@ func TestSubscriptionHandling(t *testing.T) { _, err := Subscription.Subscribe(subscriptionParams) assert.Equal(t, err, nil) + <-time.After(1 * time.Second) } func TestSubscriptionWithClientProvidedIdHandling(t *testing.T) { subscriptionParams := GetSubscriptionparams() subscriptionParams.SubscriptionID = "myxapp" - + Subscription.SetResponseCB(func(resp *clientmodel.SubscriptionResponse) { + fmt.Println("TestSubscriptionWithClientProvidedIdHandling: notification received") assert.Equal(t, len(resp.SubscriptionInstances), 1) assert.Equal(t, *resp.SubscriptionInstances[0].XappEventInstanceID, int64(11)) assert.Equal(t, *resp.SubscriptionInstances[0].E2EventInstanceID, int64(22)) @@ -83,36 +87,69 @@ func TestSubscriptionWithClientProvidedIdHandling(t *testing.T) { _, err := Subscription.Subscribe(subscriptionParams) assert.Equal(t, err, nil) + <-time.After(1 * time.Second) } -func TestBadRequestSubscriptionHandling(t *testing.T) { +func TestFailureNotificationHandling(t *testing.T) { subscriptionParams := GetSubscriptionparams() - subscriptionParams.SubscriptionID = "123_send_bad_request_response" + subscriptionParams.SubscriptionID = "send_failure_notification" Subscription.SetResponseCB(func(resp *clientmodel.SubscriptionResponse) { assert.Equal(t, len(resp.SubscriptionInstances), 1) assert.Equal(t, *resp.SubscriptionInstances[0].XappEventInstanceID, int64(11)) - assert.Equal(t, *resp.SubscriptionInstances[0].E2EventInstanceID, int64(22)) + assert.Equal(t, *resp.SubscriptionInstances[0].E2EventInstanceID, int64(0)) + assert.Equal(t, resp.SubscriptionInstances[0].ErrorCause, "Some error") + assert.Equal(t, resp.SubscriptionInstances[0].ErrorSource, "SUBMGR") + assert.Equal(t, resp.SubscriptionInstances[0].TimeoutType, "E2-Timeout") }) + _, err := Subscription.Subscribe(subscriptionParams) + assert.Equal(t, err, nil) + <-time.After(1 * time.Second) +} + +func TestBadRequestSubscriptionHandling(t *testing.T) { + subscriptionParams := GetSubscriptionparams() + subscriptionParams.SubscriptionID = "send_400_bad_request_response" + + // Notification is not coming + _, err := Subscription.Subscribe(subscriptionParams) assert.Equal(t, err.Error(), "[POST /subscriptions][400] subscribeBadRequest ") - fmt.Println("Error:",err) + fmt.Println("Error:", err) +} + +func TestNotFoundRequestSubscriptionHandling(t *testing.T) { + subscriptionParams := GetSubscriptionparams() + subscriptionParams.SubscriptionID = "send_404_not_found_response" + + // Notification is not coming + + _, err := Subscription.Subscribe(subscriptionParams) + assert.Equal(t, err.Error(), "[POST /subscriptions][404] subscribeNotFound ") + fmt.Println("Error:", err) } func TestInternalServerErrorSubscriptionHandling(t *testing.T) { subscriptionParams := GetSubscriptionparams() - subscriptionParams.SubscriptionID = "123_send_internal_server_error_response" + subscriptionParams.SubscriptionID = "send_500_internal_server_error_response" - Subscription.SetResponseCB(func(resp *clientmodel.SubscriptionResponse) { - assert.Equal(t, len(resp.SubscriptionInstances), 1) - assert.Equal(t, *resp.SubscriptionInstances[0].XappEventInstanceID, int64(11)) - assert.Equal(t, *resp.SubscriptionInstances[0].E2EventInstanceID, int64(22)) - }) + // Notification is not coming _, err := Subscription.Subscribe(subscriptionParams) assert.Equal(t, err.Error(), "[POST /subscriptions][500] subscribeInternalServerError ") - fmt.Println("Error:",err) + fmt.Println("Error:", err) +} + +func TestServiceUnavailableSubscriptionHandling(t *testing.T) { + subscriptionParams := GetSubscriptionparams() + subscriptionParams.SubscriptionID = "send_503_Service_Unavailable_response" + + // Notification is not coming + + _, err := Subscription.Subscribe(subscriptionParams) + assert.Equal(t, err.Error(), "[POST /subscriptions][503] subscribeServiceUnavailable ") + fmt.Println("Error:", err) } func GetSubscriptionparams() *clientmodel.SubscriptionParams { @@ -142,25 +179,25 @@ func GetSubscriptionparams() *clientmodel.SubscriptionParams { } func TestSuccessfulSubscriptionDeleteHandling(t *testing.T) { - subscriptionId = "123_send_successful_response" + subscriptionId = "send_201_successful_response" err := Subscription.Unsubscribe(subscriptionId) assert.Equal(t, err, nil) - fmt.Println("Error:",err) + fmt.Println("Error:", err) } func TestBadRequestSubscriptionDeleteHandling(t *testing.T) { - subscriptionId = "123_send_bad_request_response" + subscriptionId = "send_400_bad_request_response" err := Subscription.Unsubscribe(subscriptionId) assert.NotEqual(t, err, nil) - fmt.Println("Error:",err.Error()) + fmt.Println("Error:", err.Error()) assert.Equal(t, err.Error(), "[DELETE /subscriptions/{subscriptionId}][400] unsubscribeBadRequest ") } func TestInternalServerErrorSubscriptionDeleteHandling(t *testing.T) { - subscriptionId = "123_send_internal_server_error_response" + subscriptionId = "send_500_internal_server_error_response" err := Subscription.Unsubscribe(subscriptionId) assert.NotEqual(t, err, nil) - fmt.Println("Error:",err.Error()) + fmt.Println("Error:", err.Error()) assert.Equal(t, err.Error(), "[DELETE /subscriptions/{subscriptionId}][500] unsubscribeInternalServerError ") } @@ -188,22 +225,51 @@ func SubscriptionRespHandler(resp *clientmodel.SubscriptionResponse) { } func processSubscriptions(subscriptionId string) { - // Generate requestorId, instanceId + + // Generate xappInstanceId xappInstanceId := int64(11) - e2InstanceId := int64(22) - resp := &models.SubscriptionResponse{ - SubscriptionID: &subscriptionId, - SubscriptionInstances: []*models.SubscriptionInstance{ - { - XappEventInstanceID: &xappInstanceId, - E2EventInstanceID: &e2InstanceId, + if subscriptionId == "send_failure_notification" { + fmt.Println("Sending error notification") + + // Generate e2InstanceId + e2InstanceId := int64(0) + resp := &models.SubscriptionResponse{ + SubscriptionID: &subscriptionId, + SubscriptionInstances: []*models.SubscriptionInstance{ + { + XappEventInstanceID: &xappInstanceId, + E2EventInstanceID: &e2InstanceId, + ErrorCause: "Some error", + ErrorSource: "SUBMGR", + TimeoutType: "E2-Timeout", + }, }, - }, - } + } - // Notify the client: don't worry about errors ... Notify() will handle retries, etc. - Subscription.Notify(resp, models.SubscriptionParamsClientEndpoint{Host: "localhost", HTTPPort: &hPort, RMRPort: &rPort}) + Subscription.Notify(resp, models.SubscriptionParamsClientEndpoint{Host: "localhost", HTTPPort: &hPort, RMRPort: &rPort}) + return + } else { + + fmt.Println("Sending successful notification") + + // Generate e2InstanceId + e2InstanceId := int64(22) + + resp := &models.SubscriptionResponse{ + SubscriptionID: &subscriptionId, + SubscriptionInstances: []*models.SubscriptionInstance{ + { + XappEventInstanceID: &xappInstanceId, + E2EventInstanceID: &e2InstanceId, + }, + }, + } + + // Notify the client: don't worry about errors ... Notify() will handle retries, etc. + Subscription.Notify(resp, models.SubscriptionParamsClientEndpoint{Host: "localhost", HTTPPort: &hPort, RMRPort: &rPort}) + return + } } func subscriptionHandler(params interface{}) (*models.SubscriptionResponse, int) { @@ -225,21 +291,29 @@ func subscriptionHandler(params interface{}) (*models.SubscriptionResponse, int) assert.Equal(suite, timeToWait, *p.SubscriptionDetails[0].ActionToBeSetupList[0].SubsequentAction.TimeToWait) assert.ElementsMatch(suite, []int64{5, 6, 7, 8}, p.SubscriptionDetails[0].ActionToBeSetupList[0].ActionDefinition) - // Generate a unique subscriptionId - subscriptionId = fmt.Sprintf("%s-%s", meid, clientEndpoint.Host) - - if p.SubscriptionID == "123_send_bad_request_response" { - // Simulate bad request case - return &models.SubscriptionResponse{ - }, common.UnsubscribeBadRequestCode - + if p.SubscriptionID != "send_failure_notification" { + // Generate a unique subscriptionId + subscriptionId = fmt.Sprintf("%s-%s", meid, clientEndpoint.Host) + } else { + subscriptionId = "send_failure_notification" } - - if p.SubscriptionID == "123_send_internal_server_error_response" { - // Simulate bad internal server error case - return &models.SubscriptionResponse{ - }, common.UnsubscribeInternalServerErrorCode + if p.SubscriptionID == "send_400_bad_request_response" { + fmt.Println("send_400_bad_request_response") + return &models.SubscriptionResponse{}, common.SubscribeBadRequestCode } + if p.SubscriptionID == "send_404_not_found_response" { + fmt.Println("send_404_not_found_response") + return &models.SubscriptionResponse{}, common.SubscribeNotFoundCode + } + if p.SubscriptionID == "send_500_internal_server_error_response" { + fmt.Println("send_500_internal_server_error_response") + return &models.SubscriptionResponse{}, common.SubscribeInternalServerErrorCode + } + if p.SubscriptionID == "send_503_Service_Unavailable_response" { + fmt.Println("send_503_Service_Unavailable_response") + return &models.SubscriptionResponse{}, common.SubscribeServiceUnavailableCode + } + // Process subscriptions on the background go processSubscriptions(subscriptionId) @@ -262,11 +336,14 @@ func queryHandler() (models.SubscriptionList, error) { func deleteHandler(ep string) int { assert.Equal(suite, subscriptionId, ep) - if subscriptionId == "123_send_successful_response" { + if subscriptionId == "send_201_successful_response" { return common.UnsubscribeNoContentCode - } else if subscriptionId == "123_send_bad_request_response" { + } else if subscriptionId == "send_400_bad_request_response" { return common.UnsubscribeBadRequestCode - } else { + } else if subscriptionId == "send_500_internal_server_error_response" { return common.UnsubscribeInternalServerErrorCode + } else { + fmt.Println("Unknown subscriptionId:", subscriptionId) + return 0 } } diff --git a/pkg/xapp/xapp.go b/pkg/xapp/xapp.go index b87463b..e832436 100755 --- a/pkg/xapp/xapp.go +++ b/pkg/xapp/xapp.go @@ -37,6 +37,7 @@ import ( ) // For testing purpose go version 1.13 -> + var _ = func() bool { testing.Init() return true