github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/builder/cloudstack/step_create_security_group.go (about)

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