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 }