// @app.route(api_root + '/events/<entity_id>/<event_uuid>', methods=['POST']) func eventsOnPost(w http.ResponseWriter, r *http.Request) { // get entity structure entity, _, err := entityFromHttpRequest(r) if err != nil { restutil.WriteError(w, err) return } // instantiate event event, err := newEventFromHttpRequest(r) if err != nil { restutil.WriteError(w, err) return } eventUUID := mux.Vars(r)["event_uuid"] if eventUUID != event.ID() { err := fmt.Errorf("uuid mismatch: %s vs %s", eventUUID, event.ID()) restutil.WriteError(w, err) return } // send event to orchestrator main go sendEventToMain(entity, event) // return empty json if err = restutil.WriteJSON(w, map[string]interface{}{}); err != nil { restutil.WriteError(w, err) } }
// @app.route(api_root + '/actions/<entity_id>/<action_uuid>', methods=['DELETE']) // // NOTE: DELETE must be idempotent (RFC 7231) func actionsOnDelete(w http.ResponseWriter, r *http.Request) { var err error // get entity structure _, queue, err := entityFromHttpRequest(r) if err != nil { restutil.WriteError(w, err) return } // delete the action actionUUID := mux.Vars(r)["action_uuid"] queue.Delete(actionUUID) // return empty json if err = restutil.WriteJSON(w, map[string]interface{}{}); err != nil { restutil.WriteError(w, err) } }
// @app.route(api_root + '/actions/<entity_id>', methods=['GET']) // // NOTE: an inspector has responsibility to DELETE the action, because GET must be idempotent (RFC 7231) // // NOTE: there should not be any concurrent GETs for an entity_id func actionsOnGet(w http.ResponseWriter, r *http.Request) { var err error // get entity structure _, queue, err := entityFromHttpRequest(r) if err != nil { restutil.WriteError(w, err) return } // NOTE: if NumGoroutine() increases rapidly, something is going wrong. log.Debugf("runtime.NumGoroutine()=%d", runtime.NumGoroutine()) // get action (this can take a while, depending on the exploration policy) action := queue.Peek() if action == nil { restutil.WriteError(w, fmt.Errorf("could not get action")) return } if err = restutil.WriteJSON(w, action.JSONMap()); err != nil { restutil.WriteError(w, err) } }