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  }