github.com/sacloud/libsacloud/v2@v2.32.3/helper/service/database/builder.go (about) 1 // Copyright 2016-2022 The Libsacloud Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package database 16 17 import ( 18 "context" 19 "fmt" 20 "strconv" 21 "strings" 22 23 databaseBuilder "github.com/sacloud/libsacloud/v2/helper/builder/database" 24 "github.com/sacloud/libsacloud/v2/sacloud" 25 "github.com/sacloud/libsacloud/v2/sacloud/types" 26 ) 27 28 // Builder helper/builder/databaseの移行までの暫定実装 29 // 30 // 移行するまではhelper/builder/databaseを呼び出す処理のみ行う 31 type Builder struct { 32 ID types.ID `request:"-"` 33 Zone string `request:"-"` 34 35 Name string `validate:"required"` 36 Description string `validate:"min=0,max=512"` 37 Tags types.Tags 38 IconID types.ID 39 PlanID types.ID `validate:"required"` 40 SwitchID types.ID `validate:"required"` 41 IPAddresses []string `validate:"required,min=1,max=2,dive,ipv4"` 42 NetworkMaskLen int `validate:"required,min=1,max=32"` 43 DefaultRoute string `validate:"omitempty,ipv4"` 44 Port int `validate:"omitempty,min=1,max=65535"` 45 SourceNetwork []string `validate:"omitempty,dive,cidrv4"` 46 DatabaseType string `validate:"required,oneof=mariadb postgres"` 47 Username string `validate:"required"` 48 Password string `validate:"required"` 49 EnableReplication bool 50 ReplicaUserPassword string `validate:"required_with=EnableReplication"` 51 EnableWebUI bool 52 EnableBackup bool 53 BackupWeekdays []types.EBackupSpanWeekday `validate:"required_with=EnableBackup,max=7"` 54 BackupStartTimeHour int `validate:"omitempty,min=0,max=23"` 55 BackupStartTimeMinute int `validate:"omitempty,oneof=0 15 30 45"` 56 Parameters map[string]interface{} 57 58 NoWait bool 59 60 Caller sacloud.APICaller `request:"-"` 61 } 62 63 func BuilderFromResource(ctx context.Context, caller sacloud.APICaller, zone string, id types.ID) (*Builder, error) { 64 client := sacloud.NewDatabaseOp(caller) 65 current, err := client.Read(ctx, zone, id) 66 if err != nil { 67 return nil, err 68 } 69 var bkHour, bkMinute int 70 var bkWeekdays []types.EBackupSpanWeekday 71 if current.BackupSetting != nil { 72 bkWeekdays = current.BackupSetting.DayOfWeek 73 if current.BackupSetting.Time != "" { 74 timeStrings := strings.Split(current.BackupSetting.Time, ":") 75 if len(timeStrings) == 2 { 76 hour, err := strconv.ParseInt(timeStrings[0], 10, 64) 77 if err != nil { 78 return nil, err 79 } 80 bkHour = int(hour) 81 82 minute, err := strconv.ParseInt(timeStrings[1], 10, 64) 83 if err != nil { 84 return nil, err 85 } 86 bkMinute = int(minute) 87 } 88 } 89 } 90 parameters, err := client.GetParameter(ctx, zone, id) 91 if err != nil { 92 return nil, err 93 } 94 95 return &Builder{ 96 ID: current.ID, 97 Zone: zone, 98 Name: current.Name, 99 Description: current.Description, 100 Tags: current.Tags, 101 IconID: current.IconID, 102 PlanID: current.PlanID, 103 SwitchID: current.SwitchID, 104 IPAddresses: current.IPAddresses, 105 NetworkMaskLen: current.NetworkMaskLen, 106 DefaultRoute: current.DefaultRoute, 107 Port: current.CommonSetting.ServicePort, 108 SourceNetwork: current.CommonSetting.SourceNetwork, 109 DatabaseType: current.Conf.DatabaseName, 110 Username: current.CommonSetting.DefaultUser, 111 Password: current.CommonSetting.UserPassword, 112 EnableReplication: current.ReplicationSetting != nil, 113 ReplicaUserPassword: current.CommonSetting.ReplicaPassword, 114 EnableWebUI: current.CommonSetting.WebUI.Bool(), 115 EnableBackup: current.BackupSetting != nil, 116 BackupWeekdays: bkWeekdays, 117 BackupStartTimeHour: bkHour, 118 BackupStartTimeMinute: bkMinute, 119 Parameters: parameters.Settings, 120 Caller: caller, 121 }, nil 122 } 123 124 func (b *Builder) actualBuilder() *databaseBuilder.Builder { 125 replicaUser := "" 126 replicaPassword := "" 127 if b.EnableReplication { 128 replicaUser = "replica" 129 replicaPassword = b.ReplicaUserPassword 130 } 131 builder := &databaseBuilder.Builder{ 132 PlanID: b.PlanID, 133 SwitchID: b.SwitchID, 134 IPAddresses: b.IPAddresses, 135 NetworkMaskLen: b.NetworkMaskLen, 136 DefaultRoute: b.DefaultRoute, 137 Conf: &sacloud.DatabaseRemarkDBConfCommon{ 138 DatabaseName: types.RDBMSVersions[types.RDBMSTypeFromString(b.DatabaseType)].Name, 139 DatabaseVersion: types.RDBMSVersions[types.RDBMSTypeFromString(b.DatabaseType)].Version, 140 DatabaseRevision: types.RDBMSVersions[types.RDBMSTypeFromString(b.DatabaseType)].Revision, 141 }, 142 CommonSetting: &sacloud.DatabaseSettingCommon{ 143 WebUI: types.ToWebUI(b.EnableWebUI), 144 ServicePort: b.Port, 145 SourceNetwork: b.SourceNetwork, 146 DefaultUser: b.Username, 147 UserPassword: b.Password, 148 ReplicaUser: replicaUser, 149 ReplicaPassword: replicaPassword, 150 }, 151 Name: b.Name, 152 Description: b.Description, 153 Tags: b.Tags, 154 IconID: b.IconID, 155 Parameters: b.Parameters, 156 NoWait: b.NoWait, 157 Client: databaseBuilder.NewAPIClient(b.Caller), 158 } 159 if b.EnableBackup { 160 builder.BackupSetting = &sacloud.DatabaseSettingBackup{ 161 Time: fmt.Sprintf("%02d:%02d", b.BackupStartTimeHour, b.BackupStartTimeMinute), 162 DayOfWeek: b.BackupWeekdays, 163 } 164 } 165 if b.EnableReplication { 166 builder.ReplicationSetting = &sacloud.DatabaseReplicationSetting{ 167 Model: types.DatabaseReplicationModels.MasterSlave, 168 } 169 } 170 return builder 171 } 172 173 func (b *Builder) Build(ctx context.Context) (*sacloud.Database, error) { 174 if b.ID.IsEmpty() { 175 return b.create(ctx) 176 } 177 return b.update(ctx) 178 } 179 180 func (b *Builder) create(ctx context.Context) (*sacloud.Database, error) { 181 return b.actualBuilder().Build(ctx, b.Zone) 182 } 183 184 func (b *Builder) update(ctx context.Context) (*sacloud.Database, error) { 185 return b.actualBuilder().Update(ctx, b.Zone, b.ID) 186 }