X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=dmaap-mediator-producer%2Finternal%2Fserver%2Fserver.go;h=bc4a1dabfb55975f33e0a181b9e80488b41916bf;hb=6b45b053fe289bf0b01b40e4939832fa636e1617;hp=c3a1331cabc1f779495ae1971d9f29d335ae5090;hpb=63a42cacf9c52b7dff64431a3354f55c49bd6e4b;p=nonrtric.git diff --git a/dmaap-mediator-producer/internal/server/server.go b/dmaap-mediator-producer/internal/server/server.go index c3a1331c..bc4a1dab 100644 --- a/dmaap-mediator-producer/internal/server/server.go +++ b/dmaap-mediator-producer/internal/server/server.go @@ -26,34 +26,49 @@ import ( "io/ioutil" "net/http" + "github.com/gorilla/mux" + log "github.com/sirupsen/logrus" "oransc.org/nonrtric/dmaapmediatorproducer/internal/jobs" ) -func StatusHandler(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { - http.Error(w, "404 not found.", http.StatusNotFound) - return - } - - if r.Method != "GET" { - http.Error(w, "Method is not supported.", http.StatusMethodNotAllowed) - return - } +const HealthCheckPath = "/health_check" +const AddJobPath = "/info_job" +const jobIdToken = "infoJobId" +const deleteJobPath = AddJobPath + "/{" + jobIdToken + "}" +const logLevelToken = "level" +const logAdminPath = "/admin/log" - fmt.Fprintf(w, "All is well!") +type ProducerCallbackHandler struct { + jobsManager jobs.JobsManager } -func CreateInfoJobHandler(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/producer_simulator/info_job" { - http.Error(w, "404 not found.", http.StatusNotFound) - return +func NewProducerCallbackHandler(jm jobs.JobsManager) *ProducerCallbackHandler { + return &ProducerCallbackHandler{ + jobsManager: jm, } +} - if r.Method != "POST" { - http.Error(w, "Method is not supported.", http.StatusMethodNotAllowed) - return - } +func NewRouter(jm jobs.JobsManager, hcf func(http.ResponseWriter, *http.Request)) *mux.Router { + callbackHandler := NewProducerCallbackHandler(jm) + r := mux.NewRouter() + 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 +} +// @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 {string} Cause of error +// @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) @@ -64,18 +79,54 @@ func CreateInfoJobHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, fmt.Sprintf("Invalid json body. Cause: %v", unmarshalErr), http.StatusBadRequest) return } - if err := jobs.AddJob(jobInfo); err != nil { + if err := h.jobsManager.AddJobFromRESTCall(jobInfo); err != nil { http.Error(w, fmt.Sprintf("Invalid job info. Cause: %v", err), http.StatusBadRequest) } } -func CreateServer(port int, handlerFunc func(http.ResponseWriter, *http.Request)) *http.Server { +// @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] + if !ok { + http.Error(w, "Must provide infoJobId.", http.StatusBadRequest) + return + } + + h.jobsManager.DeleteJobFromRESTCall(id) +} - mux := http.NewServeMux() - mux.HandleFunc("/", handlerFunc) - server := http.Server{ - Addr: fmt.Sprintf(":%v", port), // :{port} - Handler: mux, +// @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 {string} Cause of error +// @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 { + http.Error(w, fmt.Sprintf("Invalid log level: %v. Log level will not be changed!", logLevelStr), http.StatusBadRequest) + return } - return &server +} + +type notFoundHandler struct{} + +func (h *notFoundHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + http.Error(w, "404 not found.", http.StatusNotFound) +} + +type methodNotAllowedHandler struct{} + +func (h *methodNotAllowedHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + http.Error(w, "Method is not supported.", http.StatusMethodNotAllowed) }