github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/acceptance/openstack/rds/v3/rds_test.go (about) 1 package v3 2 3 import ( 4 "os" 5 "testing" 6 "time" 7 8 "github.com/opentelekomcloud/gophertelekomcloud/acceptance/clients" 9 "github.com/opentelekomcloud/gophertelekomcloud/acceptance/openstack" 10 networking "github.com/opentelekomcloud/gophertelekomcloud/acceptance/openstack/networking/v1" 11 "github.com/opentelekomcloud/gophertelekomcloud/acceptance/tools" 12 "github.com/opentelekomcloud/gophertelekomcloud/openstack/common/pointerto" 13 "github.com/opentelekomcloud/gophertelekomcloud/openstack/common/tags" 14 "github.com/opentelekomcloud/gophertelekomcloud/openstack/rds/v3/backups" 15 "github.com/opentelekomcloud/gophertelekomcloud/openstack/rds/v3/instances" 16 "github.com/opentelekomcloud/gophertelekomcloud/openstack/rds/v3/logs" 17 "github.com/opentelekomcloud/gophertelekomcloud/openstack/rds/v3/security" 18 th "github.com/opentelekomcloud/gophertelekomcloud/testhelper" 19 ) 20 21 func TestRdsLifecycle(t *testing.T) { 22 if os.Getenv("RUN_RDS_LIFECYCLE") == "" { 23 t.Skip("too slow to run in zuul") 24 } 25 26 client, err := clients.NewRdsV3() 27 th.AssertNoErr(t, err) 28 29 cc, err := clients.CloudAndClient() 30 th.AssertNoErr(t, err) 31 32 t.Log("Creating instance") 33 34 // Create RDSv3 instance 35 rds := CreateRDS(t, client, cc.RegionName) 36 t.Cleanup(func() { DeleteRDS(t, client, rds.Id) }) 37 th.AssertEquals(t, rds.Volume.Size, 100) 38 39 tagList := []tags.ResourceTag{ 40 { 41 Key: "muh", 42 Value: "value-create", 43 }, 44 { 45 Key: "kuh", 46 Value: "value-create", 47 }, 48 } 49 err = tags.Create(client, "instances", rds.Id, tagList).ExtractErr() 50 th.AssertNoErr(t, err) 51 52 t.Log("updateRDS") 53 54 err = updateRDS(t, client, rds.Id) 55 th.AssertNoErr(t, err) 56 57 newRds, err := instances.List(client, instances.ListOpts{ 58 Id: rds.Id, 59 }) 60 th.AssertNoErr(t, err) 61 th.AssertEquals(t, len(newRds.Instances), 1) 62 th.AssertEquals(t, newRds.Instances[0].Volume.Size, 200) 63 th.AssertEquals(t, len(newRds.Instances[0].Tags), 2) 64 th.AssertEquals(t, *newRds.Instances[0].EnableSSL, true) 65 66 collations, err := instances.ListCollations(client) 67 th.AssertNoErr(t, err) 68 tools.PrintResource(t, collations) 69 70 if err := instances.WaitForStateAvailable(client, 600, rds.Id); err != nil { 71 t.Fatalf("Status available wasn't present") 72 } 73 74 rdsName := tools.RandomString("rds-test-", 8) 75 err = instances.UpdateInstanceName(client, instances.UpdateInstanceNameOpts{ 76 InstanceId: rds.Id, 77 Name: rdsName, 78 }) 79 th.AssertNoErr(t, err) 80 81 t.Log("SetSecurityGroup") 82 83 _, err = security.SetSecurityGroup(client, security.SetSecurityGroupOpts{ 84 InstanceId: rds.Id, 85 SecurityGroupId: openstack.DefaultSecurityGroup(t), 86 }) 87 th.AssertNoErr(t, err) 88 89 t.Log("SwitchSsl") 90 91 err = security.SwitchSsl(client, security.SwitchSslOpts{ 92 InstanceId: rds.Id, 93 SslOption: true, 94 }) 95 th.AssertEquals(t, true, err != nil) 96 97 t.Log("UpdatePort") 98 99 port, err := security.UpdatePort(client, security.UpdatePortOpts{ 100 InstanceId: rds.Id, 101 Port: 3306, 102 }) 103 th.AssertNoErr(t, err) 104 err = instances.WaitForJobCompleted(client, 600, *port) 105 th.AssertNoErr(t, err) 106 107 t.Log("Restart") 108 109 restart, err := instances.Restart(client, instances.RestartOpts{InstanceId: rds.Id, Restart: struct{}{}}) 110 th.AssertNoErr(t, err) 111 err = instances.WaitForJobCompleted(client, 600, *restart) 112 th.AssertNoErr(t, err) 113 114 if err := instances.WaitForStateAvailable(client, 600, rds.Id); err != nil { 115 t.Fatalf("Status available wasn't present") 116 } 117 118 t.Log("StopInstance") 119 120 stop, err := instances.StopInstance(client, rds.Id) 121 th.AssertNoErr(t, err) 122 err = instances.WaitForJobCompleted(client, 600, *stop) 123 th.AssertNoErr(t, err) 124 125 time.Sleep(5 * time.Second) 126 127 t.Log("StartupInstance") 128 129 start, err := instances.StartupInstance(client, rds.Id) 130 th.AssertNoErr(t, err) 131 err = instances.WaitForJobCompleted(client, 600, *start) 132 th.AssertNoErr(t, err) 133 134 t.Log("Resize") 135 136 if err := instances.WaitForStateAvailable(client, 600, rds.Id); err != nil { 137 t.Fatalf("Status available wasn't present") 138 } 139 140 resize, err := instances.Resize(client, instances.ResizeOpts{ 141 InstanceId: rds.Id, 142 SpecCode: "rds.pg.c2.large", 143 }) 144 th.AssertNoErr(t, err) 145 err = instances.WaitForJobCompleted(client, 600, *resize) 146 th.AssertNoErr(t, err) 147 148 netClient, err := clients.NewNetworkV1Client() 149 th.AssertNoErr(t, err) 150 151 t.Log("UpdateDataIp") 152 153 // TODO: Randomly assign the new private IP 154 // Fails if new IP is not in the subnet range 155 // Ip can't be queried automatically from RDS therefore test is disabled 156 // ip, err := security.UpdateDataIp(client, security.UpdateDataIpOpts{ 157 // InstanceId: rds.Id, 158 // NewIp: "192.168.30.254", 159 // }) 160 // th.AssertNoErr(t, err) 161 // err = instances.WaitForJobCompleted(client, 600, *ip) 162 // th.AssertNoErr(t, err) 163 164 elasticIP := networking.CreateEip(t, netClient, 100) 165 t.Cleanup(func() { 166 networking.DeleteEip(t, netClient, elasticIP.ID) 167 }) 168 169 t.Log("AttachEip") 170 171 err = instances.AttachEip(client, instances.AttachEipOpts{ 172 InstanceId: rds.Id, 173 PublicIp: elasticIP.PublicAddress, 174 PublicIpId: elasticIP.ID, 175 IsBind: pointerto.Bool(true), 176 }) 177 th.AssertNoErr(t, err) 178 t.Cleanup(func() { 179 err = instances.AttachEip(client, instances.AttachEipOpts{ 180 InstanceId: rds.Id, 181 IsBind: pointerto.Bool(false), 182 }) 183 th.AssertNoErr(t, err) 184 }) 185 186 t.Log("ChangeOpsWindow") 187 188 err = instances.ChangeOpsWindow(client, instances.ChangeOpsWindowOpts{ 189 InstanceId: rds.Id, 190 StartTime: "22:00", 191 EndTime: "02:00", 192 }) 193 th.AssertNoErr(t, err) 194 195 t.Log("SingleToHa") 196 197 time.Sleep(5 * time.Second) 198 199 ha, err := instances.SingleToHa(client, instances.SingleToHaOpts{ 200 InstanceId: rds.Id, 201 AzCodeNewNode: rds.AvailabilityZone, 202 }) 203 th.AssertNoErr(t, err) 204 err = instances.WaitForJobCompleted(client, 600, *ha) 205 th.AssertNoErr(t, err) 206 207 t.Log("ChangeFailoverMode") 208 209 mode, err := instances.ChangeFailoverMode(client, instances.ChangeFailoverModeOpts{ 210 InstanceId: rds.Id, 211 Mode: "sync", 212 }) 213 th.AssertNoErr(t, err) 214 err = instances.WaitForJobCompleted(client, 600, mode.WorkflowId) 215 th.AssertNoErr(t, err) 216 217 t.Log("ChangeFailoverStrategy") 218 219 err = instances.ChangeFailoverStrategy(client, instances.ChangeFailoverStrategyOpts{ 220 InstanceId: rds.Id, 221 RepairStrategy: "availability", 222 }) 223 th.AssertNoErr(t, err) 224 225 // haRds, err := instances.List(client, instances.ListOpts{ 226 // Id: rds.Id, 227 // }) 228 // th.AssertNoErr(t, err) 229 // 230 // az2 := clients.EnvOS.GetEnv("AVAILABILITY_ZONE_2") 231 // if az2 == "" { 232 // az2 = "eu-de-03" 233 // } 234 // TODO: Seems Not Working and Return with Action Forbidden 235 // follower, err := instances.MigrateFollower(client, instances.MigrateFollowerOpts{ 236 // InstanceId: rds.Id, 237 // NodeId: haRds.Instances[0].Nodes[0].Id, 238 // AzCode: az2, 239 // }) 240 // th.AssertNoErr(t, err) 241 // err = instances.WaitForJobCompleted(client, 600, *follower) 242 // th.AssertNoErr(t, err) 243 244 t.Log("StartFailover") 245 246 failover, err := instances.StartFailover(client, rds.Id) 247 th.AssertNoErr(t, err) 248 err = instances.WaitForJobCompleted(client, 600, failover.WorkflowId) 249 th.AssertNoErr(t, err) 250 251 t.Log("backups.Create") 252 253 log, err := logs.ListErrorLog(client, logs.DbErrorlogOpts{ 254 InstanceId: rds.Id, 255 Limit: "1", 256 StartDate: time.Now().AddDate(0, 0, -1).Format("2006-01-02T15:04:05"), 257 EndDate: time.Now().Format("2006-01-02T15:04:05"), 258 }) 259 th.AssertNoErr(t, err) 260 tools.PrintResource(t, log) 261 262 slowLog, err := logs.ListSlowLog(client, logs.DbSlowLogOpts{ 263 InstanceId: rds.Id, 264 Limit: "1", 265 StartDate: time.Now().AddDate(0, 0, -1).Format("2006-01-02T15:04:05"), 266 EndDate: time.Now().Format("2006-01-02T15:04:05"), 267 }) 268 th.AssertNoErr(t, err) 269 tools.PrintResource(t, slowLog) 270 } 271 272 func TestRdsBackupLifecycle(t *testing.T) { 273 if os.Getenv("RUN_RDS_LIFECYCLE") == "" { 274 t.Skip("too slow to run in zuul") 275 } 276 277 client, err := clients.NewRdsV3() 278 th.AssertNoErr(t, err) 279 280 cc, err := clients.CloudAndClient() 281 th.AssertNoErr(t, err) 282 283 t.Log("Creating instance") 284 285 // Create RDSv3 instance 286 rds := CreateRDS(t, client, cc.RegionName) 287 t.Cleanup(func() { DeleteRDS(t, client, rds.Id) }) 288 th.AssertEquals(t, rds.Volume.Size, 100) 289 290 if err := instances.WaitForStateAvailable(client, 600, rds.Id); err != nil { 291 t.Fatalf("Status available wasn't present") 292 } 293 294 backup, err := backups.Create(client, backups.CreateOpts{ 295 InstanceID: rds.Id, 296 Name: tools.RandomString("rds-backup-test-", 5), 297 }) 298 th.AssertNoErr(t, err) 299 t.Log("Backup creation started") 300 301 t.Cleanup(func() { 302 th.AssertNoErr(t, backups.Delete(client, backup.ID)) 303 t.Log("Backup deleted") 304 }) 305 306 err = backups.WaitForBackup(client, rds.Id, backup.ID, backups.StatusCompleted) 307 th.AssertNoErr(t, err) 308 t.Log("Backup creation complete") 309 310 backupList, err := backups.List(client, backups.ListOpts{InstanceID: rds.Id, BackupID: backup.ID}) 311 th.AssertNoErr(t, err) 312 th.AssertEquals(t, 1, len(backupList)) 313 tools.PrintResource(t, backupList[0]) 314 315 times, err := backups.ListRestoreTimes(client, backups.ListRestoreTimesOpts{ 316 InstanceId: rds.Id, 317 }) 318 th.AssertNoErr(t, err) 319 tools.PrintResource(t, times) 320 321 if err := instances.WaitForStateAvailable(client, 600, rds.Id); err != nil { 322 t.Fatalf("Status available wasn't present") 323 } 324 325 t.Log("RestoreToNew") 326 327 toNew, err := backups.RestoreToNew(client, backups.RestoreToNewOpts{ 328 Name: rds.Name, 329 Password: "acc-test-password1!", 330 FlavorRef: "rds.pg.c2.large", 331 Volume: &instances.Volume{ 332 Type: "COMMON", 333 Size: 200, 334 }, 335 AvailabilityZone: rds.AvailabilityZone, 336 VpcId: clients.EnvOS.GetEnv("VPC_ID"), 337 SubnetId: clients.EnvOS.GetEnv("NETWORK_ID"), 338 SecurityGroupId: openstack.DefaultSecurityGroup(t), 339 RestorePoint: backups.RestorePoint{ 340 InstanceID: rds.Id, 341 Type: "backup", 342 BackupID: backupList[0].ID, 343 }, 344 UnchangeableParam: &instances.Param{ 345 LowerCaseTableNames: "0", 346 }, 347 }) 348 th.AssertNoErr(t, err) 349 err = instances.WaitForJobCompleted(client, 600, toNew.JobId) 350 th.AssertNoErr(t, err) 351 t.Cleanup(func() { 352 DeleteRDS(t, client, toNew.Instance.Id) 353 }) 354 355 policy, err := backups.ShowBackupPolicy(client, rds.Id) 356 th.AssertNoErr(t, err) 357 tools.PrintResource(t, policy) 358 359 err = backups.Update(client, backups.UpdateOpts{ 360 InstanceId: rds.Id, 361 KeepDays: pointerto.Int(policy.KeepDays - 1), 362 StartTime: policy.StartTime, 363 Period: "1,2,3,4", 364 }) 365 th.AssertNoErr(t, err) 366 367 t.Logf("Attempting to create RDSv3 Read Replica") 368 369 rdsReplicaName := tools.RandomString("rds-rr-", 8) 370 kmsID := clients.EnvOS.GetEnv("KMS_ID") 371 az := clients.EnvOS.GetEnv("AVAILABILITY_ZONE") 372 if az == "" { 373 az = "eu-de-01" 374 } 375 376 if err := instances.WaitForStateAvailable(client, 600, rds.Id); err != nil { 377 t.Fatalf("Status available wasn't present") 378 } 379 380 replica, err := instances.CreateReplica(client, instances.CreateReplicaOpts{ 381 Name: rdsReplicaName, 382 ReplicaOfId: rds.Id, 383 DiskEncryptionId: kmsID, 384 FlavorRef: "rds.pg.c2.large.rr", 385 Volume: &instances.Volume{ 386 Type: "COMMON", 387 Size: 100, 388 }, 389 AvailabilityZone: az, 390 }) 391 th.AssertNoErr(t, err) 392 err = instances.WaitForJobCompleted(client, 1200, replica.JobId) 393 th.AssertNoErr(t, err) 394 395 t.Logf("Created RDSv3 Read Replica: %s", replica.Instance.Id) 396 397 t.Cleanup(func() { 398 t.Logf("Attempting to delete RDSv3 Read Replica: %s", replica.Instance.Id) 399 _, err := instances.Delete(client, replica.Instance.Id) 400 th.AssertNoErr(t, err) 401 t.Logf("RDSv3 Read Replica instance deleted: %s", replica.Instance.Id) 402 }) 403 } 404 405 func TestBackupKeepDays(t *testing.T) { 406 if os.Getenv("RUN_RDS_LIFECYCLE") == "" { 407 t.Skip("too slow to run in zuul") 408 } 409 410 client, err := clients.NewRdsV3() 411 th.AssertNoErr(t, err) 412 413 cc, err := clients.CloudAndClient() 414 th.AssertNoErr(t, err) 415 416 t.Log("Creating instance") 417 418 // Create RDSv3 instance 419 rds := CreateRDS(t, client, cc.RegionName) 420 t.Cleanup(func() { DeleteRDS(t, client, rds.Id) }) 421 422 err = backups.Update(client, backups.UpdateOpts{ 423 InstanceId: rds.Id, 424 KeepDays: pointerto.Int(0), 425 }) 426 th.AssertNoErr(t, err) 427 } 428 429 func TestBackupRestorePointInTime(t *testing.T) { 430 if os.Getenv("RUN_RDS_LIFECYCLE") == "" { 431 t.Skip("too slow to run in zuul") 432 } 433 434 client, err := clients.NewRdsV3() 435 th.AssertNoErr(t, err) 436 437 cc, err := clients.CloudAndClient() 438 th.AssertNoErr(t, err) 439 440 t.Log("Creating instance") 441 442 // Create RDSv3 instance 443 rds := CreateRDS(t, client, cc.RegionName) 444 t.Cleanup(func() { DeleteRDS(t, client, rds.Id) }) 445 446 if err := instances.WaitForStateAvailable(client, 600, rds.Id); err != nil { 447 t.Fatalf("Status available wasn't present") 448 } 449 450 backup, err := backups.Create(client, backups.CreateOpts{ 451 InstanceID: rds.Id, 452 Name: tools.RandomString("rds-backup-test-", 5), 453 }) 454 th.AssertNoErr(t, err) 455 456 t.Log("Backup creation started") 457 458 if err := instances.WaitForStateAvailable(client, 600, rds.Id); err != nil { 459 t.Fatalf("Status available wasn't present") 460 } 461 462 t.Cleanup(func() { 463 th.AssertNoErr(t, backups.Delete(client, backup.ID)) 464 t.Log("Backup deleted") 465 }) 466 467 err = backups.WaitForBackup(client, rds.Id, backup.ID, backups.StatusCompleted) 468 th.AssertNoErr(t, err) 469 t.Log("Backup creation complete") 470 471 backupList, err := backups.List(client, backups.ListOpts{InstanceID: rds.Id, BackupID: backup.ID}) 472 th.AssertNoErr(t, err) 473 474 t.Log("RestorePITR") 475 476 pitr, err := backups.RestorePITR(client, backups.RestorePITROpts{ 477 Source: backups.Source{ 478 BackupID: backupList[0].ID, 479 InstanceID: backupList[0].InstanceID, 480 Type: "backup", 481 }, 482 Target: backups.Target{ 483 InstanceID: rds.Id, 484 }, 485 }) 486 th.AssertNoErr(t, err) 487 _ = instances.WaitForJobCompleted(client, 600, pitr) 488 } 489 490 func TestRdsAutoScaling(t *testing.T) { 491 if os.Getenv("RUN_RDS_LIFECYCLE") == "" { 492 t.Skip("too slow to run in zuul") 493 } 494 495 client, err := clients.NewRdsV3() 496 th.AssertNoErr(t, err) 497 498 cc, err := clients.CloudAndClient() 499 th.AssertNoErr(t, err) 500 501 t.Log("Creating instance") 502 503 // Create MySql RDSv3 instance 504 rds := CreateMySqlRDS(t, client, cc.RegionName) 505 t.Cleanup(func() { DeleteRDS(t, client, rds.Id) }) 506 th.AssertEquals(t, rds.Volume.Size, 100) 507 508 err = instances.ManageAutoScaling(client, rds.Id, instances.ScalingOpts{ 509 SwitchOption: true, 510 LimitSize: pointerto.Int(200), 511 TriggerThreshold: pointerto.Int(20), 512 }) 513 th.AssertNoErr(t, err) 514 515 scaling, err := instances.GetAutoScaling(client, rds.Id) 516 th.AssertNoErr(t, err) 517 tools.PrintResource(t, scaling) 518 }