Skip to content

Commit f15cca8

Browse files
rds major (#897)
1 parent f354097 commit f15cca8

File tree

7 files changed

+425
-0
lines changed

7 files changed

+425
-0
lines changed
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
package v3
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
8+
"github.com/opentelekomcloud/gophertelekomcloud/acceptance/clients"
9+
"github.com/opentelekomcloud/gophertelekomcloud/acceptance/openstack"
10+
"github.com/opentelekomcloud/gophertelekomcloud/acceptance/tools"
11+
"github.com/opentelekomcloud/gophertelekomcloud/openstack/rds/v3/instances"
12+
"github.com/opentelekomcloud/gophertelekomcloud/openstack/rds/v3/upgrade"
13+
th "github.com/opentelekomcloud/gophertelekomcloud/testhelper"
14+
)
15+
16+
func CreatePostgreSQLRDS(t *testing.T, client *golangsdk.ServiceClient, region string) *instances.Instance {
17+
t.Logf("Attempting to create PostgreSQL RDS instance")
18+
19+
rdsName := tools.RandomString("rds-pg-test-", 8)
20+
21+
az := clients.EnvOS.GetEnv("AVAILABILITY_ZONE")
22+
if az == "" {
23+
az = "eu-de-01"
24+
}
25+
26+
vpcID := clients.EnvOS.GetEnv("VPC_ID")
27+
subnetID := clients.EnvOS.GetEnv("NETWORK_ID")
28+
kmsID := clients.EnvOS.GetEnv("KMS_ID")
29+
if vpcID == "" || subnetID == "" {
30+
t.Skip("One of OS_VPC_ID or OS_NETWORK_ID env vars is missing but RDS test requires using existing network")
31+
}
32+
33+
createRdsOpts := instances.CreateRdsOpts{
34+
Name: rdsName,
35+
Port: "5432",
36+
Password: "Postgres!120521",
37+
FlavorRef: "rds.pg.n1.large.2",
38+
Region: region,
39+
AvailabilityZone: az,
40+
VpcId: vpcID,
41+
SubnetId: subnetID,
42+
SecurityGroupId: openstack.DefaultSecurityGroup(t),
43+
DiskEncryptionId: kmsID,
44+
45+
Volume: &instances.Volume{
46+
Type: "CLOUDSSD",
47+
Size: 100,
48+
},
49+
Datastore: &instances.Datastore{
50+
Type: "PostgreSQL",
51+
Version: "13",
52+
},
53+
}
54+
55+
rds, err := instances.Create(client, createRdsOpts)
56+
th.AssertNoErr(t, err)
57+
err = instances.WaitForJobCompleted(client, 1200, rds.JobId)
58+
th.AssertNoErr(t, err)
59+
t.Logf("Created PostgreSQL RDS: %s", rds.Instance.Id)
60+
61+
return &rds.Instance
62+
}
63+
64+
func TestGetAvailableVersion(t *testing.T) {
65+
if os.Getenv("RUN_RDS_UPGRADE") == "" {
66+
t.Skip("RUN_RDS_UPGRADE not set, skipping RDS upgrade tests")
67+
}
68+
69+
client, err := clients.NewRdsV3()
70+
th.AssertNoErr(t, err)
71+
72+
cc, err := clients.CloudAndClient()
73+
th.AssertNoErr(t, err)
74+
75+
rds := CreatePostgreSQLRDS(t, client, cc.RegionName)
76+
t.Cleanup(func() { DeleteRDS(t, client, rds.Id) })
77+
78+
th.AssertNoErr(t, instances.WaitForStateAvailable(client, 600, rds.Id))
79+
80+
t.Log("Attempting to query available upgrade versions")
81+
82+
versions, err := upgrade.GetAvailableVersion(client, upgrade.GetAvailableVersionOpts{
83+
InstanceId: rds.Id,
84+
})
85+
th.AssertNoErr(t, err)
86+
th.AssertEquals(t, len(versions.AvailableVersions) > 0, true)
87+
}
88+
89+
func TestMajorVersionUpgradeWorkflow(t *testing.T) {
90+
if os.Getenv("RUN_RDS_UPGRADE") == "" {
91+
t.Skip("RUN_RDS_UPGRADE not set, skipping RDS upgrade tests")
92+
}
93+
94+
client, err := clients.NewRdsV3()
95+
th.AssertNoErr(t, err)
96+
97+
cc, err := clients.CloudAndClient()
98+
th.AssertNoErr(t, err)
99+
100+
rds := CreatePostgreSQLRDS(t, client, cc.RegionName)
101+
t.Cleanup(func() { DeleteRDS(t, client, rds.Id) })
102+
103+
th.AssertNoErr(t, instances.WaitForStateAvailable(client, 600, rds.Id))
104+
105+
t.Log("Attempting to get available versions")
106+
versions, err := upgrade.GetAvailableVersion(client, upgrade.GetAvailableVersionOpts{
107+
InstanceId: rds.Id,
108+
})
109+
th.AssertNoErr(t, err)
110+
th.AssertEquals(t, len(versions.AvailableVersions) > 0, true)
111+
112+
if len(versions.AvailableVersions) == 0 {
113+
t.Skip("No available versions for upgrade")
114+
}
115+
116+
targetVersion := versions.AvailableVersions[0]
117+
118+
t.Log("Attempting to perform pre-check")
119+
reportId, err := upgrade.PreCheck(client, upgrade.PreCheckOpts{
120+
InstanceId: rds.Id,
121+
TargetVersion: targetVersion,
122+
})
123+
th.AssertNoErr(t, err)
124+
th.AssertEquals(t, reportId != "", true)
125+
126+
t.Log("Attempting to check pre-check status")
127+
status, err := upgrade.GetStatus(client, upgrade.GetStatusOpts{
128+
InstanceId: rds.Id,
129+
Action: "check",
130+
})
131+
th.AssertNoErr(t, err)
132+
th.AssertEquals(t, status.TargetVersion, targetVersion)
133+
134+
t.Log("Attempting to query inspection histories")
135+
limit := 10
136+
histories, err := upgrade.GetInspectionHistories(client, upgrade.GetInspectionHistoriesOpts{
137+
InstanceId: rds.Id,
138+
Limit: &limit,
139+
})
140+
th.AssertNoErr(t, err)
141+
th.AssertEquals(t, histories.TotalCount > 0, true)
142+
143+
t.Log("Attempting to perform major version upgrade")
144+
th.AssertNoErr(t, instances.WaitForStateAvailable(client, 600, rds.Id))
145+
146+
jobResp, err := upgrade.UpgradeMajorVersion(client, upgrade.UpgradeMajorVersionOpts{
147+
InstanceId: rds.Id,
148+
TargetVersion: targetVersion,
149+
IsChangePrivateIp: false,
150+
StatisticsCollectionMode: ""})
151+
th.AssertNoErr(t, err)
152+
th.AssertEquals(t, jobResp.JobId != "", true)
153+
154+
t.Log("Attempting to monitor upgrade status")
155+
upgradeStatus, err := upgrade.GetStatus(client, upgrade.GetStatusOpts{
156+
InstanceId: rds.Id,
157+
Action: "upgrade"})
158+
th.AssertNoErr(t, err)
159+
t.Logf("Upgrade status: %s", upgradeStatus.Status)
160+
}
161+
162+
func TestGetUpgradeHistories(t *testing.T) {
163+
if os.Getenv("RUN_RDS_UPGRADE") == "" {
164+
t.Skip("RUN_RDS_UPGRADE not set, skipping RDS upgrade tests")
165+
}
166+
167+
client, err := clients.NewRdsV3()
168+
th.AssertNoErr(t, err)
169+
170+
cc, err := clients.CloudAndClient()
171+
th.AssertNoErr(t, err)
172+
173+
rds := CreatePostgreSQLRDS(t, client, cc.RegionName)
174+
t.Cleanup(func() { DeleteRDS(t, client, rds.Id) })
175+
176+
th.AssertNoErr(t, instances.WaitForStateAvailable(client, 600, rds.Id))
177+
178+
t.Log("Attempting to query upgrade histories")
179+
180+
limit := 10
181+
histories, err := upgrade.GetUpgradeHistories(client, upgrade.GetUpgradeHistoriesOpts{
182+
InstanceId: rds.Id,
183+
Limit: &limit,
184+
Order: "DESC",
185+
SortField: "start_time",
186+
})
187+
th.AssertNoErr(t, err)
188+
th.AssertEquals(t, histories.TotalCount >= 0, true)
189+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package upgrade
2+
3+
import (
4+
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
5+
"github.com/opentelekomcloud/gophertelekomcloud/internal/extract"
6+
)
7+
8+
type GetAvailableVersionOpts struct {
9+
InstanceId string `json:"-"`
10+
}
11+
12+
type AvailableVersions struct {
13+
AvailableVersions []string `json:"available_versions"`
14+
}
15+
16+
func GetAvailableVersion(client *golangsdk.ServiceClient, opts GetAvailableVersionOpts) (*AvailableVersions, error) {
17+
raw, err := client.Get(client.ServiceURL("instances", opts.InstanceId, "major-version", "available-version"), nil, &golangsdk.RequestOpts{
18+
OkCodes: []int{200},
19+
})
20+
if err != nil {
21+
return nil, err
22+
}
23+
24+
var res AvailableVersions
25+
err = extract.Into(raw.Body, &res)
26+
return &res, err
27+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package upgrade
2+
3+
import (
4+
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
5+
"github.com/opentelekomcloud/gophertelekomcloud/internal/extract"
6+
)
7+
8+
type GetInspectionHistoriesOpts struct {
9+
InstanceId string `json:"-" q:"-"`
10+
Offset *int `q:"offset"`
11+
Limit *int `q:"limit"`
12+
Order string `q:"order"`
13+
SortField string `q:"sort_field"`
14+
TargetVersion string `q:"target_version"`
15+
IsAvailable *bool `q:"is_available"`
16+
}
17+
18+
type InspectionReport struct {
19+
Id string `json:"id"`
20+
CheckTime string `json:"check_time"`
21+
ExpirationTime string `json:"expiration_time"`
22+
TargetVersion string `json:"target_version"`
23+
Result string `json:"result"`
24+
Detail string `json:"detail"`
25+
}
26+
27+
type InspectionHistories struct {
28+
TotalCount int `json:"total_count"`
29+
InspectionReports []InspectionReport `json:"inspection_reports"`
30+
}
31+
32+
func GetInspectionHistories(client *golangsdk.ServiceClient, opts GetInspectionHistoriesOpts) (*InspectionHistories, error) {
33+
url, err := golangsdk.NewURLBuilder().
34+
WithEndpoints("instances", opts.InstanceId, "major-version", "inspection-histories").
35+
WithQueryParams(&opts).
36+
Build()
37+
if err != nil {
38+
return nil, err
39+
}
40+
41+
raw, err := client.Get(client.ServiceURL(url.String()), nil, &golangsdk.RequestOpts{
42+
OkCodes: []int{200},
43+
})
44+
if err != nil {
45+
return nil, err
46+
}
47+
48+
var res InspectionHistories
49+
err = extract.Into(raw.Body, &res)
50+
return &res, err
51+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package upgrade
2+
3+
import (
4+
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
5+
"github.com/opentelekomcloud/gophertelekomcloud/internal/extract"
6+
)
7+
8+
type GetStatusOpts struct {
9+
InstanceId string `json:"-"`
10+
Action string `json:"-"`
11+
}
12+
13+
type VersionStatus struct {
14+
Status string `json:"status"`
15+
TargetVersion string `json:"target_version"`
16+
StartTime string `json:"start_time"`
17+
CheckExpirationTime string `json:"check_expiration_time"`
18+
Detail string `json:"detail"`
19+
}
20+
21+
func GetStatus(client *golangsdk.ServiceClient, opts GetStatusOpts) (*VersionStatus, error) {
22+
url := client.ServiceURL("instances", opts.InstanceId, "major-version", "status")
23+
url += "?action=" + opts.Action
24+
25+
raw, err := client.Get(url, nil, &golangsdk.RequestOpts{
26+
OkCodes: []int{200},
27+
})
28+
if err != nil {
29+
return nil, err
30+
}
31+
32+
var res VersionStatus
33+
err = extract.Into(raw.Body, &res)
34+
return &res, err
35+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package upgrade
2+
3+
import (
4+
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
5+
"github.com/opentelekomcloud/gophertelekomcloud/internal/extract"
6+
)
7+
8+
type GetUpgradeHistoriesOpts struct {
9+
InstanceId string `json:"-" q:"-"`
10+
Offset *int `q:"offset"`
11+
Limit *int `q:"limit"`
12+
Order string `q:"order"`
13+
SortField string `q:"sort_field"`
14+
}
15+
16+
type Report struct {
17+
Id string `json:"id"`
18+
StartTime string `json:"start_time"`
19+
EndTime string `json:"end_time"`
20+
SrcInstanceId string `json:"src_instance_id"`
21+
SrcDatabaseVersion string `json:"src_database_version"`
22+
DstInstanceId string `json:"dst_instance_id"`
23+
DstDatabaseVersion string `json:"dst_database_version"`
24+
Result string `json:"result"`
25+
IsPrivateIpChanged bool `json:"is_private_ip_changed"`
26+
PrivateIpChangeTime string `json:"private_ip_change_time"`
27+
StatisticsCollectionMode string `json:"statistics_collection_mode"`
28+
Detail string `json:"detail"`
29+
}
30+
31+
type Histories struct {
32+
TotalCount int `json:"total_count"`
33+
UpgradeReports []Report `json:"upgrade_reports"`
34+
}
35+
36+
func GetUpgradeHistories(client *golangsdk.ServiceClient, opts GetUpgradeHistoriesOpts) (*Histories, error) {
37+
url, err := golangsdk.NewURLBuilder().
38+
WithEndpoints("instances", opts.InstanceId, "major-version", "upgrade-histories").
39+
WithQueryParams(&opts).
40+
Build()
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
raw, err := client.Get(client.ServiceURL(url.String()), nil, &golangsdk.RequestOpts{
46+
OkCodes: []int{200},
47+
})
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
var res Histories
53+
err = extract.Into(raw.Body, &res)
54+
return &res, err
55+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package upgrade
2+
3+
import (
4+
golangsdk "github.com/opentelekomcloud/gophertelekomcloud"
5+
"github.com/opentelekomcloud/gophertelekomcloud/internal/build"
6+
"github.com/opentelekomcloud/gophertelekomcloud/internal/extract"
7+
)
8+
9+
type PreCheckOpts struct {
10+
InstanceId string `json:"-"`
11+
TargetVersion string `json:"target_version"`
12+
}
13+
14+
func PreCheck(client *golangsdk.ServiceClient, opts PreCheckOpts) (string, error) {
15+
b, err := build.RequestBody(opts, "")
16+
if err != nil {
17+
return "", err
18+
}
19+
20+
raw, err := client.Post(client.ServiceURL("instances", opts.InstanceId, "major-version", "inspection"), b, nil, &golangsdk.RequestOpts{
21+
OkCodes: []int{200},
22+
})
23+
if err != nil {
24+
return "", err
25+
}
26+
27+
var res struct {
28+
ReportId string `json:"report_id"`
29+
}
30+
err = extract.Into(raw.Body, &res)
31+
return res.ReportId, err
32+
}

0 commit comments

Comments
 (0)