forked from cloud-gov/buildpack-notify
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cf.go
172 lines (156 loc) · 4.39 KB
/
cf.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
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/url"
"github.com/cloudfoundry-community/go-cfclient"
"github.com/pkg/errors"
)
// App represents the V3 API JSON object of an app
// http://v3-apidocs.cloudfoundry.org/version/3.34.0/index.html#the-app-object
type App struct {
GUID string `json:"guid"`
Name string `json:"name"`
State string `json:"state"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
Lifecycle struct {
Type string `json:"type"`
Data struct {
Buildpacks []string `json:"buildpacks,omitempty"`
Stack string `json:"stack,omitempty"`
} `json:"data,omitempty"`
} `json:"lifecycle"`
}
// AppResponse represents the V3 API JSON Response when querying for apps.
type AppResponse struct {
Pagination struct {
TotalResults int `json:"total_results"`
TotalPages int `json:"total_pages"`
First struct {
Href string `json:"href"`
} `json:"first"`
Last struct {
Href string `json:"href"`
} `json:"last"`
Next struct {
Href string `json:"href,omitempty"`
} `json:"next,omitempty"`
Previous struct {
Href string `json:"href,omitempty"`
} `json:"previous,omitempty"`
} `json:"pagination"`
Apps []App `json:"resources"`
}
// Droplet represents the V3 API JSON object of a droplet
// http://v3-apidocs.cloudfoundry.org/version/3.34.0/index.html#the-app-object
type Droplet struct {
GUID string `json:"guid"`
State string `json:"state"`
Error string `json:"error"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
Buildpacks []struct {
Name string `json:"name"`
DetectOutput string `json:"detect_output"`
} `json:"buildpacks,omitempty"`
}
// DropletResponse represents the V3 API JSON Response when querying for droplets.
type DropletResponse struct {
Pagination struct {
TotalResults int `json:"total_results"`
TotalPages int `json:"total_pages"`
First struct {
Href string `json:"href"`
} `json:"first"`
Last struct {
Href string `json:"href"`
} `json:"last"`
Next struct {
Href string `json:"href,omitempty"`
} `json:"next,omitempty"`
Previous struct {
Href string `json:"href,omitempty"`
} `json:"previous,omitempty"`
} `json:"pagination"`
Droplets []Droplet `json:"resources"`
}
// ListApps will query for all V3 App objects
// http://v3-apidocs.cloudfoundry.org/version/3.34.0/index.html#list-apps
func ListApps(c *cfclient.Client) ([]App, error) {
apps := []App{}
requestURL := "/v3/apps"
for {
var appResp AppResponse
r := c.NewRequest("GET", requestURL)
resp, err := c.DoRequest(r)
if err != nil {
return nil, errors.Wrap(err, "Error requesting apps")
}
defer resp.Body.Close()
resBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, errors.Wrap(err, "Error reading app response")
}
err = json.Unmarshal(resBody, &appResp)
if err != nil {
return nil, errors.Wrap(err, "Error unmarshalling app")
}
for _, app := range appResp.Apps {
apps = append(apps, app)
}
requestHref := appResp.Pagination.Next.Href
if requestHref == "" {
break
}
u, err := url.Parse(requestHref)
if err != nil {
break
}
requestURL = u.RequestURI()
if requestURL == "" {
break
}
}
return apps, nil
}
// GetDropletsByQuery will query for droplets using the passed in query parameters
// http://v3-apidocs.cloudfoundry.org/version/3.34.0/index.html#list-droplets
func (a *App) GetDropletsByQuery(c *cfclient.Client, query url.Values) ([]Droplet, error) {
var droplets []Droplet
requestURL := fmt.Sprintf("/v3/apps/%s/droplets?%s", a.GUID, query.Encode())
for {
var dropletResp DropletResponse
r := c.NewRequest("GET", requestURL)
resp, err := c.DoRequest(r)
if err != nil {
return nil, errors.Wrap(err, "Error requesting droplets")
}
defer resp.Body.Close()
resBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, errors.Wrap(err, "Error reading droplet response")
}
err = json.Unmarshal(resBody, &dropletResp)
if err != nil {
return nil, errors.Wrap(err, "Error unmarshalling droplets")
}
for _, droplet := range dropletResp.Droplets {
droplets = append(droplets, droplet)
}
requestHref := dropletResp.Pagination.Next.Href
if requestHref == "" {
break
}
u, err := url.Parse(requestHref)
if err != nil {
break
}
requestURL = u.RequestURI()
if requestURL == "" {
break
}
}
return droplets, nil
}