133 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Go
		
	
	
	
| /*
 | |
|  * Copyright 2025 coze-dev Authors
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| package main
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"log"
 | |
| 	"os"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/volcengine/volcengine-go-sdk/service/escloud"
 | |
| 	"github.com/volcengine/volcengine-go-sdk/volcengine"
 | |
| )
 | |
| 
 | |
| func CreateESInstance(vpcID, subnetID, zoneID, ts string) (string, error) {
 | |
| 	if os.Getenv("VE_ES_INSTANCE_ID") != "" {
 | |
| 		return os.Getenv("VE_ES_INSTANCE_ID"), nil
 | |
| 	}
 | |
| 	svc := escloud.New(sess)
 | |
| 	reqNetworkSpecs := &escloud.NetworkSpecForCreateInstanceInOneStepInput{
 | |
| 		Bandwidth: volcengine.Int32(10),
 | |
| 		IsOpen:    volcengine.Bool(true),
 | |
| 		SpecName:  volcengine.String("es.eip.bgp_fixed_bandwidth"),
 | |
| 		Type:      volcengine.String("Kibana"),
 | |
| 	}
 | |
| 	reqExtraPerformance := &escloud.ExtraPerformanceForCreateInstanceInOneStepInput{
 | |
| 		Throughput: volcengine.Int32(0),
 | |
| 	}
 | |
| 	reqNodeSpecsAssigns := &escloud.NodeSpecsAssignForCreateInstanceInOneStepInput{
 | |
| 		ExtraPerformance: reqExtraPerformance,
 | |
| 		Number:           volcengine.Int32(1),
 | |
| 		ResourceSpecName: volcengine.String("kibana.x2.small"),
 | |
| 		StorageSize:      volcengine.Int32(0),
 | |
| 		Type:             volcengine.String("Kibana"),
 | |
| 	}
 | |
| 
 | |
| 	reqNodeSpecsAssigns1 := &escloud.NodeSpecsAssignForCreateInstanceInOneStepInput{
 | |
| 		ExtraPerformance: reqExtraPerformance,
 | |
| 		Number:           volcengine.Int32(1),
 | |
| 		ResourceSpecName: volcengine.String("es.x2.medium"),
 | |
| 		StorageSize:      volcengine.Int32(30),
 | |
| 		StorageSpecName:  volcengine.String("es.volume.essd.pl0"),
 | |
| 		Type:             volcengine.String("Hot"),
 | |
| 	}
 | |
| 	reqSubnet := &escloud.SubnetForCreateInstanceInOneStepInput{
 | |
| 		SubnetId: volcengine.String(subnetID),
 | |
| 	}
 | |
| 	reqVPC := &escloud.VPCForCreateInstanceInOneStepInput{
 | |
| 		VpcId: volcengine.String(vpcID),
 | |
| 	}
 | |
| 	name := "opencoze-es-" + ts
 | |
| 	reqInstanceConfiguration := &escloud.InstanceConfigurationForCreateInstanceInOneStepInput{
 | |
| 		AdminPassword:      volcengine.String(password),
 | |
| 		ChargeType:         volcengine.String("PostPaid"),
 | |
| 		EnableHttps:        volcengine.Bool(false),
 | |
| 		EnablePureMaster:   volcengine.Bool(false),
 | |
| 		InstanceName:       volcengine.String(name),
 | |
| 		NetworkSpecs:       []*escloud.NetworkSpecForCreateInstanceInOneStepInput{reqNetworkSpecs},
 | |
| 		NodeSpecsAssigns:   []*escloud.NodeSpecsAssignForCreateInstanceInOneStepInput{reqNodeSpecsAssigns, reqNodeSpecsAssigns1},
 | |
| 		ProjectName:        volcengine.String(projectName),
 | |
| 		RegionId:           volcengine.String(region),
 | |
| 		Subnet:             reqSubnet,
 | |
| 		VPC:                reqVPC,
 | |
| 		Version:            volcengine.String("V7_10"),
 | |
| 		ZoneId:             volcengine.String(zoneID),
 | |
| 		DeletionProtection: volcengine.Bool(false),
 | |
| 	}
 | |
| 	reqTags := &escloud.TagForCreateInstanceInOneStepInput{
 | |
| 		Key:   volcengine.String("opencoze"),
 | |
| 		Value: volcengine.String("1"),
 | |
| 	}
 | |
| 	createInstanceInOneStepInput := &escloud.CreateInstanceInOneStepInput{
 | |
| 		InstanceConfiguration: reqInstanceConfiguration,
 | |
| 		Tags:                  []*escloud.TagForCreateInstanceInOneStepInput{reqTags},
 | |
| 	}
 | |
| 
 | |
| 	resp, err := svc.CreateInstanceInOneStep(createInstanceInOneStepInput)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	if resp.InstanceId == nil {
 | |
| 		return "", errors.New("InstanceId is empty")
 | |
| 	}
 | |
| 
 | |
| 	return *resp.InstanceId, nil
 | |
| }
 | |
| 
 | |
| func GetESConnectAddress(instanceID string) (string, error) {
 | |
| 	svc := escloud.New(sess)
 | |
| 	describeInstanceInput := &escloud.DescribeInstanceInput{
 | |
| 		InstanceId: volcengine.String(instanceID),
 | |
| 	}
 | |
| 
 | |
| 	for {
 | |
| 		resp, err := svc.DescribeInstance(describeInstanceInput)
 | |
| 		if resp.InstanceInfo != nil && resp.InstanceInfo.Status != nil && *resp.InstanceInfo.Status != "Running" {
 | |
| 			fmt.Printf("[Elasticsearch] instance(%s) is %s, waiting for it to become ready... \n", instanceID, *resp.InstanceInfo.Status)
 | |
| 			time.Sleep(retryTime)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if err != nil {
 | |
| 			log.Printf("[Elasticsearch] will retry get es instance = %s failed, err= %s\n", instanceID, err.Error())
 | |
| 			time.Sleep(retryTime)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if resp.InstanceInfo.ESPrivateEndpoint == nil {
 | |
| 			log.Printf("[Elasticsearch] DescribeInstanceDetail resp.InstanceInfo.ESPrivateEndpoint is empty, will retry")
 | |
| 			time.Sleep(retryTime)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		return *resp.InstanceInfo.ESPrivateEndpoint, nil
 | |
| 	}
 | |
| }
 |