//Create a new metric profile func Create(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) session, err := mongo.OpenSession(tenantDbConfig) defer mongo.CloseSession(session) if err != nil { code = http.StatusInternalServerError return code, h, output, err } incoming := MongoInterface{} // Try ingest request body 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 } // Generate new id incoming.ID = mongo.NewUUID() err = mongo.Insert(session, tenantDbConfig.Db, "metric_profiles", incoming) if err != nil { panic(err) } // Create view of the results output, err = createRefView(incoming, "Metric Profile successfully created", 201, r) //Render the results into JSON code = 201 return code, h, output, err }
// Create function is used to implement the create tenant request. // The request is an http POST request with the tenant description // provided as json structure in the request body func Create(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)) // Try ingest request body 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) } incoming := Tenant{} // 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 } // Check if name exists sameName := []Tenant{} filter := bson.M{"info.name": incoming.Info.Name} err = mongo.Find(session, cfg.MongoDB.Db, "tenants", filter, "name", &sameName) if len(sameName) > 0 { code = http.StatusConflict output, err = createMsgView("Tenant with same name already exists", code) return code, h, output, err } // Generate new id incoming.ID = mongo.NewUUID() incoming.Info.Created = time.Now().Format("2006-01-02 15:04:05") incoming.Info.Updated = incoming.Info.Created err = mongo.Insert(session, cfg.MongoDB.Db, "tenants", incoming) if err != nil { panic(err) } // Create view of the results output, err = createRefView(incoming, "Tenant was succesfully created", 201, r) //Render the results into JSON code = http.StatusCreated return code, h, output, err }
// SubmitRecomputation insert a new pending recomputation in the tenants database func SubmitRecomputation(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusAccepted h := http.Header{} output := []byte("") err := error(nil) 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 } session, err := mongo.OpenSession(tenantDbConfig) if err != nil { code = http.StatusInternalServerError return code, h, output, err } var recompSubmission IncomingRecomputation // urlValues := r.URL.Query() 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) } if err := json.Unmarshal(body, &recompSubmission); err != nil { code = 422 // unprocessable entity output = []byte("Unprocessable JSON") return code, h, output, err } now := time.Now() recomputation := MongoInterface{ ID: mongo.NewUUID(), RequesterName: tenantDbConfig.User, RequesterEmail: tenantDbConfig.Email, StartTime: recompSubmission.StartTime, EndTime: recompSubmission.EndTime, Reason: recompSubmission.Reason, Report: recompSubmission.Report, Exclude: recompSubmission.Exclude, Timestamp: now.Format("2006-01-02 15:04:05"), Status: "pending", } err = mongo.Insert(session, tenantDbConfig.Db, recomputationsColl, recomputation) if err != nil { panic(err) } output, err = createSubmitView(recomputation, contentType, r) return code, h, output, err }
//Create a new metric profile func Create(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 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 } session, err := mongo.OpenSession(tenantDbConfig) defer mongo.CloseSession(session) if err != nil { code = http.StatusInternalServerError return code, h, output, err } incoming := OpsProfile{} // Try ingest request body 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 } // 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 } // Generate new id incoming.ID = mongo.NewUUID() err = mongo.Insert(session, tenantDbConfig.Db, "operations_profiles", incoming) if err != nil { panic(err) } // Create view of the results output, err = createRefView(incoming, "Operations Profile successfully created", 201, r) //Render the results into JSON code = 201 return code, h, output, err }
// Create function is used to implement the create report request. // The request is an http POST request with the report description // provided as json structure in the request body func Create(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusCreated 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) //Reading the json input from the request body reqBody, err := ioutil.ReadAll(io.LimitReader(r.Body, cfg.Server.ReqSizeLimit)) if err != nil { return code, h, output, err } input := MongoInterface{} //Unmarshalling the json input into byte form err = json.Unmarshal(reqBody, &input) // Check if json body is malformed if err != nil { 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 } // 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 } // Prepare structure for storing query results results := []MongoInterface{} // Check if report with the same name exists in datastore query := searchName(input.Info.Name) err = mongo.Find(session, tenantDbConfig.Db, reportsColl, query, "name", &results) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // If results are returned for the specific name // then we already have an existing report and we must // abort creation notifing the user if len(results) > 0 { // Name was found so print the error message in xml out := respond.ResponseMessage{ Status: respond.StatusResponse{ Message: "Report with the same name already exists", Code: strconv.Itoa(http.StatusConflict), }} output, _ = respond.MarshalContent(out, contentType, "", " ") code = http.StatusConflict h.Set("Content-Type", fmt.Sprintf("%s; charset=%s", contentType, charset)) return code, h, output, err } input.Info.Created = time.Now().Format("2006-01-02 15:04:05") input.Info.Updated = input.Info.Created input.ID = mongo.NewUUID() // If no report exists with this name create a new one err = mongo.Insert(session, tenantDbConfig.Db, reportsColl, input) if err != nil { code = http.StatusInternalServerError return code, h, output, err } // Notify user that the report has been created. In xml style selfLink := "https://" + r.Host + r.URL.Path + "/" + input.ID output, err = SubmitSuccesful(input, contentType, selfLink) 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 }
// SubmitRecomputation insert a new pending recomputation in the tenants database func SubmitRecomputation(r *http.Request, cfg config.Config) (int, http.Header, []byte, error) { //STANDARD DECLARATIONS START code := http.StatusAccepted 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) session, err := mongo.OpenSession(tenantDbConfig) if err != nil { code = http.StatusInternalServerError return code, h, output, err } var recompSubmission IncomingRecomputation // urlValues := r.URL.Query() 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) } if err := json.Unmarshal(body, &recompSubmission); err != nil { code = 422 // unprocessable entity output = []byte("Unprocessable JSON") return code, h, output, err } now := time.Now() recomputation := MongoInterface{ ID: mongo.NewUUID(), RequesterName: tenantDbConfig.User, RequesterEmail: tenantDbConfig.Email, StartTime: recompSubmission.StartTime, EndTime: recompSubmission.EndTime, Reason: recompSubmission.Reason, Report: recompSubmission.Report, Exclude: recompSubmission.Exclude, Timestamp: now.Format("2006-01-02 15:04:05"), Status: "pending", } err = mongo.Insert(session, tenantDbConfig.Db, recomputationsColl, recomputation) if err != nil { panic(err) } output, err = createSubmitView(recomputation, contentType, r) return code, h, output, err }