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  }