// ListOne lists a single recomputation according to the given id func ListOne(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) // contentType := "application/json" charset := "utf-8" //STANDARD DECLARATIONS END // urlValues := r.URL.Query() contentType := r.Header.Get("Accept") vars := mux.Vars(r) contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { output, _ = respond.MarshalContent(respond.UnauthorizedMessage, contentType, "", " ") code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status return code, h, output, err } filter := IncomingRecomputation{ ID: vars["ID"], } session, err := mongo.OpenSession(tenantDbConfig) if err != nil { code = http.StatusInternalServerError return code, h, output, err } result := MongoInterface{} err = mongo.FindOne(session, tenantDbConfig.Db, recomputationsColl, filter, &result) if err != nil { code = http.StatusInternalServerError return code, h, output, err } output, err = createListView(result, contentType) return code, h, output, err }
func routeCheckGroup(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("group check") err := error(nil) contentType := "application/xml" charset := "utf-8" //STANDARD DECLARATIONS END // Handle response format based on Accept Header // Default is application/xml format := r.Header.Get("Accept") if strings.EqualFold(format, "application/json") { contentType = "application/json" } vars := mux.Vars(r) tenantcfg, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { return code, h, output, err } session, err := mongo.OpenSession(tenantcfg) defer mongo.CloseSession(session) if err != nil { return code, h, output, err } result := reports.MongoInterface{} err = mongo.FindOne(session, tenantcfg.Db, "reports", bson.M{"info.name": vars["report_name"]}, &result) if err != nil { message := "The report with the name " + vars["report_name"] + " does not exist" output, err := createMessageOUT(message, format) //Render the response into XML or JSON h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } if vars["group_type"] != result.GetEndpointGroupType() { message := "The report " + vars["report_name"] + " does not define endpoint group type: " + vars["group_type"] output, err := createMessageOUT(message, format) //Render the response into XML or JSON h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } return ListEndpointTimelines(r, cfg) }
// ListServiceFlavorResults is responsible for handling request to list service flavor results func ListServiceFlavorResults(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "application/xml" charset := "utf-8" //STANDARD DECLARATIONS END contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } // Parse the request into the input urlValues := r.URL.Query() vars := mux.Vars(r) tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { if err.Error() == "Unauthorized" { code = http.StatusUnauthorized out := respond.UnauthorizedMessage output = out.MarshalTo(contentType) return code, h, output, err } code = http.StatusInternalServerError return code, h, output, err } session, err := mongo.OpenSession(tenantDbConfig) defer mongo.CloseSession(session) if err != nil { code = http.StatusInternalServerError return code, h, output, err } report := reports.MongoInterface{} err = mongo.FindOne(session, tenantDbConfig.Db, "reports", bson.M{"info.name": vars["report_name"]}, &report) if err != nil { code = http.StatusBadRequest message := "The report with the name " + vars["report_name"] + " does not exist" output, err := createErrorMessage(message, contentType) //Render the response into XML or JSON h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } input := serviceFlavorResultQuery{ basicQuery: basicQuery{ Name: vars["service_type"], Granularity: urlValues.Get("granularity"), Format: contentType, StartTime: urlValues.Get("start_time"), EndTime: urlValues.Get("end_time"), Report: report, Vars: vars, }, EndpointGroup: vars["lgroup_name"], } tenantDB := session.DB(tenantDbConfig.Db) errs := input.Validate(tenantDB) if len(errs) > 0 { out := respond.BadRequestSimple out.Errors = errs output = out.MarshalTo(contentType) code = 400 return code, h, output, err } if vars["lgroup_type"] != report.GetEndpointGroupType() { code = http.StatusBadRequest message := "The report " + vars["report_name"] + " does not define endpoint group type: " + vars["lgroup_type"] + ". Try using " + report.GetEndpointGroupType() + " instead." output, err := createErrorMessage(message, contentType) //Render the response into XML or JSON h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } results := []ServiceFlavorInterface{} if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Construct the query to mongodb based on the input filter := bson.M{ "date": bson.M{"$gte": input.StartTimeInt, "$lte": input.EndTimeInt}, "report": report.ID, } if input.Name != "" { filter["name"] = input.Name } if input.EndpointGroup != "" { filter["supergroup"] = input.EndpointGroup } // Select the granularity of the search daily/monthly if input.Granularity == "daily" { customForm[0] = "20060102" customForm[1] = "2006-01-02" query := DailyServiceFlavor(filter) err = mongo.Pipe(session, tenantDbConfig.Db, "service_ar", query, &results) } else if input.Granularity == "monthly" { customForm[0] = "200601" customForm[1] = "2006-01" query := MonthlyServiceFlavor(filter) err = mongo.Pipe(session, tenantDbConfig.Db, "service_ar", query, &results) } // mongo.Find(session, tenantDbConfig.Db, "endpoint_group_ar", bson.M{}, "_id", &results) if err != nil { code = http.StatusInternalServerError return code, h, output, err } output, err = createServiceFlavorResultView(results, report, input.Format) if err != nil { code = http.StatusInternalServerError return code, h, output, err } return code, h, output, err }
func routeGroup(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "application/xml" charset := "utf-8" //STANDARD DECLARATIONS END // Handle response format based on Accept Header // Default is application/xml format := r.Header.Get("Accept") if strings.EqualFold(format, "application/json") { contentType = "application/json" } vars := mux.Vars(r) tenantcfg, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { if err.Error() == "Unauthorized" { code = http.StatusUnauthorized message := err.Error() output, err = createErrorMessage(message, contentType) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } code = http.StatusInternalServerError return code, h, output, err } session, err := mongo.OpenSession(tenantcfg) defer mongo.CloseSession(session) if err != nil { return code, h, output, err } requestedReport := reports.MongoInterface{} err = mongo.FindOne(session, tenantcfg.Db, "reports", bson.M{"info.name": vars["report_name"]}, &requestedReport) if err != nil { code = http.StatusBadRequest message := "The report with the name " + vars["report_name"] + " does not exist" output, err := createErrorMessage(message, contentType) //Render the response into XML or JSON h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } selectedGroupType := requestedReport.DetermineGroupType(vars["group_type"]) if selectedGroupType == "endpoint" { if vars["lgroup_type"] == "" { vars["lgroup_type"] = vars["group_type"] vars["lgroup_name"] = vars["group_name"] vars["group_type"] = "" vars["group_name"] = "" } return ListEndpointGroupResults(r, cfg) } else if selectedGroupType == "group" { return ListSuperGroupResults(r, cfg) } code = http.StatusBadRequest message := "The report " + vars["report_name"] + " does not define any group type: " + vars["group_type"] output, err = createErrorMessage(message, format) //Render the response into XML or JSON h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", format, charset)) return code, h, output, err }
// ListMetricTimelines returns a list of metric timelines func ListMetricTimelines(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("List Metric Timelines") err := error(nil) contentType := "application/xml" charset := "utf-8" //STANDARD DECLARATIONS END contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } // Parse the request into the input urlValues := r.URL.Query() vars := mux.Vars(r) parsedStart, parsedEnd, errs := respond.ValidateDateRange(urlValues.Get("start_time"), urlValues.Get("end_time")) if len(errs) > 0 { code = http.StatusBadRequest output = respond.CreateFailureResponseMessage("Bad Request", "400", errs).MarshalTo(contentType) } input := InputParams{ parsedStart, parsedEnd, vars["report_name"], vars["group_type"], vars["group_name"], vars["service_name"], vars["endpoint_name"], vars["metric_name"], contentType, } // Call authenticateTenant to check the api key and retrieve // the correct tenant db conf tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { output = []byte(http.StatusText(http.StatusUnauthorized)) code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } // Mongo Session results := []DataOutput{} session, err := mongo.OpenSession(tenantDbConfig) defer mongo.CloseSession(session) metricCollection := session.DB(tenantDbConfig.Db).C("status_metrics") // Query the detailed metric results reportID, err := mongo.GetReportID(session, tenantDbConfig.Db, input.report) if err != nil { code = http.StatusInternalServerError return code, h, output, err } err = metricCollection.Find(prepareQuery(input, reportID)).All(&results) if err != nil { code = http.StatusInternalServerError return code, h, output, err } output, err = createView(results, input) //Render the results into XML format h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err }
// Update function used to implement update tenant request. // This is an http PUT request that gets a specific tenant's name // as a urlvar parameter input and a json structure in the request // body in order to update the datastore document for the specific // tenant func Update(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "text/xml" charset := "utf-8" //STANDARD DECLARATIONS END // Content Negotiation contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) vars := mux.Vars(r) // if authentication procedure fails then // return unauthorized if authentication.AuthenticateAdmin(r.Header, cfg) == false { output, _ = respond.MarshalContent(respond.UnauthorizedMessage, contentType, "", " ") code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status return code, h, output, err } incoming := Tenant{} // ingest body data body, err := ioutil.ReadAll(io.LimitReader(r.Body, cfg.Server.ReqSizeLimit)) if err != nil { panic(err) } if err := r.Body.Close(); err != nil { panic(err) } // parse body json if err := json.Unmarshal(body, &incoming); err != nil { output, _ = respond.MarshalContent(respond.BadRequestBadJSON, contentType, "", " ") code = http.StatusBadRequest return code, h, output, err } // Try to open the mongo session session, err := mongo.OpenSession(cfg.MongoDB) defer session.Close() if err != nil { code = http.StatusInternalServerError return code, h, output, err } // create filter to retrieve specific profile with id filter := bson.M{"id": vars["ID"]} incoming.ID = vars["ID"] // Retrieve Results from database results := []Tenant{} err = mongo.Find(session, cfg.MongoDB.Db, "tenants", filter, "name", &results) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Check if nothing found if len(results) < 1 { output, _ = respond.MarshalContent(respond.NotFound, contentType, "", " ") code = http.StatusNotFound return code, h, output, err } // If user chose to change name - check if name already exists if results[0].Info.Name != incoming.Info.Name { sameName := []Tenant{} filter = bson.M{"info.name": incoming.Info.Name} err = mongo.Find(session, cfg.MongoDB.Db, "tenants", filter, "name", &sameName) if len(sameName) > 1 { code = http.StatusConflict output, err = createMsgView("Tenant with same name already exists", code) return code, h, output, err } } // run the update query incoming.Info.Created = results[0].Info.Created incoming.Info.Updated = time.Now().Format("2006-01-02 15:04:05") filter = bson.M{"id": vars["ID"]} err = mongo.Update(session, cfg.MongoDB.Db, "tenants", filter, incoming) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Create view for response message output, err = createMsgView("Tenant successfully updated", 200) //Render the results into JSON code = http.StatusOK return code, h, output, err }
// Delete function used to implement remove tenant request func Delete(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "text/xml" charset := "utf-8" //STANDARD DECLARATIONS END // Content Negotiation contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) vars := mux.Vars(r) // if authentication procedure fails then // return unauthorized if authentication.AuthenticateAdmin(r.Header, cfg) == false { output, _ = respond.MarshalContent(respond.UnauthorizedMessage, contentType, "", " ") code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status return code, h, output, err } // Try to open the mongo session session, err := mongo.OpenSession(cfg.MongoDB) defer session.Close() if err != nil { code = http.StatusInternalServerError return code, h, output, err } filter := bson.M{"id": vars["ID"]} // Retrieve Results from database results := []Tenant{} err = mongo.Find(session, cfg.MongoDB.Db, "tenants", filter, "name", &results) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Check if nothing found if len(results) < 1 { output, _ = respond.MarshalContent(respond.NotFound, contentType, "", " ") code = http.StatusNotFound return code, h, output, err } mongo.Remove(session, cfg.MongoDB.Db, "tenants", filter) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Create view of the results output, err = createMsgView("Tenant Successfully Deleted", 200) //Render the results into JSON if err != nil { code = http.StatusInternalServerError return code, h, output, err } h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err }
// ListOne handles the listing of one specific profile based on its given id func ListOne(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "text/xml" charset := "utf-8" //STANDARD DECLARATIONS END // Content Negotiation contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) vars := mux.Vars(r) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } // Tenant Authentication tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { output, _ = respond.MarshalContent(respond.UnauthorizedMessage, contentType, "", " ") code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status return code, h, output, err } // Open session to tenant database session, err := mongo.OpenSession(tenantDbConfig) defer mongo.CloseSession(session) if err != nil { code = http.StatusInternalServerError return code, h, output, err } filter := bson.M{"id": vars["ID"]} // Retrieve Results from database results := []OpsProfile{} err = mongo.Find(session, tenantDbConfig.Db, "operations_profiles", filter, "name", &results) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Check if nothing found if len(results) < 1 { output, _ = respond.MarshalContent(respond.NotFound, contentType, "", " ") code = 404 return code, h, output, err } // Create view of the results output, err = createListView(results, "Success", code) //Render the results into JSON if err != nil { code = http.StatusInternalServerError return code, h, output, err } h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err }
// ListOne function implement an http GET request that accepts // a name parameter urlvar and retrieves information only for the // specific tenant func ListOne(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "text/xml" charset := "utf-8" //STANDARD DECLARATIONS END vars := mux.Vars(r) // Content Negotiation contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } // if authentication procedure fails then // return unauthorized http status if authentication.AuthenticateAdmin(r.Header, cfg) == false { output, _ = respond.MarshalContent(respond.UnauthorizedMessage, contentType, "", " ") code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status return code, h, output, err } // Try to open the mongo session session, err := mongo.OpenSession(cfg.MongoDB) defer session.Close() if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Create structure to hold query results results := []Tenant{} // Create a simple query object to query by id query := bson.M{"id": vars["ID"]} // Query collection tenants for the specific tenant id err = mongo.Find(session, cfg.MongoDB.Db, "tenants", query, "name", &results) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Check if nothing found if len(results) < 1 { output, _ = respond.MarshalContent(respond.NotFound, contentType, "", " ") code = http.StatusNotFound return code, h, output, err } // After successfully retrieving the db results // call the createView function to render them into idented xml output, err = createListView(results, "Success", code) if err != nil { code = http.StatusInternalServerError return code, h, output, err } h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err }
//Update function to update contents of an existing metric profile func Update(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) charset := "utf-8" //STANDARD DECLARATIONS END vars := mux.Vars(r) contentType, err := respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { output, _ = respond.MarshalContent(respond.UnauthorizedMessage, contentType, "", " ") code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status return code, h, output, err } incoming := OpsProfile{} // ingest body data body, err := ioutil.ReadAll(io.LimitReader(r.Body, cfg.Server.ReqSizeLimit)) if err != nil { panic(err) } if err := r.Body.Close(); err != nil { panic(err) } // parse body json if err := json.Unmarshal(body, &incoming); err != nil { output, _ = respond.MarshalContent(respond.BadRequestBadJSON, contentType, "", " ") code = 400 return code, h, output, err } session, err := mongo.OpenSession(tenantDbConfig) defer mongo.CloseSession(session) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // create filter to retrieve specific profile with id filter := bson.M{"id": vars["ID"]} incoming.ID = vars["ID"] // Retrieve Results from database results := []OpsProfile{} err = mongo.Find(session, tenantDbConfig.Db, "operations_profiles", filter, "name", &results) if err != nil { panic(err) } // Check if nothing found if len(results) < 1 { output, _ = respond.MarshalContent(respond.NotFound, contentType, "", " ") code = 404 return code, h, output, err } // Validate States var errList []string errList = append(errList, incoming.validateDuplicates()...) errList = append(errList, incoming.validateStates()...) errList = append(errList, incoming.validateMentions()...) if len(errList) > 0 { output, err = createErrView("Validation Error", 422, errList) code = 422 return code, h, output, err } // run the update query err = mongo.Update(session, tenantDbConfig.Db, "operations_profiles", filter, incoming) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Create view for response message output, err = createMsgView("Operations Profile successfully updated", 200) //Render the results into JSON code = 200 return code, h, output, err }
// Delete function used to implement remove report request func Delete(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "text/xml" charset := "utf-8" //STANDARD DECLARATIONS END contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { output, _ = respond.MarshalContent(respond.UnauthorizedMessage, contentType, "", " ") code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status return code, h, output, err } //Extracting record id from url id := mux.Vars(r)["id"] // Try to open the mongo session session, err := mongo.OpenSession(tenantDbConfig) defer session.Close() if err != nil { code = http.StatusInternalServerError return code, h, output, err } // We search by name and delete the document in db query := bson.M{"id": id} info, err := mongo.Remove(session, tenantDbConfig.Db, reportsColl, query) if err != nil { if err.Error() != "not found" { code = http.StatusInternalServerError return code, h, output, err } //Render the response into XML code = http.StatusNotFound output, err = ReportNotFound(contentType) return code, h, output, err } // info.Removed > 0 means that many documents have been removed // If deletion took place we notify user accordingly. // Else we notify that no tenant matched the specific name if info.Removed > 0 { code = http.StatusOK output, err = respond.CreateResponseMessage("Report was successfully deleted", "200", contentType) } else { code = http.StatusNotFound output, err = ReportNotFound(contentType) } //Render the response into XML if err != nil { code = http.StatusInternalServerError return code, h, output, err } return code, h, output, err }
// Update function used to implement update report request. // This is an http PUT request that gets a specific report's name // as a urlvar parameter input and a json structure in the request // body in order to update the datastore document for the specific // report func Update(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "text/xml" charset := "utf-8" //STANDARD DECLARATIONS END contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { output, _ = respond.MarshalContent(respond.UnauthorizedMessage, contentType, "", " ") code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status return code, h, output, err } //Extracting report name from url id := mux.Vars(r)["id"] //Reading the json input reqBody, err := ioutil.ReadAll(r.Body) input := MongoInterface{} //Unmarshalling the json input into byte form err = json.Unmarshal(reqBody, &input) if err != nil { // User provided malformed json input data output, _ := respond.MarshalContent(respond.MalformedJSONInput, contentType, "", " ") code = http.StatusBadRequest h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } sanitizedInput := bson.M{ "$set": bson.M{ // "info": bson.M{ "info.name": input.Info.Name, "info.description": input.Info.Description, "info.updated": time.Now().Format("2006-01-02 15:04:05"), // }, "profiles": input.Profiles, "filter_tags": input.Tags, "topology_schema": input.Topology, }} // Try to open the mongo session session, err := mongo.OpenSession(tenantDbConfig) defer session.Close() if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Validate profiles given in report validationErrors := input.ValidateProfiles(session.DB(tenantDbConfig.Db)) if len(validationErrors) > 0 { code = 422 out := respond.UnprocessableEntity out.Errors = validationErrors output = out.MarshalTo(contentType) return code, h, output, err } // We search by name and update query := bson.M{"id": id} err = mongo.Update(session, tenantDbConfig.Db, reportsColl, query, sanitizedInput) if err != nil { if err.Error() != "not found" { code = http.StatusInternalServerError return code, h, output, err } //Render the response into XML code = http.StatusNotFound output, err = ReportNotFound(contentType) return code, h, output, err } //Render the response into XML output, err = respond.CreateResponseMessage("Report was successfully updated", "200", contentType) if err != nil { code = http.StatusInternalServerError return code, h, output, err } code = http.StatusOK return code, h, output, err }
// ListOne function that implements the http GET request that retrieves // all avaiable report information func ListOne(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "text/xml" charset := "utf-8" //STANDARD DECLARATIONS END contentType, err = respond.ParseAcceptHeader(r) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) if err != nil { code = http.StatusNotAcceptable output, _ = respond.MarshalContent(respond.NotAcceptableContentType, contentType, "", " ") return code, h, output, err } tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { output, _ = respond.MarshalContent(respond.UnauthorizedMessage, contentType, "", " ") code = http.StatusUnauthorized //If wrong api key is passed we return UNAUTHORIZED http status return code, h, output, err } //Extracting urlvar "name" from url path id := mux.Vars(r)["id"] // Try to open the mongo session session, err := mongo.OpenSession(tenantDbConfig) defer session.Close() if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Create structure for storing query results result := MongoInterface{} // Create a simple query object to query by name query := bson.M{"id": id} // Query collection tenants for the specific tenant name err = mongo.FindOne(session, tenantDbConfig.Db, reportsColl, query, &result) // If query returned zero result then no tenant matched this name, // abort and notify user accordingly if err != nil { code = http.StatusNotFound output, _ := ReportNotFound(contentType) h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } // After successfully retrieving the db results // call the createView function to render them into idented xml output, err = createView([]MongoInterface{result}, contentType) if err != nil { code = http.StatusInternalServerError return code, h, output, err } code = http.StatusOK h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err }
// GetMetricResult returns the detailed message from a probe func GetMetricResult(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusOK h := http.Header{} output := []byte("") err := error(nil) contentType := "application/xml" charset := "utf-8" //STANDARD DECLARATIONS END tenantDbConfig, err := authentication.AuthenticateTenant(r.Header, cfg) if err != nil { if err.Error() == "Unauthorized" { code = http.StatusUnauthorized return code, h, output, err } code = http.StatusInternalServerError return code, h, output, err } // Parse the request into the input urlValues := r.URL.Query() vars := mux.Vars(r) input := metricResultQuery{ EndpointName: vars["endpoint_name"], MetricName: vars["metric_name"], Format: r.Header.Get("Accept"), ExecTime: urlValues.Get("exec_time"), } // TODO: Decide which format (xml or json) should be the default if input.Format == "application/xml" { contentType = "application/xml" } else if input.Format == "application/json" { contentType = "application/json" } h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) session, err := mongo.OpenSession(tenantDbConfig) defer mongo.CloseSession(session) if err != nil { code = http.StatusInternalServerError return code, h, output, err } result := metricResultOutput{} metricCol := session.DB(tenantDbConfig.Db).C("status_metrics") // Query the detailed metric results err = metricCol.Find(prepQuery(input)).One(&result) output, err = createMetricResultView(result, input.Format) if err != nil { code = http.StatusInternalServerError return code, h, output, err } return code, h, output, err }