HTTP API: Implement setting state of a worker
authorMaciej Wereski <m.wereski@partner.samsung.com>
Tue, 17 Oct 2017 09:43:13 +0000 (11:43 +0200)
committerMaciej Wereski <m.wereski@partner.samsung.com>
Tue, 5 Jun 2018 10:48:28 +0000 (12:48 +0200)
Change-Id: Ib413efb68b1c6c63ae07d878ee6929cdb4049948
Signed-off-by: Maciej Wereski <m.wereski@partner.samsung.com>
server/api/v1/api.go
server/api/v1/handlers.go
server/api/v1/handlers_test.go
server/api/v1/testdata/worker-set-state-POST.json [deleted file]
server/api/v1/testdata/worker-set-state-bad-uuid-POST.json [new file with mode: 0644]
server/api/v1/testdata/worker-set-state-malformed-json-POST.json [new file with mode: 0644]
server/api/v1/testdata/worker-set-state-missing-POST.json [new file with mode: 0644]
server/api/v1/testdata/worker-set-state-valid-POST.json [new file with mode: 0644]

index ae770f2..e672d81 100644 (file)
@@ -53,6 +53,11 @@ type AccessInfo2 struct {
        Username string
 }
 
+// workerStatePack is used as input for JSON (un)marshaller.
+type workerStatePack struct {
+       WorkerState
+}
+
 // reqHandler denotes function that parses HTTP request and returns responseData.
 type reqHandler func(*http.Request, map[string]string) responseData
 
index ac6d4aa..c1fdf5d 100644 (file)
@@ -192,7 +192,19 @@ func (api *API) getWorkerInfoHandler(r *http.Request, ps map[string]string) resp
 // setWorkerStateHandler parses HTTP workers for setting worker state and calls
 // workers.SetState().
 func (api *API) setWorkerStateHandler(r *http.Request, ps map[string]string) responseData {
-       return newServerError(ErrNotImplemented, "set worker state")
+       var state workerStatePack
+       defer r.Body.Close()
+
+       if !isValidUUID(ps["id"]) {
+               return newServerError(ErrBadUUID)
+       }
+
+       if err := json.NewDecoder(r.Body).Decode(&state); err != nil {
+               return newServerError(err)
+       }
+
+       return newServerError(api.workers.SetState(WorkerUUID(ps["id"]),
+               state.WorkerState))
 }
 
 // setWorkerGroupsHandler parses HTTP workers for setting worker groups and calls
index a41f42b..01e3cb4 100644 (file)
@@ -465,15 +465,37 @@ func TestSetWorkerStateHandler(t *testing.T) {
        assert, m, api := initTest(t)
        defer m.finish()
 
+       prefix := "worker-set-state-"
+       path := "/api/v1/workers/%s/setstate"
+       methods := []string{http.MethodPost}
+
+       notFoundTest := testFromTempl(notFoundTestTempl, prefix, fmt.Sprintf(path, missingUUID), methods...)
+       notFoundTest.json = string(jsonMustMarshal(workerStatePack{IDLE}))
+       malformedJSONTest := testFromTempl(malformedJSONTestTempl, prefix, fmt.Sprintf(path, validUUID), methods...)
+       missingErr := NotFoundError("Worker")
+
+       m.wm.EXPECT().SetState(WorkerUUID(validUUID), IDLE).Return(nil)
+       m.wm.EXPECT().SetState(WorkerUUID(missingUUID), IDLE).Return(missingErr)
+
        tests := []requestTest{
                {
-                       name:        "worker-set-state",
-                       path:        "/api/v1/workers/8/setstate",
-                       methods:     []string{http.MethodPost},
-                       json:        ``,
+                       name:        prefix + "valid",
+                       path:        fmt.Sprintf(path, validUUID),
+                       methods:     methods,
+                       json:        string(jsonMustMarshal(workerStatePack{IDLE})),
                        contentType: contentTypeJSON,
-                       status:      http.StatusNotImplemented,
+                       status:      http.StatusNoContent,
                },
+               {
+                       name:        prefix + "bad-uuid",
+                       path:        fmt.Sprintf(path, invalidID),
+                       methods:     methods,
+                       json:        string(jsonMustMarshal(workerStatePack{IDLE})),
+                       contentType: contentTypeJSON,
+                       status:      http.StatusBadRequest,
+               },
+               notFoundTest,
+               malformedJSONTest,
        }
 
        runTests(assert, api, tests)
diff --git a/server/api/v1/testdata/worker-set-state-POST.json b/server/api/v1/testdata/worker-set-state-POST.json
deleted file mode 100644 (file)
index 8cede3a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"error":"not implemented yet: set worker state"}
\ No newline at end of file
diff --git a/server/api/v1/testdata/worker-set-state-bad-uuid-POST.json b/server/api/v1/testdata/worker-set-state-bad-uuid-POST.json
new file mode 100644 (file)
index 0000000..4145754
--- /dev/null
@@ -0,0 +1 @@
+{"error":"invalid request: ID provided in URL isn't valid UUID"}
\ No newline at end of file
diff --git a/server/api/v1/testdata/worker-set-state-malformed-json-POST.json b/server/api/v1/testdata/worker-set-state-malformed-json-POST.json
new file mode 100644 (file)
index 0000000..c59dde1
--- /dev/null
@@ -0,0 +1 @@
+{"error":"invalid request: unexpected EOF"}
\ No newline at end of file
diff --git a/server/api/v1/testdata/worker-set-state-missing-POST.json b/server/api/v1/testdata/worker-set-state-missing-POST.json
new file mode 100644 (file)
index 0000000..533be90
--- /dev/null
@@ -0,0 +1 @@
+{"error":"Worker not found"}
\ No newline at end of file
diff --git a/server/api/v1/testdata/worker-set-state-valid-POST.json b/server/api/v1/testdata/worker-set-state-valid-POST.json
new file mode 100644 (file)
index 0000000..e69de29