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 }