github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/builder/azure/arm/step_get_ip_address.go (about) 1 package arm 2 3 import ( 4 "fmt" 5 6 "github.com/hashicorp/packer/builder/azure/common/constants" 7 "github.com/hashicorp/packer/packer" 8 "github.com/mitchellh/multistep" 9 ) 10 11 type EndpointType int 12 13 const ( 14 PublicEndpoint EndpointType = iota 15 PrivateEndpoint 16 PublicEndpointInPrivateNetwork 17 ) 18 19 var ( 20 EndpointCommunicationText = map[EndpointType]string{ 21 PublicEndpoint: "PublicEndpoint", 22 PrivateEndpoint: "PrivateEndpoint", 23 PublicEndpointInPrivateNetwork: "PublicEndpointInPrivateNetwork", 24 } 25 ) 26 27 type StepGetIPAddress struct { 28 client *AzureClient 29 endpoint EndpointType 30 get func(resourceGroupName string, ipAddressName string, interfaceName string) (string, error) 31 say func(message string) 32 error func(e error) 33 } 34 35 func NewStepGetIPAddress(client *AzureClient, ui packer.Ui, endpoint EndpointType) *StepGetIPAddress { 36 var step = &StepGetIPAddress{ 37 client: client, 38 endpoint: endpoint, 39 say: func(message string) { ui.Say(message) }, 40 error: func(e error) { ui.Error(e.Error()) }, 41 } 42 43 switch endpoint { 44 case PrivateEndpoint: 45 step.get = step.getPrivateIP 46 case PublicEndpoint: 47 step.get = step.getPublicIP 48 case PublicEndpointInPrivateNetwork: 49 step.get = step.getPublicIPInPrivateNetwork 50 } 51 52 return step 53 } 54 55 func (s *StepGetIPAddress) getPrivateIP(resourceGroupName string, ipAddressName string, interfaceName string) (string, error) { 56 resp, err := s.client.InterfacesClient.Get(resourceGroupName, interfaceName, "") 57 if err != nil { 58 s.say(s.client.LastError.Error()) 59 return "", err 60 } 61 62 return *(*resp.IPConfigurations)[0].PrivateIPAddress, nil 63 } 64 65 func (s *StepGetIPAddress) getPublicIP(resourceGroupName string, ipAddressName string, interfaceName string) (string, error) { 66 resp, err := s.client.PublicIPAddressesClient.Get(resourceGroupName, ipAddressName, "") 67 if err != nil { 68 return "", err 69 } 70 71 return *resp.IPAddress, nil 72 } 73 74 func (s *StepGetIPAddress) getPublicIPInPrivateNetwork(resourceGroupName string, ipAddressName string, interfaceName string) (string, error) { 75 s.getPrivateIP(resourceGroupName, ipAddressName, interfaceName) 76 return s.getPublicIP(resourceGroupName, ipAddressName, interfaceName) 77 } 78 79 func (s *StepGetIPAddress) Run(state multistep.StateBag) multistep.StepAction { 80 s.say("Getting the VM's IP address ...") 81 82 var resourceGroupName = state.Get(constants.ArmResourceGroupName).(string) 83 var ipAddressName = state.Get(constants.ArmPublicIPAddressName).(string) 84 var nicName = state.Get(constants.ArmNicName).(string) 85 86 s.say(fmt.Sprintf(" -> ResourceGroupName : '%s'", resourceGroupName)) 87 s.say(fmt.Sprintf(" -> PublicIPAddressName : '%s'", ipAddressName)) 88 s.say(fmt.Sprintf(" -> NicName : '%s'", nicName)) 89 s.say(fmt.Sprintf(" -> Network Connection : '%s'", EndpointCommunicationText[s.endpoint])) 90 91 address, err := s.get(resourceGroupName, ipAddressName, nicName) 92 if err != nil { 93 state.Put(constants.Error, err) 94 s.error(err) 95 96 return multistep.ActionHalt 97 } 98 99 state.Put(constants.SSHHost, address) 100 s.say(fmt.Sprintf(" -> IP Address : '%s'", address)) 101 102 return multistep.ActionContinue 103 } 104 105 func (*StepGetIPAddress) Cleanup(multistep.StateBag) { 106 }