github.phpd.cn/hashicorp/packer@v1.3.2/builder/cloudstack/step_create_security_group.go (about)

     1  package cloudstack
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"github.com/hashicorp/packer/common/uuid"
     8  	"github.com/hashicorp/packer/helper/multistep"
     9  	"github.com/hashicorp/packer/packer"
    10  	"github.com/xanzy/go-cloudstack/cloudstack"
    11  )
    12  
    13  type stepCreateSecurityGroup struct {
    14  	tempSG string
    15  }
    16  
    17  func (s *stepCreateSecurityGroup) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
    18  	client := state.Get("client").(*cloudstack.CloudStackClient)
    19  	config := state.Get("config").(*Config)
    20  	ui := state.Get("ui").(packer.Ui)
    21  
    22  	if len(config.SecurityGroups) > 0 {
    23  		state.Put("security_groups", config.SecurityGroups)
    24  		return multistep.ActionContinue
    25  	}
    26  
    27  	if !config.CreateSecurityGroup {
    28  		return multistep.ActionContinue
    29  	}
    30  
    31  	ui.Say("Creating temporary Security Group...")
    32  
    33  	p := client.SecurityGroup.NewCreateSecurityGroupParams(
    34  		fmt.Sprintf("packer-%s", uuid.TimeOrderedUUID()),
    35  	)
    36  	p.SetDescription("Temporary SG created by Packer")
    37  	if config.Project != "" {
    38  		p.SetProjectid(config.Project)
    39  	}
    40  
    41  	sg, err := client.SecurityGroup.CreateSecurityGroup(p)
    42  	if err != nil {
    43  		err := fmt.Errorf("Failed to create security group: %s", err)
    44  		state.Put("error", err)
    45  		ui.Error(err.Error())
    46  		return multistep.ActionHalt
    47  	}
    48  
    49  	s.tempSG = sg.Id
    50  	state.Put("security_groups", []string{sg.Id})
    51  
    52  	// Create Ingress rule
    53  	i := client.SecurityGroup.NewAuthorizeSecurityGroupIngressParams()
    54  	i.SetCidrlist(config.CIDRList)
    55  	i.SetProtocol("TCP")
    56  	i.SetSecuritygroupid(sg.Id)
    57  	i.SetStartport(config.Comm.Port())
    58  	i.SetEndport(config.Comm.Port())
    59  	if config.Project != "" {
    60  		i.SetProjectid(config.Project)
    61  	}
    62  
    63  	_, err = client.SecurityGroup.AuthorizeSecurityGroupIngress(i)
    64  	if err != nil {
    65  		err := fmt.Errorf("Failed to authorize security group ingress rule: %s", err)
    66  		state.Put("error", err)
    67  		ui.Error(err.Error())
    68  		return multistep.ActionHalt
    69  	}
    70  
    71  	return multistep.ActionContinue
    72  }
    73  
    74  // Cleanup any resources that may have been created during the Run phase.
    75  func (s *stepCreateSecurityGroup) Cleanup(state multistep.StateBag) {
    76  	client := state.Get("client").(*cloudstack.CloudStackClient)
    77  	config := state.Get("config").(*Config)
    78  	ui := state.Get("ui").(packer.Ui)
    79  
    80  	if s.tempSG == "" {
    81  		return
    82  	}
    83  
    84  	ui.Say(fmt.Sprintf("Cleanup temporary security group: %s ...", s.tempSG))
    85  	p := client.SecurityGroup.NewDeleteSecurityGroupParams()
    86  	p.SetId(s.tempSG)
    87  	if config.Project != "" {
    88  		p.SetProjectid(config.Project)
    89  	}
    90  
    91  	if _, err := client.SecurityGroup.DeleteSecurityGroup(p); err != nil {
    92  		ui.Error(err.Error())
    93  		ui.Error(fmt.Sprintf("Error deleting security group: %s. Please destroy it manually.\n", s.tempSG))
    94  	}
    95  }