// 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) charset := "utf-8" //STANDARD DECLARATIONS END // Set Content-Type response Header value contentType := r.Header.Get("Accept") h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) vars := mux.Vars(r) 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 }
//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) // Set Content-Type response Header value contentType := r.Header.Get("Accept") h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) // Grab Tenant DB configuration from context tenantDbConfig := context.Get(r, "tenant_conf").(config.MongoConfig) incoming := MongoInterface{} // 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 := []MongoInterface{} err = mongo.Find(session, tenantDbConfig.Db, "metric_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 } // run the update query err = mongo.Update(session, tenantDbConfig.Db, "metric_profiles", filter, incoming) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Create view for response message output, err = createMsgView("Metric Profile successfully updated", 200) //Render the results into JSON code = 200 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 }
// 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) charset := "utf-8" //STANDARD DECLARATIONS END // Set Content-Type response Header value contentType := r.Header.Get("Accept") h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) // Grab Tenant DB configuration from context tenantDbConfig := context.Get(r, "tenant_conf").(config.MongoConfig) //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 }