package host import ( "fmt" "io" "net/http" "github.com/gin-contrib/requestid" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "edge-infra.dev/pkg/sds/interlock/topic" ) var ( ErrNoRequestID = fmt.Errorf("no request id") ) type KpowerState struct { Status PowerStatus `json:"status"` Op Operation `json:"operation"` Timestamp string `json:"timestamp"` } type Operation struct { OpType OperationType `json:"type"` Opts Options `json:"options"` RequestID string `json:"requestID"` } type Options struct { NoCordonOrDrain bool `json:"noCordonOrDrain"` } type PowerStatus string const ( UNKNOWN PowerStatus = "UNKNOWN" RUNNING PowerStatus = "RUNNING" CORDONED PowerStatus = "CORDONED" DRAINED PowerStatus = "DRAINED" TERMINATED PowerStatus = "TERMINATED" ) type OperationType string const ( REBOOT OperationType = "REBOOT" SHUTDOWN OperationType = "SHUTDOWN" ) func (h *Host) KpowerPost(c *gin.Context) { err := h.topic.UpdateState( func(state interface{}) error { hostState := state.(*State) if hostState.Kpower.Op.RequestID != "" { c.String(http.StatusConflict, "%s\n", "conflict with existing operation") return nil } var payload postKpowerPayload err := c.ShouldBindWith(&payload, binding.JSON) if err == io.EOF { c.String(http.StatusBadRequest, "%s: %s\n", "missing request body", err.Error()) return nil } if err != nil { c.String(http.StatusBadRequest, "%s: %s\n", "error binding request body", err.Error()) return nil } payload.RequestID = requestid.Get(c) payload.updateState(hostState) c.JSON(http.StatusAccepted, state) return nil }, ) if err != nil { topic.HandleBindingError(c, err) return } } func (h *Host) KpowerPut(c *gin.Context) { err := h.topic.UpdateState( func(state interface{}) error { var payload putKpowerPayload if err := c.ShouldBindWith(&payload, binding.JSON); err != nil { return err } hostState := state.(*State) payload.updateState(hostState) c.JSON(http.StatusAccepted, state) return nil }, ) if err != nil { topic.HandleBindingError(c, err) return } }