Switched to using structs rather than maps to hold SDK responses and code is much...
[arvados.git] / services / datamanager / keep / keep.go
1 /* Deals with getting Keep Server blocks from API Server and Keep Servers. */
2
3 package keep
4
5 import (
6         //"git.curoverse.com/arvados.git/sdk/go/keepclient"
7         "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
8         "git.curoverse.com/arvados.git/sdk/go/util"
9         "log"
10 )
11
12 type ServerAddress struct {
13         Host string `json:"service_host"`
14         Port int `json:"service_port"`
15 }
16
17 type ServerContents struct {
18         BlockDigestToSize map[string]int
19 }
20
21 type ReadServers struct {
22         ReadAllServers bool
23         AddressToContents map[ServerAddress]ServerContents
24 }
25
26 type GetKeepServersParams struct {
27         Client arvadosclient.ArvadosClient
28         Limit int
29 }
30
31 type KeepServiceList struct {
32         ItemsAvailable int `json:"items_available"`
33         Items []ServerAddress `json:"items"`
34 }
35
36 // Methods to implement util.SdkListResponse Interface
37 func (k KeepServiceList) NumItemsAvailable() (numAvailable int, err error) {
38         return k.ItemsAvailable, nil
39 }
40
41 func (k KeepServiceList) NumItemsContained() (numContained int, err error) {
42         return len(k.Items), nil
43 }
44
45
46 // TODO(misha): Send Keep requests in parallel
47 func GetKeepServers(params GetKeepServersParams) (results ReadServers) {
48         if &params.Client == nil {
49                 log.Fatalf("params.Client passed to GetKeepServers() should " +
50                         "contain a valid ArvadosClient, but instead it is nil.")
51         }
52
53         sdkParams := arvadosclient.Dict{}
54         if params.Limit > 0 {
55                 sdkParams["limit"] = params.Limit
56         }
57
58         var sdkResponse KeepServiceList
59         err := params.Client.List("keep_services", sdkParams, &sdkResponse)
60         if err != nil {
61                 log.Fatalf("Error requesting keep disks from API server: %v", err)
62         }
63
64         log.Printf("Received keep services list: %v", sdkResponse)
65
66         {
67                 var numReceived, numAvailable int
68                 results.ReadAllServers, numReceived, numAvailable =
69                         util.ContainsAllAvailableItems(sdkResponse)
70
71                 if (!results.ReadAllServers) {
72                         log.Printf("ERROR: Did not receive all keep server addresses.")
73                 }
74                 log.Printf("Received %d of %d available keep server addresses.",
75                         numReceived,
76                         numAvailable)
77         }
78         return
79 }