2014-12-10 15:56:28 +01:00
package openstack
import (
"fmt"
"io/ioutil"
"strings"
2014-12-14 22:38:25 +01:00
"time"
2014-12-10 15:56:28 +01:00
2014-12-13 03:28:54 +01:00
"github.com/codegangsta/cli"
2014-12-10 15:56:28 +01:00
"github.com/docker/machine/drivers"
2015-04-06 18:55:29 -07:00
"github.com/docker/machine/log"
2014-12-10 15:56:28 +01:00
"github.com/docker/machine/ssh"
"github.com/docker/machine/state"
2015-04-06 18:55:29 -07:00
"github.com/docker/machine/utils"
2014-12-10 15:56:28 +01:00
)
type Driver struct {
2015-05-27 14:12:36 -04:00
* drivers . BaseDriver
2015-02-23 14:49:28 -05:00
AuthUrl string
2015-08-03 20:32:32 +02:00
ActiveTimeout int
2015-02-19 11:15:24 -05:00
Insecure bool
2015-04-09 17:40:21 +02:00
DomainID string
DomainName string
2015-02-23 14:49:28 -05:00
Username string
Password string
TenantName string
TenantId string
Region string
2015-06-05 17:31:09 -07:00
AvailabilityZone string
2015-02-23 14:49:28 -05:00
EndpointType string
MachineId string
FlavorName string
FlavorId string
ImageName string
ImageId string
KeyPairName string
NetworkName string
NetworkId string
SecurityGroups [ ] string
FloatingIpPool string
FloatingIpPoolId string
client Client
2014-12-10 15:56:28 +01:00
}
func init ( ) {
drivers . Register ( "openstack" , & drivers . RegisteredDriver {
2014-12-13 03:28:54 +01:00
New : NewDriver ,
GetCreateFlags : GetCreateFlags ,
2014-12-10 15:56:28 +01:00
} )
}
2014-12-13 03:28:54 +01:00
func GetCreateFlags ( ) [ ] cli . Flag {
return [ ] cli . Flag {
cli . StringFlag {
EnvVar : "OS_AUTH_URL" ,
Name : "openstack-auth-url" ,
Usage : "OpenStack authentication URL" ,
Value : "" ,
} ,
2015-02-19 11:15:24 -05:00
cli . BoolFlag {
Name : "openstack-insecure" ,
Usage : "Disable TLS credential checking." ,
} ,
2015-04-09 17:40:21 +02:00
cli . StringFlag {
EnvVar : "OS_DOMAIN_ID" ,
Name : "openstack-domain-id" ,
Usage : "OpenStack domain ID (identity v3 only)" ,
Value : "" ,
} ,
cli . StringFlag {
EnvVar : "OS_DOMAIN_NAME" ,
Name : "openstack-domain-name" ,
Usage : "OpenStack domain name (identity v3 only)" ,
Value : "" ,
} ,
2014-12-13 03:28:54 +01:00
cli . StringFlag {
EnvVar : "OS_USERNAME" ,
Name : "openstack-username" ,
Usage : "OpenStack username" ,
Value : "" ,
} ,
cli . StringFlag {
EnvVar : "OS_PASSWORD" ,
Name : "openstack-password" ,
Usage : "OpenStack password" ,
Value : "" ,
} ,
cli . StringFlag {
EnvVar : "OS_TENANT_NAME" ,
Name : "openstack-tenant-name" ,
Usage : "OpenStack tenant name" ,
Value : "" ,
} ,
cli . StringFlag {
EnvVar : "OS_TENANT_ID" ,
Name : "openstack-tenant-id" ,
Usage : "OpenStack tenant id" ,
Value : "" ,
} ,
cli . StringFlag {
EnvVar : "OS_REGION_NAME" ,
Name : "openstack-region" ,
Usage : "OpenStack region name" ,
Value : "" ,
} ,
2015-06-05 17:31:09 -07:00
cli . StringFlag {
EnvVar : "OS_AVAILABILITY_ZONE" ,
Name : "openstack-availability-zone" ,
Usage : "OpenStack availability zone" ,
Value : "" ,
} ,
2014-12-13 03:28:54 +01:00
cli . StringFlag {
EnvVar : "OS_ENDPOINT_TYPE" ,
Name : "openstack-endpoint-type" ,
Usage : "OpenStack endpoint type (adminURL, internalURL or publicURL)" ,
Value : "" ,
} ,
cli . StringFlag {
Name : "openstack-flavor-id" ,
Usage : "OpenStack flavor id to use for the instance" ,
Value : "" ,
} ,
cli . StringFlag {
Name : "openstack-flavor-name" ,
Usage : "OpenStack flavor name to use for the instance" ,
Value : "" ,
} ,
cli . StringFlag {
Name : "openstack-image-id" ,
Usage : "OpenStack image id to use for the instance" ,
Value : "" ,
} ,
cli . StringFlag {
Name : "openstack-image-name" ,
Usage : "OpenStack image name to use for the instance" ,
Value : "" ,
} ,
cli . StringFlag {
Name : "openstack-net-id" ,
2015-03-05 20:05:09 -05:00
Usage : "OpenStack network id the machine will be connected on" ,
2014-12-13 03:28:54 +01:00
Value : "" ,
} ,
cli . StringFlag {
Name : "openstack-net-name" ,
Usage : "OpenStack network name the machine will be connected on" ,
Value : "" ,
} ,
cli . StringFlag {
Name : "openstack-sec-groups" ,
Usage : "OpenStack comma separated security groups for the machine" ,
Value : "" ,
} ,
cli . StringFlag {
Name : "openstack-floatingip-pool" ,
Usage : "OpenStack floating IP pool to get an IP from to assign to the instance" ,
Value : "" ,
} ,
cli . StringFlag {
Name : "openstack-ssh-user" ,
Usage : "OpenStack SSH user" ,
Value : "root" ,
} ,
cli . IntFlag {
Name : "openstack-ssh-port" ,
Usage : "OpenStack SSH port" ,
Value : 22 ,
} ,
2015-08-03 20:32:32 +02:00
cli . IntFlag {
Name : "openstack-active-timeout" ,
Usage : "OpenStack active timeout" ,
Value : 200 ,
} ,
2014-12-13 03:28:54 +01:00
}
2014-12-10 15:56:28 +01:00
}
2015-01-15 10:36:29 -05:00
func NewDriver ( machineName string , storePath string , caCert string , privateKey string ) ( drivers . Driver , error ) {
2014-12-11 14:34:30 -05:00
log . WithFields ( log . Fields {
2015-01-14 23:08:00 +01:00
"machineName" : machineName ,
"storePath" : storePath ,
2015-01-15 10:36:29 -05:00
"caCert" : caCert ,
"privateKey" : privateKey ,
2014-12-11 14:34:30 -05:00
} ) . Debug ( "Instantiating OpenStack driver..." )
2015-01-15 10:36:29 -05:00
return NewDerivedDriver ( machineName , storePath , & GenericClient { } , caCert , privateKey )
2014-12-11 10:14:49 -05:00
}
2015-01-15 10:36:29 -05:00
func NewDerivedDriver ( machineName string , storePath string , client Client , caCert string , privateKey string ) ( * Driver , error ) {
2015-05-27 14:12:36 -04:00
inner := drivers . NewBaseDriver ( machineName , storePath , caCert , privateKey )
return & Driver { BaseDriver : inner , client : client } , nil
2015-03-09 23:27:17 -04:00
}
func ( d * Driver ) GetSSHHostname ( ) ( string , error ) {
return d . GetIP ( )
}
2014-12-10 15:56:28 +01:00
func ( d * Driver ) DriverName ( ) string {
return "openstack"
}
2014-12-13 03:28:54 +01:00
func ( d * Driver ) SetConfigFromFlags ( flags drivers . DriverOptions ) error {
d . AuthUrl = flags . String ( "openstack-auth-url" )
2015-08-03 20:32:32 +02:00
d . ActiveTimeout = flags . Int ( "openstack-active-timeout" )
2015-02-19 11:15:24 -05:00
d . Insecure = flags . Bool ( "openstack-insecure" )
2015-04-09 17:40:21 +02:00
d . DomainID = flags . String ( "openstack-domain-id" )
d . DomainName = flags . String ( "openstack-domain-name" )
2014-12-13 03:28:54 +01:00
d . Username = flags . String ( "openstack-username" )
d . Password = flags . String ( "openstack-password" )
d . TenantName = flags . String ( "openstack-tenant-name" )
d . TenantId = flags . String ( "openstack-tenant-id" )
d . Region = flags . String ( "openstack-region" )
2015-06-05 17:31:09 -07:00
d . AvailabilityZone = flags . String ( "openstack-availability-zone" )
2014-12-13 03:28:54 +01:00
d . EndpointType = flags . String ( "openstack-endpoint-type" )
d . FlavorId = flags . String ( "openstack-flavor-id" )
d . FlavorName = flags . String ( "openstack-flavor-name" )
d . ImageId = flags . String ( "openstack-image-id" )
d . ImageName = flags . String ( "openstack-image-name" )
d . NetworkId = flags . String ( "openstack-net-id" )
d . NetworkName = flags . String ( "openstack-net-name" )
if flags . String ( "openstack-sec-groups" ) != "" {
d . SecurityGroups = strings . Split ( flags . String ( "openstack-sec-groups" ) , "," )
2014-12-10 15:56:28 +01:00
}
2014-12-13 03:28:54 +01:00
d . FloatingIpPool = flags . String ( "openstack-floatingip-pool" )
d . SSHUser = flags . String ( "openstack-ssh-user" )
d . SSHPort = flags . Int ( "openstack-ssh-port" )
2015-01-28 14:28:21 -05:00
d . SwarmMaster = flags . Bool ( "swarm-master" )
d . SwarmHost = flags . String ( "swarm-host" )
2015-02-19 00:15:11 -08:00
d . SwarmDiscovery = flags . String ( "swarm-discovery" )
2014-12-15 02:34:41 +01:00
2014-12-10 15:56:28 +01:00
return d . checkConfig ( )
}
func ( d * Driver ) GetURL ( ) ( string , error ) {
ip , err := d . GetIP ( )
if err != nil {
return "" , err
}
if ip == "" {
return "" , nil
}
return fmt . Sprintf ( "tcp://%s:2376" , ip ) , nil
}
func ( d * Driver ) GetIP ( ) ( string , error ) {
2015-04-21 21:39:06 -04:00
if d . IPAddress != "" {
return d . IPAddress , nil
2014-12-11 13:46:58 -05:00
}
2014-12-14 22:38:25 +01:00
log . WithField ( "MachineId" , d . MachineId ) . Debug ( "Looking for the IP address..." )
if err := d . initCompute ( ) ; err != nil {
2014-12-10 15:56:28 +01:00
return "" , err
}
2014-12-14 22:38:25 +01:00
addressType := Fixed
if d . FloatingIpPool != "" {
addressType = Floating
}
2014-12-10 15:56:28 +01:00
2014-12-14 22:38:25 +01:00
// Looking for the IP address in a retry loop to deal with OpenStack latency
for retryCount := 0 ; retryCount < 200 ; retryCount ++ {
addresses , err := d . client . GetInstanceIpAddresses ( d )
if err != nil {
return "" , err
2014-12-10 15:56:28 +01:00
}
2014-12-14 22:38:25 +01:00
for _ , a := range addresses {
if a . AddressType == addressType {
return a . Address , nil
}
2014-12-10 15:56:28 +01:00
}
2014-12-14 22:38:25 +01:00
time . Sleep ( 2 * time . Second )
2014-12-10 15:56:28 +01:00
}
return "" , fmt . Errorf ( "No IP found for the machine" )
}
func ( d * Driver ) GetState ( ) ( state . State , error ) {
2014-12-11 10:36:50 +01:00
log . WithField ( "MachineId" , d . MachineId ) . Debug ( "Get status for OpenStack instance..." )
2014-12-11 13:46:58 -05:00
if err := d . initCompute ( ) ; err != nil {
return state . None , err
}
2014-12-10 15:56:28 +01:00
s , err := d . client . GetInstanceState ( d )
if err != nil {
return state . None , err
}
log . WithFields ( log . Fields {
"MachineId" : d . MachineId ,
"State" : s ,
2014-12-11 10:36:50 +01:00
} ) . Debug ( "State for OpenStack instance" )
2014-12-10 15:56:28 +01:00
switch s {
case "ACTIVE" :
return state . Running , nil
case "PAUSED" :
return state . Paused , nil
case "SUSPENDED" :
return state . Saved , nil
case "SHUTOFF" :
return state . Stopped , nil
case "BUILDING" :
return state . Starting , nil
case "ERROR" :
return state . Error , nil
}
return state . None , nil
}
2015-01-23 20:21:59 -05:00
func ( d * Driver ) PreCreateCheck ( ) error {
return nil
}
2014-12-10 15:56:28 +01:00
func ( d * Driver ) Create ( ) error {
2015-01-14 23:08:00 +01:00
d . KeyPairName = fmt . Sprintf ( "%s-%s" , d . MachineName , utils . GenerateRandomID ( ) )
2014-12-10 15:56:28 +01:00
2014-12-11 17:37:23 +01:00
if err := d . resolveIds ( ) ; err != nil {
return err
}
2014-12-10 15:56:28 +01:00
if err := d . createSSHKey ( ) ; err != nil {
return err
}
if err := d . createMachine ( ) ; err != nil {
return err
}
2014-12-14 22:38:25 +01:00
if err := d . waitForInstanceActive ( ) ; err != nil {
return err
}
if d . FloatingIpPool != "" {
if err := d . assignFloatingIp ( ) ; err != nil {
return err
}
}
if err := d . lookForIpAddress ( ) ; err != nil {
return err
}
2014-12-10 15:56:28 +01:00
return nil
}
func ( d * Driver ) Start ( ) error {
log . WithField ( "MachineId" , d . MachineId ) . Info ( "Starting OpenStack instance..." )
2014-12-11 13:46:58 -05:00
if err := d . initCompute ( ) ; err != nil {
return err
}
2014-12-10 15:56:28 +01:00
if err := d . client . StartInstance ( d ) ; err != nil {
return err
}
2015-04-11 08:09:10 +02:00
return nil
2014-12-10 15:56:28 +01:00
}
func ( d * Driver ) Stop ( ) error {
log . WithField ( "MachineId" , d . MachineId ) . Info ( "Stopping OpenStack instance..." )
2014-12-11 13:46:58 -05:00
if err := d . initCompute ( ) ; err != nil {
return err
}
2014-12-10 15:56:28 +01:00
if err := d . client . StopInstance ( d ) ; err != nil {
return err
}
return nil
}
func ( d * Driver ) Remove ( ) error {
2015-02-24 11:02:49 -05:00
log . WithField ( "MachineId" , d . MachineId ) . Debug ( "deleting instance..." )
log . Info ( "Deleting OpenStack instance..." )
2014-12-11 13:46:58 -05:00
if err := d . initCompute ( ) ; err != nil {
return err
}
2014-12-10 15:56:28 +01:00
if err := d . client . DeleteInstance ( d ) ; err != nil {
return err
}
2015-02-24 11:02:49 -05:00
log . WithField ( "Name" , d . KeyPairName ) . Debug ( "deleting key pair..." )
2014-12-10 15:56:28 +01:00
if err := d . client . DeleteKeyPair ( d , d . KeyPairName ) ; err != nil {
return err
}
return nil
}
func ( d * Driver ) Restart ( ) error {
log . WithField ( "MachineId" , d . MachineId ) . Info ( "Restarting OpenStack instance..." )
2014-12-11 13:46:58 -05:00
if err := d . initCompute ( ) ; err != nil {
return err
}
2014-12-10 15:56:28 +01:00
if err := d . client . RestartInstance ( d ) ; err != nil {
return err
}
2015-04-11 08:09:10 +02:00
return nil
2014-12-10 15:56:28 +01:00
}
func ( d * Driver ) Kill ( ) error {
return d . Stop ( )
}
const (
errorMandatoryEnvOrOption string = "%s must be specified either using the environment variable %s or the CLI option %s"
errorMandatoryOption string = "%s must be specified using the CLI option %s"
2014-12-11 17:37:23 +01:00
errorExclusiveOptions string = "Either %s or %s must be specified, not both"
2014-12-10 15:56:28 +01:00
errorMandatoryTenantNameOrId string = "Tenant id or name must be provided either using one of the environment variables OS_TENANT_ID and OS_TENANT_NAME or one of the CLI options --openstack-tenant-id and --openstack-tenant-name"
errorWrongEndpointType string = "Endpoint type must be 'publicURL', 'adminURL' or 'internalURL'"
2014-12-11 17:37:23 +01:00
errorUnknownFlavorName string = "Unable to find flavor named %s"
errorUnknownImageName string = "Unable to find image named %s"
errorUnknownNetworkName string = "Unable to find network named %s"
2014-12-10 15:56:28 +01:00
)
func ( d * Driver ) checkConfig ( ) error {
if d . AuthUrl == "" {
2015-03-23 18:31:34 -05:00
return fmt . Errorf ( errorMandatoryEnvOrOption , "Authentication URL" , "OS_AUTH_URL" , "--openstack-auth-url" )
2014-12-10 15:56:28 +01:00
}
if d . Username == "" {
return fmt . Errorf ( errorMandatoryEnvOrOption , "Username" , "OS_USERNAME" , "--openstack-username" )
}
if d . Password == "" {
return fmt . Errorf ( errorMandatoryEnvOrOption , "Password" , "OS_PASSWORD" , "--openstack-password" )
}
if d . TenantName == "" && d . TenantId == "" {
return fmt . Errorf ( errorMandatoryTenantNameOrId )
}
2014-12-11 17:37:23 +01:00
if d . FlavorName == "" && d . FlavorId == "" {
return fmt . Errorf ( errorMandatoryOption , "Flavor name or Flavor id" , "--openstack-flavor-name or --openstack-flavor-id" )
2014-12-10 15:56:28 +01:00
}
2014-12-11 17:37:23 +01:00
if d . FlavorName != "" && d . FlavorId != "" {
return fmt . Errorf ( errorExclusiveOptions , "Flavor name" , "Flavor id" )
2014-12-10 15:56:28 +01:00
}
2014-12-11 17:37:23 +01:00
if d . ImageName == "" && d . ImageId == "" {
return fmt . Errorf ( errorMandatoryOption , "Image name or Image id" , "--openstack-image-name or --openstack-image-id" )
}
if d . ImageName != "" && d . ImageId != "" {
return fmt . Errorf ( errorExclusiveOptions , "Image name" , "Image id" )
}
if d . NetworkName != "" && d . NetworkId != "" {
return fmt . Errorf ( errorExclusiveOptions , "Network name" , "Network id" )
}
2014-12-11 14:34:30 -05:00
if d . EndpointType != "" && ( d . EndpointType != "publicURL" && d . EndpointType != "adminURL" && d . EndpointType != "internalURL" ) {
2014-12-10 15:56:28 +01:00
return fmt . Errorf ( errorWrongEndpointType )
}
return nil
}
2014-12-11 17:37:23 +01:00
func ( d * Driver ) resolveIds ( ) error {
if d . NetworkName != "" {
2014-12-12 10:00:40 -05:00
if err := d . initNetwork ( ) ; err != nil {
return err
}
2014-12-14 22:38:25 +01:00
networkId , err := d . client . GetNetworkId ( d )
2014-12-11 17:37:23 +01:00
if err != nil {
return err
}
if networkId == "" {
return fmt . Errorf ( errorUnknownNetworkName , d . NetworkName )
}
d . NetworkId = networkId
log . WithFields ( log . Fields {
"Name" : d . NetworkName ,
"ID" : d . NetworkId ,
} ) . Debug ( "Found network id using its name" )
}
if d . FlavorName != "" {
2014-12-12 10:00:40 -05:00
if err := d . initCompute ( ) ; err != nil {
return err
}
2014-12-14 22:38:25 +01:00
flavorId , err := d . client . GetFlavorId ( d )
2014-12-11 17:37:23 +01:00
if err != nil {
return err
}
if flavorId == "" {
return fmt . Errorf ( errorUnknownFlavorName , d . FlavorName )
}
d . FlavorId = flavorId
log . WithFields ( log . Fields {
"Name" : d . FlavorName ,
"ID" : d . FlavorId ,
} ) . Debug ( "Found flavor id using its name" )
}
if d . ImageName != "" {
2014-12-12 10:00:40 -05:00
if err := d . initCompute ( ) ; err != nil {
return err
}
2014-12-14 22:38:25 +01:00
imageId , err := d . client . GetImageId ( d )
2014-12-11 17:37:23 +01:00
if err != nil {
return err
}
if imageId == "" {
return fmt . Errorf ( errorUnknownImageName , d . ImageName )
}
d . ImageId = imageId
log . WithFields ( log . Fields {
"Name" : d . ImageName ,
"ID" : d . ImageId ,
} ) . Debug ( "Found image id using its name" )
}
2014-12-14 22:38:25 +01:00
if d . FloatingIpPool != "" {
if err := d . initNetwork ( ) ; err != nil {
return err
}
f , err := d . client . GetFloatingIpPoolId ( d )
if err != nil {
return err
}
if f == "" {
return fmt . Errorf ( errorUnknownNetworkName , d . FloatingIpPool )
}
d . FloatingIpPoolId = f
log . WithFields ( log . Fields {
"Name" : d . FloatingIpPool ,
"ID" : d . FloatingIpPoolId ,
} ) . Debug ( "Found floating IP pool id using its name" )
}
2014-12-12 10:00:40 -05:00
return nil
}
2014-12-11 13:46:58 -05:00
func ( d * Driver ) initCompute ( ) error {
if err := d . client . Authenticate ( d ) ; err != nil {
return err
}
if err := d . client . InitComputeClient ( d ) ; err != nil {
return err
}
return nil
}
func ( d * Driver ) initNetwork ( ) error {
if err := d . client . Authenticate ( d ) ; err != nil {
return err
}
if err := d . client . InitNetworkClient ( d ) ; err != nil {
return err
}
2014-12-11 17:37:23 +01:00
return nil
}
2014-12-10 15:56:28 +01:00
func ( d * Driver ) createSSHKey ( ) error {
2014-12-11 10:36:50 +01:00
log . WithField ( "Name" , d . KeyPairName ) . Debug ( "Creating Key Pair..." )
2015-03-09 23:29:52 -04:00
if err := ssh . GenerateSSHKey ( d . GetSSHKeyPath ( ) ) ; err != nil {
2014-12-10 15:56:28 +01:00
return err
}
publicKey , err := ioutil . ReadFile ( d . publicSSHKeyPath ( ) )
if err != nil {
return err
}
2014-12-11 13:46:58 -05:00
if err := d . initCompute ( ) ; err != nil {
return err
}
2014-12-10 15:56:28 +01:00
if err := d . client . CreateKeyPair ( d , d . KeyPairName , string ( publicKey ) ) ; err != nil {
return err
}
return nil
}
func ( d * Driver ) createMachine ( ) error {
log . WithFields ( log . Fields {
"FlavorId" : d . FlavorId ,
"ImageId" : d . ImageId ,
2014-12-11 10:36:50 +01:00
} ) . Debug ( "Creating OpenStack instance..." )
2014-12-11 13:46:58 -05:00
if err := d . initCompute ( ) ; err != nil {
return err
}
2014-12-10 15:56:28 +01:00
instanceId , err := d . client . CreateInstance ( d )
if err != nil {
return err
}
d . MachineId = instanceId
return nil
}
2014-12-14 22:38:25 +01:00
func ( d * Driver ) assignFloatingIp ( ) error {
if err := d . initNetwork ( ) ; err != nil {
return err
}
portId , err := d . client . GetInstancePortId ( d )
if err != nil {
return err
}
ips , err := d . client . GetFloatingIPs ( d )
if err != nil {
return err
}
var floatingIp * FloatingIp
log . WithFields ( log . Fields {
"MachineId" : d . MachineId ,
"Pool" : d . FloatingIpPool ,
} ) . Debugf ( "Looking for an available floating IP" )
for _ , ip := range ips {
if ip . PortId == "" {
log . WithFields ( log . Fields {
"MachineId" : d . MachineId ,
"IP" : ip . Ip ,
} ) . Debugf ( "Available floating IP found" )
floatingIp = & ip
break
}
}
if floatingIp == nil {
floatingIp = & FloatingIp { }
log . WithField ( "MachineId" , d . MachineId ) . Debugf ( "No available floating IP found. Allocating a new one..." )
} else {
log . WithField ( "MachineId" , d . MachineId ) . Debugf ( "Assigning floating IP to the instance" )
}
if err := d . client . AssignFloatingIP ( d , floatingIp , portId ) ; err != nil {
return err
}
2015-04-21 21:39:06 -04:00
d . IPAddress = floatingIp . Ip
2014-12-14 22:38:25 +01:00
return nil
}
func ( d * Driver ) waitForInstanceActive ( ) error {
log . WithField ( "MachineId" , d . MachineId ) . Debug ( "Waiting for the OpenStack instance to be ACTIVE..." )
2015-06-01 00:41:41 +02:00
if err := d . client . WaitForInstanceStatus ( d , "ACTIVE" ) ; err != nil {
2014-12-10 15:56:28 +01:00
return err
}
2014-12-14 22:38:25 +01:00
return nil
}
func ( d * Driver ) lookForIpAddress ( ) error {
2014-12-10 15:56:28 +01:00
ip , err := d . GetIP ( )
if err != nil {
return err
}
2015-04-21 21:39:06 -04:00
d . IPAddress = ip
2014-12-14 22:38:25 +01:00
log . WithFields ( log . Fields {
"IP" : ip ,
"MachineId" : d . MachineId ,
} ) . Debug ( "IP address found" )
return nil
}
2014-12-10 15:56:28 +01:00
func ( d * Driver ) publicSSHKeyPath ( ) string {
2015-03-09 23:29:52 -04:00
return d . GetSSHKeyPath ( ) + ".pub"
2014-12-10 15:56:28 +01:00
}