github.com/vnpaycloud-console/gophercloud/v2@v2.0.5/internal/acceptance/openstack/dns/v2/dns.go (about) 1 package v2 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/vnpaycloud-console/gophercloud/v2" 8 "github.com/vnpaycloud-console/gophercloud/v2/internal/acceptance/tools" 9 "github.com/vnpaycloud-console/gophercloud/v2/openstack/dns/v2/recordsets" 10 transferAccepts "github.com/vnpaycloud-console/gophercloud/v2/openstack/dns/v2/transfer/accept" 11 transferRequests "github.com/vnpaycloud-console/gophercloud/v2/openstack/dns/v2/transfer/request" 12 "github.com/vnpaycloud-console/gophercloud/v2/openstack/dns/v2/zones" 13 th "github.com/vnpaycloud-console/gophercloud/v2/testhelper" 14 ) 15 16 // CreateRecordSet will create a RecordSet with a random name. An error will 17 // be returned if the zone was unable to be created. 18 func CreateRecordSet(t *testing.T, client *gophercloud.ServiceClient, zone *zones.Zone) (*recordsets.RecordSet, error) { 19 t.Logf("Attempting to create recordset: %s", zone.Name) 20 21 createOpts := recordsets.CreateOpts{ 22 Name: zone.Name, 23 Type: "A", 24 TTL: 3600, 25 Description: "Test recordset", 26 Records: []string{"10.1.0.2"}, 27 } 28 29 rs, err := recordsets.Create(context.TODO(), client, zone.ID, createOpts).Extract() 30 if err != nil { 31 return rs, err 32 } 33 34 if err := WaitForRecordSetStatus(client, rs, "ACTIVE"); err != nil { 35 return rs, err 36 } 37 38 newRS, err := recordsets.Get(context.TODO(), client, rs.ZoneID, rs.ID).Extract() 39 if err != nil { 40 return newRS, err 41 } 42 43 t.Logf("Created record set: %s", newRS.Name) 44 45 th.AssertEquals(t, newRS.Name, zone.Name) 46 47 return rs, nil 48 } 49 50 // CreateZone will create a Zone with a random name. An error will 51 // be returned if the zone was unable to be created. 52 func CreateZone(t *testing.T, client *gophercloud.ServiceClient) (*zones.Zone, error) { 53 zoneName := tools.RandomString("ACPTTEST", 8) + ".com." 54 55 t.Logf("Attempting to create zone: %s", zoneName) 56 createOpts := zones.CreateOpts{ 57 Name: zoneName, 58 Email: "root@example.com", 59 Type: "PRIMARY", 60 TTL: 7200, 61 Description: "Test zone", 62 } 63 64 zone, err := zones.Create(context.TODO(), client, createOpts).Extract() 65 if err != nil { 66 return zone, err 67 } 68 69 if err := WaitForZoneStatus(client, zone, "ACTIVE"); err != nil { 70 return zone, err 71 } 72 73 newZone, err := zones.Get(context.TODO(), client, zone.ID).Extract() 74 if err != nil { 75 return zone, err 76 } 77 78 t.Logf("Created Zone: %s", zoneName) 79 80 th.AssertEquals(t, newZone.Name, zoneName) 81 th.AssertEquals(t, newZone.TTL, 7200) 82 83 return newZone, nil 84 } 85 86 // CreateSecondaryZone will create a Zone with a random name. An error will 87 // be returned if the zone was unable to be created. 88 // 89 // This is only for example purposes as it will try to do a zone transfer. 90 func CreateSecondaryZone(t *testing.T, client *gophercloud.ServiceClient) (*zones.Zone, error) { 91 zoneName := tools.RandomString("ACPTTEST", 8) + ".com." 92 93 t.Logf("Attempting to create zone: %s", zoneName) 94 createOpts := zones.CreateOpts{ 95 Name: zoneName, 96 Type: "SECONDARY", 97 Masters: []string{"10.0.0.1"}, 98 } 99 100 zone, err := zones.Create(context.TODO(), client, createOpts).Extract() 101 if err != nil { 102 return zone, err 103 } 104 105 if err := WaitForZoneStatus(client, zone, "ACTIVE"); err != nil { 106 return zone, err 107 } 108 109 newZone, err := zones.Get(context.TODO(), client, zone.ID).Extract() 110 if err != nil { 111 return zone, err 112 } 113 114 t.Logf("Created Zone: %s", zoneName) 115 116 th.AssertEquals(t, newZone.Name, zoneName) 117 th.AssertEquals(t, newZone.Masters[0], "10.0.0.1") 118 119 return newZone, nil 120 } 121 122 // CreateTransferRequest will create a Transfer Request to a spectified Zone. An error will 123 // be returned if the zone transfer request was unable to be created. 124 func CreateTransferRequest(t *testing.T, client *gophercloud.ServiceClient, zone *zones.Zone, targetProjectID string) (*transferRequests.TransferRequest, error) { 125 t.Logf("Attempting to create Transfer Request to Zone: %s", zone.Name) 126 127 createOpts := transferRequests.CreateOpts{ 128 TargetProjectID: targetProjectID, 129 Description: "Test transfer request", 130 } 131 132 transferRequest, err := transferRequests.Create(context.TODO(), client, zone.ID, createOpts).Extract() 133 if err != nil { 134 return transferRequest, err 135 } 136 137 if err := WaitForTransferRequestStatus(client, transferRequest, "ACTIVE"); err != nil { 138 return transferRequest, err 139 } 140 141 newTransferRequest, err := transferRequests.Get(context.TODO(), client, transferRequest.ID).Extract() 142 if err != nil { 143 return transferRequest, err 144 } 145 146 t.Logf("Created Transfer Request for Zone: %s", zone.Name) 147 148 th.AssertEquals(t, newTransferRequest.ZoneID, zone.ID) 149 th.AssertEquals(t, newTransferRequest.ZoneName, zone.Name) 150 151 return newTransferRequest, nil 152 } 153 154 // CreateTransferAccept will accept a spectified Transfer Request. An error will 155 // be returned if the zone transfer accept was unable to be created. 156 func CreateTransferAccept(t *testing.T, client *gophercloud.ServiceClient, zoneTransferRequestID string, key string) (*transferAccepts.TransferAccept, error) { 157 t.Logf("Attempting to accept specified transfer reqeust: %s", zoneTransferRequestID) 158 createOpts := transferAccepts.CreateOpts{ 159 ZoneTransferRequestID: zoneTransferRequestID, 160 Key: key, 161 } 162 transferAccept, err := transferAccepts.Create(context.TODO(), client, createOpts).Extract() 163 if err != nil { 164 return transferAccept, err 165 } 166 if err := WaitForTransferAcceptStatus(client, transferAccept, "COMPLETE"); err != nil { 167 return transferAccept, err 168 } 169 newTransferAccept, err := transferAccepts.Get(context.TODO(), client, transferAccept.ID).Extract() 170 if err != nil { 171 return transferAccept, err 172 } 173 t.Logf("Accepted Transfer Request: %s", zoneTransferRequestID) 174 th.AssertEquals(t, newTransferAccept.ZoneTransferRequestID, zoneTransferRequestID) 175 return newTransferAccept, nil 176 } 177 178 // DeleteTransferRequest will delete a specified zone transfer request. A fatal error will occur if 179 // the transfer request failed to be deleted. This works best when used as a deferred 180 // function. 181 func DeleteTransferRequest(t *testing.T, client *gophercloud.ServiceClient, tr *transferRequests.TransferRequest) { 182 err := transferRequests.Delete(context.TODO(), client, tr.ID).ExtractErr() 183 if err != nil { 184 t.Fatalf("Unable to delete zone transfer request %s: %v", tr.ID, err) 185 } 186 t.Logf("Deleted zone transfer request: %s", tr.ID) 187 } 188 189 // DeleteRecordSet will delete a specified record set. A fatal error will occur if 190 // the record set failed to be deleted. This works best when used as a deferred 191 // function. 192 func DeleteRecordSet(t *testing.T, client *gophercloud.ServiceClient, rs *recordsets.RecordSet) { 193 err := recordsets.Delete(context.TODO(), client, rs.ZoneID, rs.ID).ExtractErr() 194 if err != nil { 195 t.Fatalf("Unable to delete record set %s: %v", rs.ID, err) 196 } 197 198 t.Logf("Deleted record set: %s", rs.ID) 199 } 200 201 // DeleteZone will delete a specified zone. A fatal error will occur if 202 // the zone failed to be deleted. This works best when used as a deferred 203 // function. 204 func DeleteZone(t *testing.T, client *gophercloud.ServiceClient, zone *zones.Zone) { 205 _, err := zones.Delete(context.TODO(), client, zone.ID).Extract() 206 if err != nil { 207 t.Fatalf("Unable to delete zone %s: %v", zone.ID, err) 208 } 209 210 t.Logf("Deleted zone: %s", zone.ID) 211 } 212 213 // WaitForRecordSetStatus will poll a record set's status until it either matches 214 // the specified status or the status becomes ERROR. 215 func WaitForRecordSetStatus(client *gophercloud.ServiceClient, rs *recordsets.RecordSet, status string) error { 216 return tools.WaitFor(func(ctx context.Context) (bool, error) { 217 current, err := recordsets.Get(ctx, client, rs.ZoneID, rs.ID).Extract() 218 if err != nil { 219 return false, err 220 } 221 222 if current.Status == status { 223 return true, nil 224 } 225 226 return false, nil 227 }) 228 } 229 230 // WaitForTransferRequestStatus will poll a transfer reqeust's status until it either matches 231 // the specified status or the status becomes ERROR. 232 func WaitForTransferRequestStatus(client *gophercloud.ServiceClient, tr *transferRequests.TransferRequest, status string) error { 233 return tools.WaitFor(func(ctx context.Context) (bool, error) { 234 current, err := transferRequests.Get(ctx, client, tr.ID).Extract() 235 if err != nil { 236 return false, err 237 } 238 if current.Status == status { 239 return true, nil 240 } 241 return false, nil 242 }) 243 } 244 245 // WaitForTransferAcceptStatus will poll a transfer accept's status until it either matches 246 // the specified status or the status becomes ERROR. 247 func WaitForTransferAcceptStatus(client *gophercloud.ServiceClient, ta *transferAccepts.TransferAccept, status string) error { 248 return tools.WaitFor(func(ctx context.Context) (bool, error) { 249 current, err := transferAccepts.Get(ctx, client, ta.ID).Extract() 250 if err != nil { 251 return false, err 252 } 253 if current.Status == status { 254 return true, nil 255 } 256 return false, nil 257 }) 258 } 259 260 // WaitForZoneStatus will poll a zone's status until it either matches 261 // the specified status or the status becomes ERROR. 262 func WaitForZoneStatus(client *gophercloud.ServiceClient, zone *zones.Zone, status string) error { 263 return tools.WaitFor(func(ctx context.Context) (bool, error) { 264 current, err := zones.Get(ctx, client, zone.ID).Extract() 265 if err != nil { 266 return false, err 267 } 268 269 if current.Status == status { 270 return true, nil 271 } 272 273 return false, nil 274 }) 275 }