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  }