175 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.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"
 | |
| 	"os"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/volcengine/volcengine-go-sdk/service/vedbm"
 | |
| 	"github.com/volcengine/volcengine-go-sdk/volcengine"
 | |
| )
 | |
| 
 | |
| func CreateMySQLInstance(vpcID, subnetID, zoneID, ts string) (string, error) {
 | |
| 	if os.Getenv("VE_MYSQL_INSTANCE_ID") != "" {
 | |
| 		return os.Getenv("VE_MYSQL_INSTANCE_ID"), nil
 | |
| 	}
 | |
| 	svc := vedbm.New(sess)
 | |
| 	reqTags := &vedbm.TagForCreateDBInstanceInput{
 | |
| 		Key:   volcengine.String("opencoze"),
 | |
| 		Value: volcengine.String("1"),
 | |
| 	}
 | |
| 
 | |
| 	createDBInstanceInput := &vedbm.CreateDBInstanceInput{
 | |
| 		ChargeType:           volcengine.String("PostPaid"),
 | |
| 		DBEngineVersion:      volcengine.String(mysqlDBEngineVersion),
 | |
| 		DBTimeZone:           volcengine.String("UTC +08:00"),
 | |
| 		InstanceName:         volcengine.String(mysqlDBName + "-" + ts),
 | |
| 		LowerCaseTableNames:  volcengine.String("1"),
 | |
| 		NodeNumber:           volcengine.Int32(2),
 | |
| 		NodeSpec:             volcengine.String(mysqlInstanceClass),
 | |
| 		Number:               volcengine.Int32(1),
 | |
| 		ProjectName:          volcengine.String(projectName),
 | |
| 		StorageChargeType:    volcengine.String("PostPaid"),
 | |
| 		SubnetId:             volcengine.String(subnetID),
 | |
| 		SuperAccountName:     volcengine.String(mysqlUserName),
 | |
| 		SuperAccountPassword: volcengine.String(mysqlUserPassword),
 | |
| 		Tags:                 []*vedbm.TagForCreateDBInstanceInput{reqTags},
 | |
| 		VpcId:                volcengine.String(vpcID),
 | |
| 		ZoneIds:              volcengine.String(zoneID),
 | |
| 	}
 | |
| 
 | |
| 	resp, err := svc.CreateDBInstance(createDBInstanceInput)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	if resp.InstanceId == nil {
 | |
| 		return "", errors.New("CreateDBInstance resp.InstanceId is nil")
 | |
| 	}
 | |
| 
 | |
| 	return *resp.InstanceId, nil
 | |
| }
 | |
| 
 | |
| func GetMySQLConnectAddress(mysqlInstanceID string) (string, string, error) {
 | |
| 	svc := vedbm.New(sess)
 | |
| 	describeDBInstanceDetailInput := &vedbm.DescribeDBInstanceDetailInput{
 | |
| 		InstanceId: volcengine.String(mysqlInstanceID),
 | |
| 	}
 | |
| 
 | |
| 	for {
 | |
| 		resp, err := svc.DescribeDBInstanceDetail(describeDBInstanceDetailInput)
 | |
| 		if resp.InstanceDetail != nil && resp.InstanceDetail.InstanceStatus != nil && *resp.InstanceDetail.InstanceStatus != "Running" {
 | |
| 			fmt.Printf("[MySQL] instance(%s) is %s, waiting for it to become ready... \n", mysqlInstanceID, *resp.InstanceDetail.InstanceStatus)
 | |
| 			time.Sleep(retryTime)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if resp.Metadata != nil && resp.Metadata.Error != nil &&
 | |
| 			resp.Metadata.Error.Code == "OperationDenied.UnsupportedOperation" {
 | |
| 			fmt.Printf("[MySQL] instance[%s] is creating, waiting for it to become ready... \n", mysqlInstanceID)
 | |
| 			time.Sleep(retryTime)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if err != nil {
 | |
| 			fmt.Printf("[MySQL] failed, err: %s \n", err)
 | |
| 			time.Sleep(retryTime)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if len(resp.Endpoints) == 0 {
 | |
| 			fmt.Printf("[MySQL] endpoints is empty, will try it later \n")
 | |
| 			time.Sleep(retryTime)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if len(resp.Endpoints[0].Addresses) == 0 {
 | |
| 			fmt.Printf("[MySQL] endpoints[0].Addresses is nil, will try it later \n")
 | |
| 			time.Sleep(retryTime)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		if resp.Endpoints[0].Addresses[0].Domain == nil || resp.Endpoints[0].Addresses[0].Port == nil {
 | |
| 			fmt.Printf("[MySQL] endpoints[0].Addresses[0].Domain or endpoints[0].Addresses[0].Port is nil, will try it later \n")
 | |
| 			time.Sleep(retryTime)
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		return *resp.Endpoints[0].Addresses[0].Domain, *resp.Endpoints[0].Addresses[0].Port, nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func CreateDB(mysqlInstanceID string) error {
 | |
| 	svc := vedbm.New(sess)
 | |
| 	createDatabaseInput := &vedbm.CreateDatabaseInput{
 | |
| 		CharacterSetName: volcengine.String("utf8mb4"),
 | |
| 		DBName:           volcengine.String(mysqlDBName),
 | |
| 		InstanceId:       volcengine.String(mysqlInstanceID),
 | |
| 	}
 | |
| 
 | |
| 	resp, err := svc.CreateDatabase(createDatabaseInput)
 | |
| 	if resp.Metadata != nil && resp.Metadata.Error != nil &&
 | |
| 		resp.Metadata.Error.Code == "InvalidDatabaseName.Duplicate" {
 | |
| 		return nil
 | |
| 	}
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("[MySQL] CreateDB failed, err: %w", err)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func CreateMySQLWhiteList(mysqlInstanceID, ts string) (string, error) {
 | |
| 	svc := vedbm.New(sess)
 | |
| 	createAllowListInput := &vedbm.CreateAllowListInput{
 | |
| 		AllowList:     volcengine.String("172.16.0.0/12"),
 | |
| 		AllowListName: volcengine.String("opencoze-mysql-" + ts),
 | |
| 		ProjectName:   volcengine.String(projectName),
 | |
| 	}
 | |
| 
 | |
| 	// Copy the code to run the example, please print the API return value yourself.
 | |
| 	resp, err := svc.CreateAllowList(createAllowListInput)
 | |
| 	if err != nil {
 | |
| 		return "", err
 | |
| 	}
 | |
| 
 | |
| 	if resp.AllowListId == nil {
 | |
| 		return "", errors.New("[MySQL] CreateAllowList resp.AllowListId is nil")
 | |
| 	}
 | |
| 
 | |
| 	return *resp.AllowListId, nil
 | |
| }
 | |
| 
 | |
| func AssociateMySQLWhiteList(mysqlInstanceID, whitelistID string) error {
 | |
| 	svc := vedbm.New(sess)
 | |
| 	associateAllowListInput := &vedbm.AssociateAllowListInput{
 | |
| 		AllowListIds: volcengine.StringSlice([]string{whitelistID}),
 | |
| 		InstanceIds:  volcengine.StringSlice([]string{mysqlInstanceID}),
 | |
| 	}
 | |
| 
 | |
| 	// Copy the code to run the example, please print the API return value yourself.
 | |
| 	_, err := svc.AssociateAllowList(associateAllowListInput)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 |