package cvm import ( "context" "fmt" "github.com/hashicorp/packer/helper/multistep" vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312" ) type stepConfigVPC struct { VpcId string CidrBlock string VpcName string isCreate bool } func (s *stepConfigVPC) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction { vpcClient := state.Get("vpc_client").(*vpc.Client) if len(s.VpcId) != 0 { Say(state, s.VpcId, "Trying to use existing vpc") req := vpc.NewDescribeVpcsRequest() req.VpcIds = []*string{&s.VpcId} var resp *vpc.DescribeVpcsResponse err := Retry(ctx, func(ctx context.Context) error { var e error resp, e = vpcClient.DescribeVpcs(req) return e }) if err != nil { return Halt(state, err, "Failed to get vpc info") } if *resp.Response.TotalCount > 0 { s.isCreate = false state.Put("vpc_id", *resp.Response.VpcSet[0].VpcId) Message(state, *resp.Response.VpcSet[0].VpcName, "Vpc found") return multistep.ActionContinue } return Halt(state, fmt.Errorf("The specified vpc(%s) does not exist", s.VpcId), "") } Say(state, "Trying to create a new vpc", "") req := vpc.NewCreateVpcRequest() req.VpcName = &s.VpcName req.CidrBlock = &s.CidrBlock var resp *vpc.CreateVpcResponse err := Retry(ctx, func(ctx context.Context) error { var e error resp, e = vpcClient.CreateVpc(req) return e }) if err != nil { return Halt(state, err, "Failed to create vpc") } s.isCreate = true s.VpcId = *resp.Response.Vpc.VpcId state.Put("vpc_id", s.VpcId) Message(state, s.VpcId, "Vpc created") return multistep.ActionContinue } func (s *stepConfigVPC) Cleanup(state multistep.StateBag) { if !s.isCreate { return } ctx := context.TODO() vpcClient := state.Get("vpc_client").(*vpc.Client) SayClean(state, "vpc") req := vpc.NewDeleteVpcRequest() req.VpcId = &s.VpcId err := Retry(ctx, func(ctx context.Context) error { _, e := vpcClient.DeleteVpc(req) return e }) if err != nil { Error(state, err, fmt.Sprintf("Failed to delete vpc(%s), please delete it manually", s.VpcId)) } }