6
6
"io/ioutil"
7
7
"log"
8
8
"net/http"
9
+ "strconv"
9
10
"time"
10
11
)
11
12
@@ -16,6 +17,7 @@ type ConohaClient struct {
16
17
token string
17
18
tokenExpires time.Time
18
19
accountEndpoint string
20
+ objectStorageEndpoint string
19
21
databaseHostingEndpoint string
20
22
}
21
23
@@ -70,6 +72,8 @@ func NewClient(region string, tenantId string, username string, password string)
70
72
switch service .Type {
71
73
case "account" :
72
74
client .accountEndpoint = service .Endpoints [0 ].PublicURL
75
+ case "object-store" :
76
+ client .objectStorageEndpoint = service .Endpoints [0 ].PublicURL
73
77
case "databasehosting" :
74
78
client .databaseHostingEndpoint = service .Endpoints [0 ].PublicURL
75
79
}
@@ -117,13 +121,13 @@ func tokenRequester(region string, tenantId string, username string, password st
117
121
}
118
122
}
119
123
120
- func (cc * ConohaClient ) get (url string ) ([]byte , error ) {
124
+ func (cc * ConohaClient ) get (url string ) ([]byte , * http. Header , error ) {
121
125
// トークンの有効性を確認
122
126
if cc .tokenExpires .Before (time .Now ().Add (time .Minute )) {
123
127
log .Println ("Renewing token..." )
124
128
tokenResp , err := cc .requestNewToken (& cc .Client )
125
129
if err != nil {
126
- return nil , err
130
+ return nil , nil , err
127
131
}
128
132
cc .token = tokenResp .Access .Token .ID
129
133
cc .tokenExpires = tokenResp .Access .Token .Expires
@@ -133,19 +137,23 @@ func (cc *ConohaClient) get(url string) ([]byte, error) {
133
137
// GETリクエストを飛ばす
134
138
req , err := http .NewRequest ("GET" , url , nil )
135
139
if err != nil {
136
- return nil , err
140
+ return nil , nil , err
137
141
}
138
142
139
143
// ヘッダーにトークンをセットする
140
144
req .Header .Set ("X-Auth-Token" , cc .token )
141
145
resp , err := cc .Do (req )
142
146
if err != nil {
143
- return nil , err
147
+ return nil , nil , err
144
148
}
145
149
defer resp .Body .Close ()
146
150
147
151
// レスポンスボディを返す
148
- return ioutil .ReadAll (resp .Body )
152
+ buf , err := ioutil .ReadAll (resp .Body )
153
+ if err != nil {
154
+ return nil , nil , err
155
+ }
156
+ return buf , & resp .Header , nil
149
157
}
150
158
151
159
// JSON 受け取り用
@@ -160,7 +168,7 @@ type Usage struct {
160
168
// オブジェクトストレージへのリクエスト数を取得
161
169
func (cc * ConohaClient ) ObjectStorageRequests () (map [string ]float64 , error ) {
162
170
// メトリクス取得
163
- resp , err := cc .get (cc .accountEndpoint + "/object-storage/rrd/request" )
171
+ resp , _ , err := cc .get (cc .accountEndpoint + "/object-storage/rrd/request" )
164
172
if err != nil {
165
173
return nil , err
166
174
}
@@ -182,32 +190,41 @@ func (cc *ConohaClient) ObjectStorageRequests() (map[string]float64, error) {
182
190
}
183
191
184
192
// JSON 受け取り用
185
- type ObjectStorageSizeResponse struct {
186
- Size Usage `json:"size"`
193
+ type ObjectStorageResponse []Container
194
+ type Container struct {
195
+ Count int `json:"count"`
196
+ Bytes int `json:"bytes"`
197
+ Name string `json:"name"`
198
+ }
199
+
200
+ type ObjectStorageUsage struct {
201
+ containers []Container
202
+ quota float64
187
203
}
188
204
189
205
// オブジェクトストレージの使用容量を取得
190
- func (cc * ConohaClient ) ObjectStorageUsage () (map [ string ] float64 , error ) {
206
+ func (cc * ConohaClient ) ObjectStorageUsage () (* ObjectStorageUsage , error ) {
191
207
// メトリクス取得
192
- resp , err := cc .get (cc .accountEndpoint + "/object-storage/rrd/size " )
208
+ resp , headers , err := cc .get (cc .objectStorageEndpoint + "?format=json " )
193
209
if err != nil {
194
210
return nil , err
195
211
}
196
212
197
213
// JSONを読む
198
- var uResp ObjectStorageSizeResponse
214
+ var uResp ObjectStorageResponse
199
215
if err := json .Unmarshal (resp , & uResp ); err != nil {
200
216
return nil , err
201
217
}
202
218
203
- // データ整形
204
- data := uResp .Size .Data [len (uResp .Size .Data )- 3 ]
205
- usage := make (map [string ]float64 )
206
- for i , label := range uResp .Size .Schema {
207
- usage [label ] = data [i ]
219
+ quota , err := strconv .ParseFloat (headers .Get ("X-Account-Meta-Quota-Bytes" ), 64 )
220
+ if err != nil {
221
+ return nil , err
208
222
}
209
223
210
- return usage , nil
224
+ return & ObjectStorageUsage {
225
+ containers : uResp ,
226
+ quota : quota ,
227
+ }, nil
211
228
}
212
229
213
230
// JSON 受け取り用
@@ -231,7 +248,7 @@ type Database struct {
231
248
232
249
// データベース一覧取得
233
250
func (cc * ConohaClient ) Databases () ([]* Database , error ) {
234
- resp , err := cc .get (cc .databaseHostingEndpoint + "/databases" )
251
+ resp , _ , err := cc .get (cc .databaseHostingEndpoint + "/databases" )
235
252
if err != nil {
236
253
return nil , err
237
254
}
@@ -263,7 +280,7 @@ type Quota struct {
263
280
264
281
// データベース上限値取得(GB単位)
265
282
func (cc * ConohaClient ) DatabaseQuota (serviceID string ) (* Quota , error ) {
266
- resp , err := cc .get (cc .databaseHostingEndpoint + "/services/" + serviceID + "/quotas" )
283
+ resp , _ , err := cc .get (cc .databaseHostingEndpoint + "/services/" + serviceID + "/quotas" )
267
284
if err != nil {
268
285
return nil , err
269
286
}
@@ -284,7 +301,7 @@ type DatabaseInfoResponse struct {
284
301
285
302
// データベース情報取得(GB単位)
286
303
func (cc * ConohaClient ) DatabaseInfo (databaseID string ) (* Database , error ) {
287
- resp , err := cc .get (cc .databaseHostingEndpoint + "/databases/" + databaseID )
304
+ resp , _ , err := cc .get (cc .databaseHostingEndpoint + "/databases/" + databaseID )
288
305
if err != nil {
289
306
return nil , err
290
307
}
0 commit comments