github.com/qiniu/go-sdk/v7@v7.27.0/examples/sandbox_lifecycle/main.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"log"
     7  	"os"
     8  	"time"
     9  
    10  	"github.com/qiniu/go-sdk/v7/sandbox"
    11  )
    12  
    13  func main() {
    14  	apiKey := os.Getenv("QINIU_API_KEY")
    15  	if apiKey == "" {
    16  		log.Fatal("请设置 QINIU_API_KEY 环境变量")
    17  	}
    18  
    19  	apiURL := os.Getenv("QINIU_SANDBOX_API_URL")
    20  
    21  	c, err := sandbox.NewClient(&sandbox.Config{
    22  		APIKey:   apiKey,
    23  		Endpoint: apiURL,
    24  	})
    25  	if err != nil {
    26  		log.Fatalf("创建客户端失败: %v", err)
    27  	}
    28  
    29  	ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
    30  	defer cancel()
    31  
    32  	// 1. 列出模板,选取第一个可用模板
    33  	templates, err := c.ListTemplates(ctx, nil)
    34  	if err != nil {
    35  		log.Fatalf("列出模板失败: %v", err)
    36  	}
    37  	if len(templates) == 0 {
    38  		log.Fatal("没有可用模板")
    39  	}
    40  
    41  	var templateID string
    42  	for _, tmpl := range templates {
    43  		if tmpl.BuildStatus == sandbox.BuildStatusReady || tmpl.BuildStatus == sandbox.BuildStatusUploaded {
    44  			templateID = tmpl.TemplateID
    45  			break
    46  		}
    47  	}
    48  	if templateID == "" {
    49  		log.Fatal("没有构建成功的模板")
    50  	}
    51  	fmt.Printf("使用模板: %s\n", templateID)
    52  
    53  	// 2. 创建沙箱并等待就绪
    54  	timeout := int32(120)
    55  	sb, info, err := c.CreateAndWait(ctx, sandbox.CreateParams{
    56  		TemplateID: templateID,
    57  		Timeout:    &timeout,
    58  	}, sandbox.WithPollInterval(2*time.Second))
    59  	if err != nil {
    60  		log.Fatalf("创建沙箱失败: %v", err)
    61  	}
    62  	fmt.Printf("沙箱已就绪: %s (状态: %s)\n", sb.ID(), info.State)
    63  
    64  	// 3. 沙箱详情(直接使用 CreateAndWait 返回的 info)
    65  	fmt.Printf("CPU: %d 核, 内存: %d MB\n", info.CPUCount, info.MemoryMB)
    66  
    67  	// 4. 检查运行状态
    68  	running, err := sb.IsRunning(ctx)
    69  	if err != nil {
    70  		log.Fatalf("检查状态失败: %v", err)
    71  	}
    72  	fmt.Printf("是否运行中: %v\n", running)
    73  
    74  	// 5. 更新超时时间
    75  	if err := sb.SetTimeout(ctx, 5*time.Minute); err != nil {
    76  		log.Fatalf("更新超时失败: %v", err)
    77  	}
    78  	fmt.Println("超时时间已更新为 5 分钟")
    79  
    80  	// 6. 延长存活时间(Refresh)
    81  	duration := 300
    82  	if err := sb.Refresh(ctx, sandbox.RefreshParams{
    83  		Duration: &duration,
    84  	}); err != nil {
    85  		log.Fatalf("Refresh 失败: %v", err)
    86  	}
    87  	fmt.Println("沙箱存活时间已延长 300 秒")
    88  
    89  	// 7. 终止沙箱
    90  	if err := sb.Kill(ctx); err != nil {
    91  		log.Fatalf("终止沙箱失败: %v", err)
    92  	}
    93  	fmt.Printf("沙箱 %s 已终止\n", sb.ID())
    94  }