-
Notifications
You must be signed in to change notification settings - Fork 327
/
client.go
108 lines (98 loc) · 2.92 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// Copyright (C) 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package master
import (
"context"
"io"
"github.com/google/gapid/core/log"
"github.com/google/gapid/test/robot/search"
"github.com/pkg/errors"
)
// Client is a wrapper over a Master object that provides client targeted features.
type Client struct {
// Master is the master this client is talking to.
// This should not be modifed, the results are undefined if you do.
Master Master
shutdown Shutdown
name string
}
// NewClient returns a new master client object that talks to the provided Master.
func NewClient(ctx context.Context, m Master) *Client {
return &Client{
Master: m,
}
}
// Orbit registers a satellite with the master.
// The function will only return when the connection is lost.
func (c *Client) Orbit(ctx context.Context, services ServiceList) (Shutdown, error) {
err := c.Master.Orbit(ctx, services,
func(ctx context.Context, command *Command) error {
switch do := command.Do.(type) {
case *Command_Ping:
return nil
case *Command_Identify:
c.name = do.Identify.Name
log.I(ctx, "Identified as %s", c.name)
return nil
case *Command_Shutdown:
// abort the report stream
c.shutdown = *do.Shutdown
return io.EOF
default:
return log.Err(ctx, nil, "Unknown command type")
}
},
)
if errors.Cause(err) == io.EOF {
err = nil
}
return c.shutdown, err
}
// Shutdown causes a graceful shutdown of the server.
func (c *Client) Shutdown(ctx context.Context, to ...string) error {
_, err := c.Master.Shutdown(ctx, &ShutdownRequest{
Shutdown: &Shutdown{
Now: false,
Restart: false,
},
To: to,
})
return err
}
// Restart causes a graceful shutdown and restart of the server.
func (c *Client) Restart(ctx context.Context, to ...string) error {
_, err := c.Master.Shutdown(ctx, &ShutdownRequest{
Shutdown: &Shutdown{
Now: false,
Restart: true,
},
To: to,
})
return err
}
// Kill causes an immediate shutdown of the server.
func (c *Client) Kill(ctx context.Context, to ...string) error {
_, err := c.Master.Shutdown(ctx, &ShutdownRequest{
Shutdown: &Shutdown{
Now: true,
Restart: false,
},
To: to,
})
return err
}
// Search delivers the set of satellites that match the query to the supplied function.
func (c *Client) Search(ctx context.Context, query *search.Query, handler SatelliteHandler) error {
return c.Master.Search(ctx, query, handler)
}