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