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  }