forked from convox/rack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsystem.go
More file actions
134 lines (108 loc) · 2.78 KB
/
system.go
File metadata and controls
134 lines (108 loc) · 2.78 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
124
125
126
127
128
129
130
131
132
133
134
package controllers
import (
"net/http"
"os"
"sort"
"strconv"
"time"
"golang.org/x/net/websocket"
"github.com/convox/rack/api/httperr"
"github.com/convox/rack/api/models"
"github.com/convox/rack/api/structs"
"github.com/convox/rack/provider"
)
func SystemShow(rw http.ResponseWriter, r *http.Request) *httperr.Error {
rack, err := models.Provider().SystemGet()
if err != nil {
return httperr.Server(err)
}
return RenderJson(rw, rack)
}
func SystemProcesses(rw http.ResponseWriter, r *http.Request) *httperr.Error {
all := r.URL.Query().Get("all")
ps, err := models.Provider().SystemProcesses(structs.SystemProcessesOptions{
All: (all == "true"),
})
if provider.ErrorNotFound(err) {
return httperr.NotFound(err)
}
if err != nil {
return httperr.Server(err)
}
sort.Sort(ps)
return RenderJson(rw, ps)
}
func SystemUpdate(rw http.ResponseWriter, r *http.Request) *httperr.Error {
rack, err := models.Provider().SystemGet()
if err != nil {
return httperr.Server(err)
}
// update based on form input
if cc := GetForm(r, "count"); cc != "" {
c, err := strconv.Atoi(cc)
if err != nil {
return httperr.Errorf(403, "count must be numeric")
}
switch {
case os.Getenv("AUTOSCALE") == "true":
return httperr.Errorf(403, "scaling count prohibited when autoscale enabled")
case c == -1:
// -1 indicates no change
case c <= 2:
return httperr.Errorf(403, "count must be greater than 2")
default:
rack.Count = c
}
}
if t := GetForm(r, "type"); t != "" {
rack.Type = t
}
if v := GetForm(r, "version"); v != "" {
rack.Version = v
}
err = models.Provider().SystemSave(*rack)
if err != nil {
return httperr.Server(err)
}
return RenderJson(rw, rack)
}
func SystemCapacity(rw http.ResponseWriter, r *http.Request) *httperr.Error {
capacity, err := models.Provider().CapacityGet()
if err != nil {
return httperr.Server(err)
}
return RenderJson(rw, capacity)
}
// SystemLogs returns the logs for the Rack
func SystemLogs(ws *websocket.Conn) *httperr.Error {
header := ws.Request().Header
var err error
follow := true
if header.Get("Follow") == "false" {
follow = false
}
since := 2 * time.Minute
if s := header.Get("Since"); s != "" {
since, err = time.ParseDuration(s)
if err != nil {
return httperr.Errorf(403, "Invalid duration %s", s)
}
}
err = models.Provider().SystemLogs(ws, structs.LogStreamOptions{
Filter: header.Get("Filter"),
Follow: follow,
Since: time.Now().Add(-1 * since),
})
if err != nil {
return httperr.Server(err)
}
return nil
}
// SystemReleases lists the latest releases of the rack
func SystemReleases(rw http.ResponseWriter, r *http.Request) *httperr.Error {
releases, err := models.Provider().SystemReleases()
if err != nil {
return httperr.Server(err)
}
return RenderJson(rw, releases)
}