X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=dmaap-mediator-producer%2Finternal%2Fserver%2Fserver.go;h=46bc2a23315507ab6d934f0737be746c1ac1e74c;hb=237a4da4b9419171f774bd6a02f61bef81f1b60f;hp=5861cbe7944a647df4200676d5538d423ee8603d;hpb=f1cee0f81c6bc482f73182c8f4c903e8376381e8;p=nonrtric.git diff --git a/dmaap-mediator-producer/internal/server/server.go b/dmaap-mediator-producer/internal/server/server.go index 5861cbe7..46bc2a23 100644 --- a/dmaap-mediator-producer/internal/server/server.go +++ b/dmaap-mediator-producer/internal/server/server.go @@ -27,55 +27,84 @@ import ( "net/http" "github.com/gorilla/mux" + log "github.com/sirupsen/logrus" "oransc.org/nonrtric/dmaapmediatorproducer/internal/jobs" ) -const StatusPath = "/status" -const AddJobPath = "/jobs" +const HealthCheckPath = "/health_check" +const AddJobPath = "/info_job" const jobIdToken = "infoJobId" const deleteJobPath = AddJobPath + "/{" + jobIdToken + "}" +const logLevelToken = "level" +const logAdminPath = "/admin/log" + +type ErrorInfo struct { + // A URI reference that identifies the problem type. + Type string `json:"type" swaggertype:"string"` + // A short, human-readable summary of the problem type. + Title string `json:"title" swaggertype:"string"` + // The HTTP status code generated by the origin server for this occurrence of the problem. + Status int `json:"status" swaggertype:"integer" example:"400"` + // A human-readable explanation specific to this occurrence of the problem. + Detail string `json:"detail" swaggertype:"string" example:"Info job type not found"` + // A URI reference that identifies the specific occurrence of the problem. + Instance string `json:"instance" swaggertype:"string"` +} // @name ErrorInfo type ProducerCallbackHandler struct { - jobHandler jobs.JobHandler + jobsManager jobs.JobsManager } -func NewProducerCallbackHandler(jh jobs.JobHandler) *ProducerCallbackHandler { +func NewProducerCallbackHandler(jm jobs.JobsManager) *ProducerCallbackHandler { return &ProducerCallbackHandler{ - jobHandler: jh, + jobsManager: jm, } } -func NewRouter(jh jobs.JobHandler) *mux.Router { - callbackHandler := NewProducerCallbackHandler(jh) +func NewRouter(jm jobs.JobsManager, hcf func(http.ResponseWriter, *http.Request)) *mux.Router { + callbackHandler := NewProducerCallbackHandler(jm) r := mux.NewRouter() - r.HandleFunc(StatusPath, statusHandler).Methods(http.MethodGet).Name("status") + r.HandleFunc(HealthCheckPath, hcf).Methods(http.MethodGet).Name("health_check") r.HandleFunc(AddJobPath, callbackHandler.addInfoJobHandler).Methods(http.MethodPost).Name("add") r.HandleFunc(deleteJobPath, callbackHandler.deleteInfoJobHandler).Methods(http.MethodDelete).Name("delete") + r.HandleFunc(logAdminPath, callbackHandler.setLogLevel).Methods(http.MethodPut).Name("setLogLevel") r.NotFoundHandler = ¬FoundHandler{} r.MethodNotAllowedHandler = &methodNotAllowedHandler{} return r } -func statusHandler(w http.ResponseWriter, r *http.Request) { - // Just respond OK to show the server is alive for now. Might be extended later. -} - +// @Summary Add info job +// @Description Callback for ICS to add an info job +// @Tags Data producer (callbacks) +// @Accept json +// @Param user body jobs.JobInfo true "Info job data" +// @Success 200 +// @Failure 400 {object} ErrorInfo "Problem as defined in https://tools.ietf.org/html/rfc7807" +// @Header 400 {string} Content-Type "application/problem+json" +// @Router /info_job [post] func (h *ProducerCallbackHandler) addInfoJobHandler(w http.ResponseWriter, r *http.Request) { b, readErr := ioutil.ReadAll(r.Body) if readErr != nil { - http.Error(w, fmt.Sprintf("Unable to read body due to: %v", readErr), http.StatusBadRequest) + returnError(fmt.Sprintf("Unable to read body due to: %v", readErr), w) return } jobInfo := jobs.JobInfo{} if unmarshalErr := json.Unmarshal(b, &jobInfo); unmarshalErr != nil { - http.Error(w, fmt.Sprintf("Invalid json body. Cause: %v", unmarshalErr), http.StatusBadRequest) + returnError(fmt.Sprintf("Invalid json body. Cause: %v", unmarshalErr), w) return } - if err := h.jobHandler.AddJob(jobInfo); err != nil { - http.Error(w, fmt.Sprintf("Invalid job info. Cause: %v", err), http.StatusBadRequest) + if err := h.jobsManager.AddJobFromRESTCall(jobInfo); err != nil { + returnError(fmt.Sprintf("Invalid job info. Cause: %v", err), w) + return } } +// @Summary Delete info job +// @Description Callback for ICS to delete an info job +// @Tags Data producer (callbacks) +// @Param infoJobId path string true "Info job ID" +// @Success 200 +// @Router /info_job/{infoJobId} [delete] func (h *ProducerCallbackHandler) deleteInfoJobHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) id, ok := vars[jobIdToken] @@ -84,7 +113,26 @@ func (h *ProducerCallbackHandler) deleteInfoJobHandler(w http.ResponseWriter, r return } - h.jobHandler.DeleteJob(id) + h.jobsManager.DeleteJobFromRESTCall(id) +} + +// @Summary Set log level +// @Description Set the log level of the producer. +// @Tags Admin +// @Param level query string false "string enums" Enums(Error, Warn, Info, Debug) +// @Success 200 +// @Failure 400 {object} ErrorInfo "Problem as defined in https://tools.ietf.org/html/rfc7807" +// @Header 400 {string} Content-Type "application/problem+json" +// @Router /admin/log [put] +func (h *ProducerCallbackHandler) setLogLevel(w http.ResponseWriter, r *http.Request) { + query := r.URL.Query() + logLevelStr := query.Get(logLevelToken) + if loglevel, err := log.ParseLevel(logLevelStr); err == nil { + log.SetLevel(loglevel) + } else { + returnError(fmt.Sprintf("Invalid log level: %v. Log level will not be changed!", logLevelStr), w) + return + } } type notFoundHandler struct{} @@ -98,3 +146,13 @@ type methodNotAllowedHandler struct{} func (h *methodNotAllowedHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.Error(w, "Method is not supported.", http.StatusMethodNotAllowed) } + +func returnError(msg string, w http.ResponseWriter) { + errInfo := ErrorInfo{ + Status: http.StatusBadRequest, + Detail: msg, + } + w.Header().Add("Content-Type", "application/problem+json") + w.WriteHeader(http.StatusBadRequest) + json.NewEncoder(w).Encode(errInfo) +}