94 lines
2.5 KiB
Go
94 lines
2.5 KiB
Go
package cvm
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/hashicorp/packer/helper/multistep"
|
|
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
|
|
)
|
|
|
|
type stepConfigSubnet struct {
|
|
SubnetId string
|
|
SubnetCidrBlock string
|
|
SubnetName string
|
|
Zone string
|
|
isCreate bool
|
|
}
|
|
|
|
func (s *stepConfigSubnet) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction {
|
|
vpcClient := state.Get("vpc_client").(*vpc.Client)
|
|
|
|
vpcId := state.Get("vpc_id").(string)
|
|
|
|
if len(s.SubnetId) != 0 {
|
|
Say(state, s.SubnetId, "Trying to use existing subnet")
|
|
req := vpc.NewDescribeSubnetsRequest()
|
|
req.SubnetIds = []*string{&s.SubnetId}
|
|
var resp *vpc.DescribeSubnetsResponse
|
|
err := Retry(ctx, func(ctx context.Context) error {
|
|
var e error
|
|
resp, e = vpcClient.DescribeSubnets(req)
|
|
return e
|
|
})
|
|
if err != nil {
|
|
return Halt(state, err, "Failed to get subnet info")
|
|
}
|
|
if *resp.Response.TotalCount > 0 {
|
|
s.isCreate = false
|
|
if *resp.Response.SubnetSet[0].VpcId != vpcId {
|
|
return Halt(state, fmt.Errorf("The specified subnet(%s) does not belong to the specified vpc(%s)", s.SubnetId, vpcId), "")
|
|
}
|
|
state.Put("subnet_id", *resp.Response.SubnetSet[0].SubnetId)
|
|
Message(state, *resp.Response.SubnetSet[0].SubnetName, "Subnet found")
|
|
return multistep.ActionContinue
|
|
}
|
|
return Halt(state, fmt.Errorf("The specified subnet(%s) does not exist", s.SubnetId), "")
|
|
}
|
|
|
|
Say(state, "Trying to create a new subnet", "")
|
|
|
|
req := vpc.NewCreateSubnetRequest()
|
|
req.VpcId = &vpcId
|
|
req.SubnetName = &s.SubnetName
|
|
req.CidrBlock = &s.SubnetCidrBlock
|
|
req.Zone = &s.Zone
|
|
var resp *vpc.CreateSubnetResponse
|
|
err := Retry(ctx, func(ctx context.Context) error {
|
|
var e error
|
|
resp, e = vpcClient.CreateSubnet(req)
|
|
return e
|
|
})
|
|
if err != nil {
|
|
return Halt(state, err, "Failed to create subnet")
|
|
}
|
|
|
|
s.isCreate = true
|
|
s.SubnetId = *resp.Response.Subnet.SubnetId
|
|
state.Put("subnet_id", s.SubnetId)
|
|
Message(state, s.SubnetId, "Subnet created")
|
|
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
func (s *stepConfigSubnet) Cleanup(state multistep.StateBag) {
|
|
if !s.isCreate {
|
|
return
|
|
}
|
|
|
|
ctx := context.TODO()
|
|
vpcClient := state.Get("vpc_client").(*vpc.Client)
|
|
|
|
SayClean(state, "subnet")
|
|
|
|
req := vpc.NewDeleteSubnetRequest()
|
|
req.SubnetId = &s.SubnetId
|
|
err := Retry(ctx, func(ctx context.Context) error {
|
|
_, e := vpcClient.DeleteSubnet(req)
|
|
return e
|
|
})
|
|
if err != nil {
|
|
Error(state, err, fmt.Sprintf("Failed to delete subnet(%s), please delete it manually", s.SubnetId))
|
|
}
|
|
}
|