summaryrefslogtreecommitdiff
path: root/http
diff options
context:
space:
mode:
authorMaciej Wereski <m.wereski@partner.samsung.com>2018-06-21 10:26:09 +0200
committerMaciej Wereski <m.wereski@partner.samsung.com>2018-07-10 10:01:25 +0200
commit8e63fdf662befa716daca070a650e1859fbf5b82 (patch)
tree4b0e01496cf3c857ad2cb5d39d2551caccafc98a /http
parent5b13c89c9619fd6f06d73c6dc568346e64242515 (diff)
downloadboruta-8e63fdf662befa716daca070a650e1859fbf5b82.tar.gz
boruta-8e63fdf662befa716daca070a650e1859fbf5b82.tar.bz2
boruta-8e63fdf662befa716daca070a650e1859fbf5b82.zip
HTTP API Client: List and filter workers
Change-Id: I3e3c59c4c7f5a22e97de867daede6587f4673cfc Signed-off-by: Maciej Wereski <m.wereski@partner.samsung.com>
Diffstat (limited to 'http')
-rw-r--r--http/client/client.go16
-rw-r--r--http/client/client_test.go103
2 files changed, 113 insertions, 6 deletions
diff --git a/http/client/client.go b/http/client/client.go
index 9419c83..cbc901e 100644
--- a/http/client/client.go
+++ b/http/client/client.go
@@ -282,7 +282,21 @@ func (client *BorutaClient) ProlongAccess(reqID boruta.ReqID) error {
// lists all workers.
func (client *BorutaClient) ListWorkers(groups boruta.Groups,
caps boruta.Capabilities) ([]boruta.WorkerInfo, error) {
- return nil, util.ErrNotImplemented
+ req, err := json.Marshal(&util.WorkersFilter{
+ Groups: groups,
+ Capabilities: caps,
+ })
+ if err != nil {
+ return nil, err
+ }
+ resp, err := http.Post(client.url+"workers/list", contentType,
+ bytes.NewReader(req))
+ if err != nil {
+ return nil, err
+ }
+ list := new([]boruta.WorkerInfo)
+ err = processResponse(resp, list)
+ return *list, err
}
// GetWorkerInfo queries Boruta server for information about worker with given
diff --git a/http/client/client_test.go b/http/client/client_test.go
index 51d98a0..39dd807 100644
--- a/http/client/client_test.go
+++ b/http/client/client_test.go
@@ -204,6 +204,23 @@ func prepareServer(method string, tests []*testCase) *httptest.Server {
return httptest.NewServer(mux)
}
+// from http/server/api/v1/api_test.go
+func newWorker(uuid string, state WorkerState, groups Groups, caps Capabilities) (w WorkerInfo) {
+ if caps == nil {
+ caps = make(Capabilities)
+ }
+ caps["UUID"] = uuid
+ w = WorkerInfo{
+ WorkerUUID: WorkerUUID(uuid),
+ State: state,
+ Caps: caps,
+ }
+ if len(groups) != 0 {
+ w.Groups = groups
+ }
+ return
+}
+
func TestNewBorutaClient(t *testing.T) {
assert, client := initTest(t, "")
@@ -727,12 +744,88 @@ func TestProlongAccess(t *testing.T) {
}
func TestListWorkers(t *testing.T) {
- assert, client := initTest(t, "")
- assert.NotNil(client)
+ prefix := "filter-workers-"
+ path := "/api/v1/workers/list"
+
+ // based on http/server/api/v1/handlers_test.go
+ armCaps := make(Capabilities)
+ armCaps["architecture"] = "AArch64"
+ riscvCaps := make(Capabilities)
+ riscvCaps["architecture"] = "RISC-V"
+ workers := []WorkerInfo{
+ newWorker("0", IDLE, Groups{"Lędzianie"}, armCaps),
+ newWorker("1", FAIL, Groups{"Malinowy Chruśniak"}, armCaps),
+ newWorker("2", IDLE, Groups{"Malinowy Chruśniak", "Lędzianie"}, riscvCaps),
+ newWorker("3", FAIL, Groups{"Malinowy Chruśniak"}, riscvCaps),
+ }
+ validFilter := util.WorkersFilter{
+ Groups: Groups{"Lędzianie"},
+ Capabilities: map[string]string{"architecture": "AArch64"},
+ }
+ validHeader := make(http.Header)
+ validHeader.Set("Boruta-Worker-Count", "2")
+ allHeader := make(http.Header)
+ allHeader.Set("Boruta-Worker-Count", "4")
+ missingFilter := util.WorkersFilter{
+ Groups: Groups{"Fern Flower"},
+ }
+ missingHeader := make(http.Header)
+ missingHeader.Set("Boruta-Worker-Count", "0")
- list, err := client.ListWorkers(nil, nil)
- assert.Nil(list)
- assert.Equal(util.ErrNotImplemented, err)
+ tests := []*testCase{
+ &testCase{
+ // valid request
+ name: prefix + "valid-filter",
+ path: path,
+ json: string(jsonMustMarshal(validFilter)),
+ contentType: contentJSON,
+ status: http.StatusOK,
+ header: validHeader,
+ },
+ &testCase{
+ // list all
+ name: prefix + "empty-filter",
+ path: path,
+ json: string(jsonMustMarshal(util.WorkersFilter{nil, nil})),
+ contentType: contentJSON,
+ status: http.StatusOK,
+ header: allHeader,
+ },
+ &testCase{
+ // no matches
+ name: prefix + "nomatch",
+ path: path,
+ json: string(jsonMustMarshal(missingFilter)),
+ contentType: contentJSON,
+ status: http.StatusOK,
+ header: missingHeader,
+ },
+ }
+
+ srv := prepareServer(http.MethodPost, tests)
+ defer srv.Close()
+ assert, client := initTest(t, srv.URL)
+
+ // list some
+ list, err := client.ListWorkers(validFilter.Groups, validFilter.Capabilities)
+ assert.Nil(err)
+ assert.Equal(workers[:2], list)
+
+ // list all
+ list, err = client.ListWorkers(nil, nil)
+ assert.Nil(err)
+ assert.Equal(workers, list)
+
+ // no matches
+ list, err = client.ListWorkers(missingFilter.Groups, missingFilter.Capabilities)
+ assert.Nil(err)
+ assert.Empty(list)
+
+ // http.Post failure
+ client.url = "http://nosuchaddress.fail"
+ list, err = client.ListWorkers(nil, nil)
+ assert.Zero(list)
+ assert.NotNil(err)
}
func TestGetWorkerInfo(t *testing.T) {