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  }