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 }