github.com/opentelekomcloud/gophertelekomcloud@v0.9.3/acceptance/openstack/mrs/v1/clusters_test.go (about) 1 package v1 2 3 import ( 4 "testing" 5 "time" 6 7 golangsdk "github.com/opentelekomcloud/gophertelekomcloud" 8 "github.com/opentelekomcloud/gophertelekomcloud/acceptance/clients" 9 "github.com/opentelekomcloud/gophertelekomcloud/acceptance/tools" 10 "github.com/opentelekomcloud/gophertelekomcloud/openstack/common/pointerto" 11 "github.com/opentelekomcloud/gophertelekomcloud/openstack/common/tags" 12 "github.com/opentelekomcloud/gophertelekomcloud/openstack/mrs/v1/cluster" 13 "github.com/opentelekomcloud/gophertelekomcloud/openstack/networking/v1/subnets" 14 "github.com/opentelekomcloud/gophertelekomcloud/openstack/networking/v1/vpcs" 15 th "github.com/opentelekomcloud/gophertelekomcloud/testhelper" 16 ) 17 18 func TestMrsClusterLifecycle(t *testing.T) { 19 client, err := clients.NewMrsV1() 20 th.AssertNoErr(t, err) 21 22 cc, err := clients.CloudAndClient() 23 th.AssertNoErr(t, err) 24 25 az := clients.EnvOS.GetEnv("AVAILABILITY_ZONE") 26 if az == "" { 27 az = "eu-de-02" 28 } 29 30 networkID := clients.EnvOS.GetEnv("NETWORK_ID") 31 vpcID := clients.EnvOS.GetEnv("VPC_ID", "ROUTER_ID") 32 keyPairName := clients.EnvOS.GetEnv("KEYPAIR_NAME") 33 if networkID == "" || vpcID == "" || keyPairName == "" { 34 t.Skip("OS_NETWORK_ID, OS_VPC_ID or OS_KEYPAIR_NAME env vars are missing but MRS Cluster test requires") 35 } 36 37 nwV1Client, err := clients.NewNetworkV1Client() 38 th.AssertNoErr(t, err) 39 40 vpc, err := vpcs.Get(nwV1Client, vpcID).Extract() 41 th.AssertNoErr(t, err) 42 43 subnet, err := subnets.Get(nwV1Client, networkID).Extract() 44 th.AssertNoErr(t, err) 45 46 name := tools.RandomString("mrs-create-", 3) 47 createOpts := cluster.CreateOpts{ 48 BillingType: 12, 49 DataCenter: cc.RegionName, 50 MasterNodeNum: 2, 51 MasterNodeSize: "c3.xlarge.4.linux.mrs", 52 CoreNodeNum: 3, 53 CoreNodeSize: "c3.xlarge.4.linux.mrs", 54 AvailableZoneId: az, 55 ClusterName: name, 56 Vpc: vpc.Name, 57 VpcId: vpc.ID, 58 SubnetId: subnet.NetworkID, 59 SubnetName: subnet.Name, 60 ClusterVersion: "MRS 2.1.0", 61 ClusterType: pointerto.Int(0), 62 VolumeType: "SATA", 63 VolumeSize: 100, 64 SafeMode: 1, 65 ClusterAdminSecret: "SuperQwerty123!", 66 LoginMode: pointerto.Int(1), 67 NodePublicCertName: keyPairName, 68 LogCollection: pointerto.Int(1), 69 ComponentList: cluster.ExpandComponent( 70 []string{"Presto", "Hadoop", "Spark", "HBase", "Hive", "Hue", "Loader", "Tez", "Flink"}, 71 ), 72 BootstrapScripts: []cluster.BootstrapScript{{ 73 Name: "BootstrapScript", 74 Uri: "s3a://bootstrap/presto/presto-install.sh", 75 Parameters: "--presto_version 0.227", 76 Nodes: []string{"master"}, 77 ActiveMaster: pointerto.Bool(true), 78 FailAction: "continue", 79 }}, 80 } 81 82 clResponse, err := cluster.Create(client, createOpts) 83 th.AssertNoErr(t, err) 84 85 err = waitForClusterToBeActive(client, clResponse.ClusterId, 3000) 86 th.AssertNoErr(t, err) 87 88 t.Cleanup(func() { 89 err = cluster.Delete(client, clResponse.ClusterId) 90 th.AssertNoErr(t, err) 91 err = waitForClusterToBeDeleted(client, clResponse.ClusterId, 3000) 92 th.AssertNoErr(t, err) 93 }) 94 95 tagOpts := []tags.ResourceTag{ 96 { 97 Key: "muh", 98 Value: "lala", 99 }, 100 { 101 Key: "kuh", 102 Value: "lala", 103 }, 104 } 105 106 err = tags.Create(client, "clusters", clResponse.ClusterId, tagOpts).ExtractErr() 107 th.AssertNoErr(t, err) 108 109 newCluster, err := cluster.Get(client, clResponse.ClusterId) 110 th.AssertNoErr(t, err) 111 th.AssertEquals(t, len(newCluster.ComponentList), 9) 112 113 tagList, err := tags.Get(client, "clusters", clResponse.ClusterId).Extract() 114 th.AssertNoErr(t, err) 115 th.AssertEquals(t, len(tagList), len(tagOpts)) 116 } 117 118 func waitForClusterToBeActive(client *golangsdk.ServiceClient, clusterID string, secs int) error { 119 return golangsdk.WaitFor(secs, func() (bool, error) { 120 n, err := cluster.Get(client, clusterID) 121 if err != nil { 122 return false, err 123 } 124 125 if n.ClusterState == "running" { 126 return true, nil 127 } 128 time.Sleep(5 * time.Second) 129 return false, nil 130 }) 131 } 132 133 func waitForClusterToBeDeleted(client *golangsdk.ServiceClient, clusterID string, secs int) error { 134 return golangsdk.WaitFor(secs, func() (bool, error) { 135 n, err := cluster.Get(client, clusterID) 136 if err != nil { 137 if _, ok := err.(golangsdk.ErrDefault404); ok { 138 return true, nil 139 } 140 return false, err 141 } 142 143 if n.ClusterState == "terminated" { 144 return true, nil 145 } 146 147 return false, nil 148 }) 149 }