lego/vendor/github.com/sacloud/libsacloud/sacloud/database.go
2018-06-21 21:24:45 +02:00

435 lines
12 KiB
Go

package sacloud
import (
"encoding/json"
"strings"
)
// Database データベース(appliance)
type Database struct {
*Appliance // アプライアンス共通属性
Remark *DatabaseRemark `json:",omitempty"` // リマーク
Settings *DatabaseSettings `json:",omitempty"` // データベース設定
}
// DatabaseRemark データベースリマーク
type DatabaseRemark struct {
*ApplianceRemarkBase
propPlanID // プランID
DBConf *DatabaseCommonRemarks // コンフィグ
Network *DatabaseRemarkNetwork // ネットワーク
SourceAppliance *Resource // クローン元DB
Zone struct { // ゾーン
ID json.Number `json:",omitempty"` // ゾーンID
}
}
// DatabaseRemarkNetwork ネットワーク
type DatabaseRemarkNetwork struct {
NetworkMaskLen int `json:",omitempty"` // ネットワークマスク長
DefaultRoute string `json:",omitempty"` // デフォルトルート
}
// UnmarshalJSON JSONアンマーシャル(配列、オブジェクトが混在するためここで対応)
func (s *DatabaseRemarkNetwork) UnmarshalJSON(data []byte) error {
targetData := strings.Replace(strings.Replace(string(data), " ", "", -1), "\n", "", -1)
if targetData == `[]` {
return nil
}
tmp := &struct {
// NetworkMaskLen
NetworkMaskLen int `json:",omitempty"`
// DefaultRoute
DefaultRoute string `json:",omitempty"`
}{}
if err := json.Unmarshal(data, &tmp); err != nil {
return err
}
s.NetworkMaskLen = tmp.NetworkMaskLen
s.DefaultRoute = tmp.DefaultRoute
return nil
}
// DatabaseCommonRemarks リマークリスト
type DatabaseCommonRemarks struct {
Common *DatabaseCommonRemark // Common
}
// DatabaseCommonRemark リマーク
type DatabaseCommonRemark struct {
DatabaseName string `json:",omitempty"` // 名称
DatabaseRevision string `json:",omitempty"` // リビジョン
DatabaseTitle string `json:",omitempty"` // タイトル
DatabaseVersion string `json:",omitempty"` // バージョン
ReplicaPassword string `json:",omitempty"` // レプリケーションパスワード
ReplicaUser string `json:",omitempty"` // レプリケーションユーザー
}
// DatabaseSettings データベース設定リスト
type DatabaseSettings struct {
DBConf *DatabaseSetting `json:",omitempty"` // コンフィグ
}
// DatabaseSetting データベース設定
type DatabaseSetting struct {
Backup *DatabaseBackupSetting `json:",omitempty"` // バックアップ設定
Common *DatabaseCommonSetting `json:",oitempty"` // 共通設定
}
// DatabaseServer データベースサーバー情報
type DatabaseServer struct {
IPAddress string `json:",omitempty"` // IPアドレス
Port string `json:",omitempty"` // ポート
Enabled string `json:",omitempty"` // 有効/無効
Status string `json:",omitempty"` // ステータス
ActiveConn string `json:",omitempty"` // アクティブコネクション
}
// DatabasePlan プラン
type DatabasePlan int
var (
// DatabasePlanMini ミニプラン(後方互換用)
DatabasePlanMini = DatabasePlan(10)
// DatabasePlan10G 10Gプラン
DatabasePlan10G = DatabasePlan(10)
// DatabasePlan30G 30Gプラン
DatabasePlan30G = DatabasePlan(30)
// DatabasePlan90G 90Gプラン
DatabasePlan90G = DatabasePlan(90)
// DatabasePlan240G 240Gプラン
DatabasePlan240G = DatabasePlan(240)
// DatabasePlan500G 500Gプラン
DatabasePlan500G = DatabasePlan(500)
// DatabasePlan1T 1Tプラン
DatabasePlan1T = DatabasePlan(1000)
)
// AllowDatabasePlans 指定可能なデータベースプラン
func AllowDatabasePlans() []int {
return []int{
int(DatabasePlan10G),
int(DatabasePlan30G),
int(DatabasePlan90G),
int(DatabasePlan240G),
int(DatabasePlan500G),
int(DatabasePlan1T),
}
}
// DatabaseBackupSetting バックアップ設定
type DatabaseBackupSetting struct {
Rotate int `json:",omitempty"` // ローテーション世代数
Time string `json:",omitempty"` // 開始時刻
}
// DatabaseCommonSetting 共通設定
type DatabaseCommonSetting struct {
DefaultUser string `json:",omitempty"` // ユーザー名
UserPassword string `json:",omitempty"` // ユーザーパスワード
WebUI interface{} `json:",omitempty"` // WebUIのIPアドレス or FQDN
ServicePort string // ポート番号
SourceNetwork SourceNetwork // 接続許可ネットワーク
}
// SourceNetwork 接続許可ネットワーク
type SourceNetwork []string
// UnmarshalJSON JSONアンマーシャル(配列と文字列が混在するためここで対応)
func (s *SourceNetwork) UnmarshalJSON(data []byte) error {
// SourceNetworkが未設定の場合、APIレスポンスが""となるため回避する
if string(data) == `""` {
return nil
}
tmp := []string{}
if err := json.Unmarshal(data, &tmp); err != nil {
return err
}
source := SourceNetwork(tmp)
*s = source
return nil
}
// MarshalJSON JSONマーシャル(配列と文字列が混在するためここで対応)
func (s *SourceNetwork) MarshalJSON() ([]byte, error) {
if s == nil {
return []byte(""), nil
}
list := []string(*s)
if len(list) == 0 || (len(list) == 1 && list[0] == "") {
return []byte(`""`), nil
}
return json.Marshal(list)
}
// CreateDatabaseValue データベース作成用パラメータ
type CreateDatabaseValue struct {
Plan DatabasePlan // プラン
AdminPassword string // 管理者パスワード
DefaultUser string // ユーザー名
UserPassword string // パスワード
SourceNetwork []string // 接続許可ネットワーク
ServicePort string // ポート
// BackupRotate int // バックアップ世代数
BackupTime string // バックアップ開始時間
SwitchID string // 接続先スイッチ
IPAddress1 string // IPアドレス1
MaskLen int // ネットワークマスク長
DefaultRoute string // デフォルトルート
Name string // 名称
Description string // 説明
Tags []string // タグ
Icon *Resource // アイコン
WebUI bool // WebUI有効
DatabaseName string // データベース名
DatabaseRevision string // リビジョン
DatabaseTitle string // データベースタイトル
DatabaseVersion string // データベースバージョン
ReplicaUser string // ReplicaUser レプリケーションユーザー
SourceAppliance *Resource // クローン元DB
//ReplicaPassword string // in current API version , setted admin password
}
// NewCreatePostgreSQLDatabaseValue PostgreSQL作成用パラメーター
func NewCreatePostgreSQLDatabaseValue() *CreateDatabaseValue {
return &CreateDatabaseValue{
DatabaseName: "postgres",
DatabaseVersion: "10",
}
}
// NewCreateMariaDBDatabaseValue MariaDB作成用パラメーター
func NewCreateMariaDBDatabaseValue() *CreateDatabaseValue {
return &CreateDatabaseValue{
DatabaseName: "MariaDB",
DatabaseVersion: "10.2",
}
}
// NewCloneDatabaseValue クローンDB作成用パラメータ
func NewCloneDatabaseValue(db *Database) *CreateDatabaseValue {
return &CreateDatabaseValue{
DatabaseName: db.Remark.DBConf.Common.DatabaseName,
DatabaseVersion: db.Remark.DBConf.Common.DatabaseVersion,
SourceAppliance: NewResource(db.ID),
}
}
// CreateNewDatabase データベース作成
func CreateNewDatabase(values *CreateDatabaseValue) *Database {
db := &Database{
// Appliance
Appliance: &Appliance{
// Class
Class: "database",
// Name
propName: propName{Name: values.Name},
// Description
propDescription: propDescription{Description: values.Description},
// TagsType
propTags: propTags{
// Tags
Tags: values.Tags,
},
// Icon
propIcon: propIcon{
&Icon{
// Resource
Resource: values.Icon,
},
},
// Plan
//propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}},
},
// Remark
Remark: &DatabaseRemark{
// ApplianceRemarkBase
ApplianceRemarkBase: &ApplianceRemarkBase{
// Servers
Servers: []interface{}{""},
},
// DBConf
DBConf: &DatabaseCommonRemarks{
// Common
Common: &DatabaseCommonRemark{
// DatabaseName
DatabaseName: values.DatabaseName,
// DatabaseRevision
DatabaseRevision: values.DatabaseRevision,
// DatabaseTitle
DatabaseTitle: values.DatabaseTitle,
// DatabaseVersion
DatabaseVersion: values.DatabaseVersion,
// ReplicaUser
// ReplicaUser: values.ReplicaUser,
// ReplicaPassword
// ReplicaPassword: values.AdminPassword,
},
},
// Plan
propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}},
SourceAppliance: values.SourceAppliance,
},
// Settings
Settings: &DatabaseSettings{
// DBConf
DBConf: &DatabaseSetting{
// Backup
Backup: &DatabaseBackupSetting{
// Rotate
// Rotate: values.BackupRotate,
Rotate: 8,
// Time
Time: values.BackupTime,
},
// Common
Common: &DatabaseCommonSetting{
// DefaultUser
DefaultUser: values.DefaultUser,
// UserPassword
UserPassword: values.UserPassword,
// SourceNetwork
SourceNetwork: SourceNetwork(values.SourceNetwork),
// ServicePort
ServicePort: values.ServicePort,
},
},
},
}
db.Remark.Switch = &ApplianceRemarkSwitch{
// ID
ID: values.SwitchID,
}
db.Remark.Network = &DatabaseRemarkNetwork{
// NetworkMaskLen
NetworkMaskLen: values.MaskLen,
// DefaultRoute
DefaultRoute: values.DefaultRoute,
}
db.Remark.Servers = []interface{}{
map[string]interface{}{"IPAddress": values.IPAddress1},
}
if values.WebUI {
db.Settings.DBConf.Common.WebUI = values.WebUI
}
return db
}
// CloneNewDatabase データベース作成
func CloneNewDatabase(values *CreateDatabaseValue) *Database {
db := &Database{
// Appliance
Appliance: &Appliance{
// Class
Class: "database",
// Name
propName: propName{Name: values.Name},
// Description
propDescription: propDescription{Description: values.Description},
// TagsType
propTags: propTags{
// Tags
Tags: values.Tags,
},
// Icon
propIcon: propIcon{
&Icon{
// Resource
Resource: values.Icon,
},
},
// Plan
//propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}},
},
// Remark
Remark: &DatabaseRemark{
// ApplianceRemarkBase
ApplianceRemarkBase: &ApplianceRemarkBase{
// Servers
Servers: []interface{}{""},
},
// DBConf
DBConf: &DatabaseCommonRemarks{
// Common
Common: &DatabaseCommonRemark{
DatabaseName: values.DatabaseName,
DatabaseVersion: values.DatabaseVersion,
},
},
// Plan
propPlanID: propPlanID{Plan: &Resource{ID: int64(values.Plan)}},
SourceAppliance: values.SourceAppliance,
},
// Settings
Settings: &DatabaseSettings{
// DBConf
DBConf: &DatabaseSetting{
// Backup
Backup: &DatabaseBackupSetting{
// Rotate
// Rotate: values.BackupRotate,
Rotate: 8,
// Time
Time: values.BackupTime,
},
// Common
Common: &DatabaseCommonSetting{
// SourceNetwork
SourceNetwork: SourceNetwork(values.SourceNetwork),
// ServicePort
ServicePort: values.ServicePort,
},
},
},
}
db.Remark.Switch = &ApplianceRemarkSwitch{
// ID
ID: values.SwitchID,
}
db.Remark.Network = &DatabaseRemarkNetwork{
// NetworkMaskLen
NetworkMaskLen: values.MaskLen,
// DefaultRoute
DefaultRoute: values.DefaultRoute,
}
db.Remark.Servers = []interface{}{
map[string]interface{}{"IPAddress": values.IPAddress1},
}
if values.WebUI {
db.Settings.DBConf.Common.WebUI = values.WebUI
}
return db
}
// AddSourceNetwork 接続許可ネットワーク 追加
func (s *Database) AddSourceNetwork(nw string) {
res := []string(s.Settings.DBConf.Common.SourceNetwork)
res = append(res, nw)
s.Settings.DBConf.Common.SourceNetwork = SourceNetwork(res)
}
// DeleteSourceNetwork 接続許可ネットワーク 削除
func (s *Database) DeleteSourceNetwork(nw string) {
res := []string{}
for _, s := range s.Settings.DBConf.Common.SourceNetwork {
if s != nw {
res = append(res, s)
}
}
s.Settings.DBConf.Common.SourceNetwork = SourceNetwork(res)
}