225 lines
6.1 KiB
Go
225 lines
6.1 KiB
Go
|
package api
|
||
|
|
||
|
import (
|
||
|
"encoding/json" // "strings"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/sacloud/libsacloud/sacloud"
|
||
|
)
|
||
|
|
||
|
//HACK: さくらのAPI側仕様: CommonServiceItemsの内容によってJSONフォーマットが異なるため
|
||
|
// DNS/ProxyLB/シンプル監視それぞれでリクエスト/レスポンスデータ型を定義する。
|
||
|
|
||
|
// SearchProxyLBResponse ProxyLB検索レスポンス
|
||
|
type SearchProxyLBResponse struct {
|
||
|
// Total 総件数
|
||
|
Total int `json:",omitempty"`
|
||
|
// From ページング開始位置
|
||
|
From int `json:",omitempty"`
|
||
|
// Count 件数
|
||
|
Count int `json:",omitempty"`
|
||
|
// CommonServiceProxyLBItems ProxyLBリスト
|
||
|
CommonServiceProxyLBItems []sacloud.ProxyLB `json:"CommonServiceItems,omitempty"`
|
||
|
}
|
||
|
|
||
|
type proxyLBRequest struct {
|
||
|
CommonServiceProxyLBItem *sacloud.ProxyLB `json:"CommonServiceItem,omitempty"`
|
||
|
From int `json:",omitempty"`
|
||
|
Count int `json:",omitempty"`
|
||
|
Sort []string `json:",omitempty"`
|
||
|
Filter map[string]interface{} `json:",omitempty"`
|
||
|
Exclude []string `json:",omitempty"`
|
||
|
Include []string `json:",omitempty"`
|
||
|
}
|
||
|
|
||
|
type proxyLBResponse struct {
|
||
|
*sacloud.ResultFlagValue
|
||
|
*sacloud.ProxyLB `json:"CommonServiceItem,omitempty"`
|
||
|
}
|
||
|
|
||
|
// ProxyLBAPI ProxyLB API
|
||
|
type ProxyLBAPI struct {
|
||
|
*baseAPI
|
||
|
}
|
||
|
|
||
|
// NewProxyLBAPI ProxyLB API作成
|
||
|
func NewProxyLBAPI(client *Client) *ProxyLBAPI {
|
||
|
return &ProxyLBAPI{
|
||
|
&baseAPI{
|
||
|
client: client,
|
||
|
FuncGetResourceURL: func() string {
|
||
|
return "commonserviceitem"
|
||
|
},
|
||
|
FuncBaseSearchCondition: func() *sacloud.Request {
|
||
|
res := &sacloud.Request{}
|
||
|
res.AddFilter("Provider.Class", "proxylb")
|
||
|
return res
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Find 検索
|
||
|
func (api *ProxyLBAPI) Find() (*SearchProxyLBResponse, error) {
|
||
|
|
||
|
data, err := api.client.newRequest("GET", api.getResourceURL(), api.getSearchState())
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var res SearchProxyLBResponse
|
||
|
if err := json.Unmarshal(data, &res); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return &res, nil
|
||
|
}
|
||
|
|
||
|
func (api *ProxyLBAPI) request(f func(*proxyLBResponse) error) (*sacloud.ProxyLB, error) {
|
||
|
res := &proxyLBResponse{}
|
||
|
err := f(res)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return res.ProxyLB, nil
|
||
|
}
|
||
|
|
||
|
func (api *ProxyLBAPI) createRequest(value *sacloud.ProxyLB) *proxyLBResponse {
|
||
|
return &proxyLBResponse{ProxyLB: value}
|
||
|
}
|
||
|
|
||
|
// New 新規作成用パラメーター作成
|
||
|
func (api *ProxyLBAPI) New(name string) *sacloud.ProxyLB {
|
||
|
return sacloud.CreateNewProxyLB(name)
|
||
|
}
|
||
|
|
||
|
// Create 新規作成
|
||
|
func (api *ProxyLBAPI) Create(value *sacloud.ProxyLB) (*sacloud.ProxyLB, error) {
|
||
|
return api.request(func(res *proxyLBResponse) error {
|
||
|
return api.create(api.createRequest(value), res)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// Read 読み取り
|
||
|
func (api *ProxyLBAPI) Read(id int64) (*sacloud.ProxyLB, error) {
|
||
|
return api.request(func(res *proxyLBResponse) error {
|
||
|
return api.read(id, nil, res)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// Update 更新
|
||
|
func (api *ProxyLBAPI) Update(id int64, value *sacloud.ProxyLB) (*sacloud.ProxyLB, error) {
|
||
|
return api.request(func(res *proxyLBResponse) error {
|
||
|
return api.update(id, api.createRequest(value), res)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// UpdateSetting 設定更新
|
||
|
func (api *ProxyLBAPI) UpdateSetting(id int64, value *sacloud.ProxyLB) (*sacloud.ProxyLB, error) {
|
||
|
req := &sacloud.ProxyLB{
|
||
|
// Settings
|
||
|
Settings: value.Settings,
|
||
|
}
|
||
|
return api.request(func(res *proxyLBResponse) error {
|
||
|
return api.update(id, api.createRequest(req), res)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// Delete 削除
|
||
|
func (api *ProxyLBAPI) Delete(id int64) (*sacloud.ProxyLB, error) {
|
||
|
return api.request(func(res *proxyLBResponse) error {
|
||
|
return api.delete(id, nil, res)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// ChangePlan プラン変更
|
||
|
func (api *ProxyLBAPI) ChangePlan(id int64, newPlan sacloud.ProxyLBPlan) (*sacloud.ProxyLB, error) {
|
||
|
var (
|
||
|
method = "PUT"
|
||
|
uri = fmt.Sprintf("%s/%d/plan", api.getResourceURL(), id)
|
||
|
)
|
||
|
body := &sacloud.ProxyLB{}
|
||
|
body.SetPlan(newPlan)
|
||
|
realBody := map[string]interface{}{
|
||
|
"CommonServiceItem": map[string]interface{}{
|
||
|
"ServiceClass": body.ServiceClass,
|
||
|
},
|
||
|
}
|
||
|
|
||
|
return api.request(func(res *proxyLBResponse) error {
|
||
|
return api.baseAPI.request(method, uri, realBody, res)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
type proxyLBCertificateResponse struct {
|
||
|
*sacloud.ResultFlagValue
|
||
|
ProxyLB *sacloud.ProxyLBCertificates `json:",omitempty"`
|
||
|
}
|
||
|
|
||
|
// GetCertificates 証明書取得
|
||
|
func (api *ProxyLBAPI) GetCertificates(id int64) (*sacloud.ProxyLBCertificates, error) {
|
||
|
var (
|
||
|
method = "GET"
|
||
|
uri = fmt.Sprintf("%s/%d/proxylb/sslcertificate", api.getResourceURL(), id)
|
||
|
res = &proxyLBCertificateResponse{}
|
||
|
)
|
||
|
err := api.baseAPI.request(method, uri, nil, res)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
if res.ProxyLB == nil {
|
||
|
return nil, nil
|
||
|
}
|
||
|
return res.ProxyLB, nil
|
||
|
}
|
||
|
|
||
|
// SetCertificates 証明書設定
|
||
|
func (api *ProxyLBAPI) SetCertificates(id int64, certs *sacloud.ProxyLBCertificates) (bool, error) {
|
||
|
var (
|
||
|
method = "PUT"
|
||
|
uri = fmt.Sprintf("%s/%d/proxylb/sslcertificate", api.getResourceURL(), id)
|
||
|
res = &proxyLBCertificateResponse{}
|
||
|
)
|
||
|
err := api.baseAPI.request(method, uri, map[string]interface{}{
|
||
|
"ProxyLB": certs,
|
||
|
}, res)
|
||
|
if err != nil {
|
||
|
return false, err
|
||
|
}
|
||
|
return true, nil
|
||
|
}
|
||
|
|
||
|
// DeleteCertificates 証明書削除
|
||
|
func (api *ProxyLBAPI) DeleteCertificates(id int64) (bool, error) {
|
||
|
var (
|
||
|
method = "DELETE"
|
||
|
uri = fmt.Sprintf("%s/%d/proxylb/sslcertificate", api.getResourceURL(), id)
|
||
|
)
|
||
|
return api.baseAPI.modify(method, uri, nil)
|
||
|
}
|
||
|
|
||
|
type proxyLBHealthResponse struct {
|
||
|
*sacloud.ResultFlagValue
|
||
|
ProxyLB *sacloud.ProxyLBStatus `json:",omitempty"`
|
||
|
}
|
||
|
|
||
|
// Health ヘルスチェックステータス取得
|
||
|
func (api *ProxyLBAPI) Health(id int64) (*sacloud.ProxyLBStatus, error) {
|
||
|
var (
|
||
|
method = "GET"
|
||
|
uri = fmt.Sprintf("%s/%d/health", api.getResourceURL(), id)
|
||
|
res = &proxyLBHealthResponse{}
|
||
|
)
|
||
|
err := api.baseAPI.request(method, uri, nil, res)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
if res.ProxyLB == nil {
|
||
|
return nil, nil
|
||
|
}
|
||
|
return res.ProxyLB, nil
|
||
|
}
|
||
|
|
||
|
// Monitor アクティビティーモニター取得
|
||
|
func (api *ProxyLBAPI) Monitor(id int64, body *sacloud.ResourceMonitorRequest) (*sacloud.MonitorValues, error) {
|
||
|
return api.baseAPI.applianceMonitorBy(id, "activity/proxylb", 0, body)
|
||
|
}
|