-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathps.go
More file actions
123 lines (104 loc) · 3.15 KB
/
ps.go
File metadata and controls
123 lines (104 loc) · 3.15 KB
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// Package ps provides methods for managing app processes.
package ps
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"sort"
drycc "github.com/drycc/controller-sdk-go"
"github.com/drycc/controller-sdk-go/api"
"golang.org/x/net/websocket"
)
// List lists an app's processes.
func List(c *drycc.Client, appID string, results int) (api.PodsList, int, error) {
u := fmt.Sprintf("/v2/apps/%s/pods/", appID)
body, count, reqErr := c.LimitedRequest(u, results)
if reqErr != nil && !drycc.IsErrAPIMismatch(reqErr) {
return []api.Pods{}, -1, reqErr
}
var procs []api.Pods
if err := json.Unmarshal([]byte(body), &procs); err != nil {
return []api.Pods{}, -1, err
}
return procs, count, reqErr
}
// Exec a command in a container.
func Exec(c *drycc.Client, app, pod string, command api.Command) (*websocket.Conn, error) {
scheme := "ws"
if c.ControllerURL.Scheme == "https" {
scheme = "wss"
}
path := fmt.Sprintf("v2/apps/%s/pods/%s/exec/", app, pod)
u := url.URL{Scheme: scheme, Host: c.ControllerURL.Host, Path: path}
config, err := websocket.NewConfig(u.String(), c.ControllerURL.String())
if err != nil {
return nil, err
}
config.Header = http.Header{
"User-Agent": {c.UserAgent},
"Authorization": {"token " + c.Token},
"X-Drycc-Builder-Auth": {c.HooksToken},
}
conn, err := websocket.DialConfig(config)
if err != nil {
return nil, err
}
websocket.JSON.Send(conn, command)
return conn, nil
}
// Scale increases or decreases an app's processes. The processes are specified in the target argument,
// a key-value map, where the key is the process name and the value is the number of replicas
func Scale(c *drycc.Client, appID string, targets map[string]int) error {
u := fmt.Sprintf("/v2/apps/%s/scale/", appID)
body, err := json.Marshal(targets)
if err != nil {
return err
}
res, err := c.Request("POST", u, body)
defer res.Body.Close()
return err
}
// Restart restarts an app's processes. To restart all app processes, pass empty strings for
// procType and name. To restart an specific process, pass an procType by leave name empty.
// To restart a specific instance, pass a procType and a name.
func Restart(c *drycc.Client, appID string, procType string) error {
u := fmt.Sprintf("/v2/apps/%s/pods/", appID)
if procType == "" {
u += "restart/"
} else {
u += procType + "/restart/"
}
res, err := c.Request("POST", u, nil)
defer res.Body.Close()
return err
}
// ByType organizes processes of an app by process type.
func ByType(processes api.PodsList) api.PodTypes {
var pts api.PodTypes
for _, process := range processes {
exists := false
// Is processtype for process already exists, append to it.
for i, pt := range pts {
if pt.Type == process.Type {
exists = true
pts[i].PodsList = append(pts[i].PodsList, process)
break
}
}
// Is processtype for process doesn't exist, create a new one
if !exists {
pts = append(pts, api.PodType{
Type: process.Type,
PodsList: api.PodsList{process},
})
}
}
// Sort the pods alphabetically by name.
for _, pt := range pts {
sort.Sort(pt.PodsList)
}
// Sort ProcessTypes alphabetically by process name
sort.Sort(pts)
return pts
}