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
 | 
						|
	}
 | 
						|
}
 |