github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/acceptance/openstack/common.go (about)

     1  // Package openstack contains common functions that can be used
     2  // across all OpenStack components for acceptance testing.
     3  package openstack
     4  
     5  import (
     6  	"fmt"
     7  	"net"
     8  	"testing"
     9  
    10  	"github.com/opentelekomcloud/gophertelekomcloud"
    11  	"github.com/opentelekomcloud/gophertelekomcloud/acceptance/clients"
    12  	"github.com/opentelekomcloud/gophertelekomcloud/acceptance/tools"
    13  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/blockstorage/v2/volumes"
    14  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/common/extensions"
    15  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/compute/v2/extensions/secgroups"
    16  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/ecs/v1/cloudservers"
    17  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/ims/v2/images"
    18  	"github.com/opentelekomcloud/gophertelekomcloud/openstack/networking/v1/subnets"
    19  	th "github.com/opentelekomcloud/gophertelekomcloud/testhelper"
    20  )
    21  
    22  // PrintExtension prints an extension and all of its attributes.
    23  func PrintExtension(t *testing.T, extension *extensions.Extension) {
    24  	t.Logf("Name: %s", extension.Name)
    25  	t.Logf("Namespace: %s", extension.Namespace)
    26  	t.Logf("Alias: %s", extension.Alias)
    27  	t.Logf("Description: %s", extension.Description)
    28  	t.Logf("Updated: %s", extension.Updated)
    29  	t.Logf("Links: %v", extension.Links)
    30  }
    31  
    32  func DefaultSecurityGroup(t *testing.T) string {
    33  	client, err := clients.NewComputeV2Client()
    34  	th.AssertNoErr(t, err)
    35  
    36  	securityGroupPages, err := secgroups.List(client).AllPages()
    37  	th.AssertNoErr(t, err)
    38  	securityGroups, err := secgroups.ExtractSecurityGroups(securityGroupPages)
    39  	th.AssertNoErr(t, err)
    40  	var sgId string
    41  	for _, val := range securityGroups {
    42  		if val.Name == "default" {
    43  			sgId = val.ID
    44  			break
    45  		}
    46  	}
    47  	if sgId == "" {
    48  		t.Fatalf("Unable to find default secgroup")
    49  	}
    50  	return sgId
    51  }
    52  
    53  func CreateSecurityGroup(t *testing.T) string {
    54  	client, err := clients.NewComputeV2Client()
    55  	th.AssertNoErr(t, err)
    56  
    57  	createSGOpts := secgroups.CreateOpts{
    58  		Name:        tools.RandomString("acc-sg-", 3),
    59  		Description: "security group for acceptance testing",
    60  	}
    61  	secGroup, err := secgroups.Create(client, createSGOpts).Extract()
    62  	th.AssertNoErr(t, err)
    63  
    64  	t.Logf("Security group %s was created", secGroup.ID)
    65  	return secGroup.ID
    66  }
    67  
    68  func DeleteSecurityGroup(t *testing.T, secGroupID string) {
    69  	client, err := clients.NewComputeV2Client()
    70  	th.AssertNoErr(t, err)
    71  
    72  	err = secgroups.DeleteWithRetry(client, secGroupID, 600)
    73  	th.AssertNoErr(t, err)
    74  
    75  	t.Logf("Security group %s was deleted", secGroupID)
    76  }
    77  
    78  func CreateVolume(t *testing.T) *volumes.Volume {
    79  	client, err := clients.NewBlockStorageV3Client()
    80  	th.AssertNoErr(t, err)
    81  	vol, err := volumes.Create(client, volumes.CreateOpts{
    82  		Name:       tools.RandomString("test-vol-", 6),
    83  		Size:       10,
    84  		VolumeType: "SSD",
    85  	}).Extract()
    86  	th.AssertNoErr(t, err)
    87  
    88  	err = golangsdk.WaitFor(300, func() (bool, error) {
    89  		volume, err := volumes.Get(client, vol.ID).Extract()
    90  		if err != nil {
    91  			return false, err
    92  		}
    93  		if volume.Status == "available" {
    94  			return true, nil
    95  		}
    96  		if volume.Status == "error" {
    97  			return false, fmt.Errorf("error creating a volume")
    98  		}
    99  		return false, nil
   100  	})
   101  	th.AssertNoErr(t, err)
   102  
   103  	return vol
   104  }
   105  
   106  func DeleteVolume(t *testing.T, id string) {
   107  	client, err := clients.NewBlockStorageV3Client()
   108  	th.AssertNoErr(t, err)
   109  	th.AssertNoErr(t, volumes.Delete(client, id, volumes.DeleteOpts{Cascade: true}).ExtractErr())
   110  }
   111  
   112  const (
   113  	imageName = "Standard_Debian_10_latest"
   114  	flavorID  = "s3.large.2"
   115  )
   116  
   117  func GetCloudServerCreateOpts(t *testing.T) cloudservers.CreateOpts {
   118  	prefix := "ecs-"
   119  	ecsName := tools.RandomString(prefix, 3)
   120  
   121  	az := clients.EnvOS.GetEnv("AVAILABILITY_ZONE")
   122  	vpcID := clients.EnvOS.GetEnv("VPC_ID")
   123  	subnetID := clients.EnvOS.GetEnv("NETWORK_ID")
   124  	kmsID := clients.EnvOS.GetEnv("KMS_ID")
   125  	var encryption string
   126  	if kmsID != "" {
   127  		encryption = "1"
   128  	} else {
   129  		encryption = "0"
   130  	}
   131  
   132  	imageV2Client, err := clients.NewIMSV2Client()
   133  	th.AssertNoErr(t, err)
   134  
   135  	image, err := images.ListImages(imageV2Client, images.ListImagesOpts{
   136  		Name: imageName,
   137  	})
   138  	th.AssertNoErr(t, err)
   139  
   140  	if vpcID == "" || subnetID == "" || az == "" {
   141  		t.Skip("One of OS_VPC_ID, OS_NETWORK_ID or OS_AVAILABILITY_ZONE env vars is missing but ECSv1 test requires")
   142  	}
   143  
   144  	createOpts := cloudservers.CreateOpts{
   145  		ImageRef:  image[0].Id,
   146  		FlavorRef: flavorID,
   147  		Name:      ecsName,
   148  		VpcId:     vpcID,
   149  		Nics: []cloudservers.Nic{
   150  			{
   151  				SubnetId: subnetID,
   152  			},
   153  		},
   154  		RootVolume: cloudservers.RootVolume{
   155  			VolumeType: "SSD",
   156  			Metadata: map[string]interface{}{
   157  				"__system__encrypted": encryption,
   158  				"__system__cmkid":     kmsID,
   159  			},
   160  		},
   161  		DataVolumes: []cloudservers.DataVolume{
   162  			{
   163  				VolumeType: "SSD",
   164  				Size:       40,
   165  				Metadata: map[string]interface{}{
   166  					"__system__encrypted": encryption,
   167  					"__system__cmkid":     kmsID,
   168  				},
   169  			},
   170  		},
   171  		AvailabilityZone: az,
   172  	}
   173  
   174  	return createOpts
   175  }
   176  
   177  func DryRunCloudServerConfig(t *testing.T, client *golangsdk.ServiceClient, createOpts cloudservers.CreateOpts) {
   178  	t.Logf("Attempting to check ECSv1 createOpts")
   179  	err := cloudservers.DryRun(client, createOpts).ExtractErr()
   180  	th.AssertNoErr(t, err)
   181  }
   182  
   183  func CreateCloudServer(t *testing.T, client *golangsdk.ServiceClient, createOpts cloudservers.CreateOpts) *cloudservers.CloudServer {
   184  	t.Logf("Attempting to create ECSv1")
   185  
   186  	jobResponse, err := cloudservers.Create(client, createOpts).ExtractJobResponse()
   187  	th.AssertNoErr(t, err)
   188  
   189  	err = cloudservers.WaitForJobSuccess(client, 1200, jobResponse.JobID)
   190  	th.AssertNoErr(t, err)
   191  
   192  	serverID, err := cloudservers.GetJobEntity(client, jobResponse.JobID, "server_id")
   193  	th.AssertNoErr(t, err)
   194  
   195  	ecs, err := cloudservers.Get(client, serverID.(string)).Extract()
   196  	th.AssertNoErr(t, err)
   197  	t.Logf("Created ECSv1 instance: %s", ecs.ID)
   198  
   199  	return ecs
   200  }
   201  
   202  func DeleteCloudServer(t *testing.T, client *golangsdk.ServiceClient, ecsID string) {
   203  	t.Logf("Attempting to delete ECSv1: %s", ecsID)
   204  
   205  	deleteOpts := cloudservers.DeleteOpts{
   206  		Servers: []cloudservers.Server{
   207  			{
   208  				Id: ecsID,
   209  			},
   210  		},
   211  		DeletePublicIP: true,
   212  		DeleteVolume:   true,
   213  	}
   214  	jobResponse, err := cloudservers.Delete(client, deleteOpts).ExtractJobResponse()
   215  	th.AssertNoErr(t, err)
   216  
   217  	err = cloudservers.WaitForJobSuccess(client, 1200, jobResponse.JobID)
   218  	th.AssertNoErr(t, err)
   219  
   220  	t.Logf("ECSv1 instance deleted: %s", ecsID)
   221  }
   222  
   223  // ValidIP returns valid value for IP in subnet by VPC subnet ID / OpenStack network ID
   224  func ValidIP(t *testing.T, networkID string) string {
   225  	client, err := clients.NewNetworkV1Client()
   226  	th.AssertNoErr(t, err)
   227  
   228  	sn, err := subnets.Get(client, networkID).Extract()
   229  	th.AssertNoErr(t, err)
   230  
   231  	_, nw, err := net.ParseCIDR(sn.CIDR)
   232  	th.AssertNoErr(t, err)
   233  	singleIP := nw.IP
   234  	singleIP[len(singleIP)-1] += 3
   235  	th.AssertEquals(t, true, nw.Contains(singleIP))
   236  	return singleIP.String()
   237  }