From a757af026491561f4c039e8151c0c69200790dd6 Mon Sep 17 00:00:00 2001
From: daniel-sc <daniel-schreiber@gmx.de>
Date: Sat, 10 Oct 2015 13:33:44 +0200
Subject: [PATCH 1/2] Allowing to specify specific external ip for gce
 instances

---
 cloud/google/gce.py | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/cloud/google/gce.py b/cloud/google/gce.py
index 39032ca81b6..9746d303caa 100644
--- a/cloud/google/gce.py
+++ b/cloud/google/gce.py
@@ -136,7 +136,7 @@ options:
   external_ip:
     version_added: "1.9"
     description:
-      - type of external ip, ephemeral by default
+      - type of external ip, ephemeral by default; alternatively, a list of fixed gce ip names can be given (if there is not enough specified ip, 'ephemeral' will be used)
     required: false
     default: "ephemeral"
   disk_auto_delete:
@@ -189,7 +189,7 @@ EXAMPLES = '''
   tasks:
     - name: Launch instances
       local_action: gce instance_names={{names}} machine_type={{machine_type}}
-                    image={{image}} zone={{zone}} 
+                    image={{image}} zone={{zone}}
                     service_account_email={{ service_account_email }}
                     credentials_file={{ credentials_file }}
                     project_id={{ project_id }}
@@ -331,7 +331,14 @@ def create_instances(module, gce, instance_names):
     service_account_email = module.params.get('service_account_email')
 
     if external_ip == "none":
-        external_ip = None
+        instance_external_ip = None
+    elif not isinstance(external_ip, basestring):
+        try:
+            instance_external_ip = gce.ex_get_address(external_ip.pop(0) if len(external_ip) != 0 else 'ephemeral')
+        except GoogleBaseError, e:
+            module.fail_json(msg='Unexpected error attempting to get a static ip %s, error: %s' % (external_ip, e.value))
+    else:
+        instance_external_ip = external_ip
 
     new_instances = []
     changed = False
@@ -409,7 +416,7 @@ def create_instances(module, gce, instance_names):
                 name, lc_machine_type, lc_image, location=lc_zone,
                 ex_network=network, ex_tags=tags, ex_metadata=metadata,
                 ex_boot_disk=pd, ex_can_ip_forward=ip_forward,
-                external_ip=external_ip, ex_disk_auto_delete=disk_auto_delete,
+                external_ip=instance_external_ip, ex_disk_auto_delete=disk_auto_delete,
                 ex_service_accounts=ex_sa_perms
             )
             changed = True
@@ -504,8 +511,7 @@ def main():
             credentials_file = dict(),
             project_id = dict(),
             ip_forward = dict(type='bool', default=False),
-            external_ip = dict(choices=['ephemeral', 'none'],
-                               default='ephemeral'),
+            external_ip=dict(default='ephemeral'),
             disk_auto_delete = dict(type='bool', default=True),
         )
     )

From 44af735ac4dc098ed7437ef2a678b3b79c6805e6 Mon Sep 17 00:00:00 2001
From: daniel-sc <daniel-schreiber@gmx.de>
Date: Sat, 10 Oct 2015 16:22:05 +0200
Subject: [PATCH 2/2] Allowing specifying ip by address

---
 cloud/google/gce.py | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/cloud/google/gce.py b/cloud/google/gce.py
index 9746d303caa..96085170692 100644
--- a/cloud/google/gce.py
+++ b/cloud/google/gce.py
@@ -136,7 +136,7 @@ options:
   external_ip:
     version_added: "1.9"
     description:
-      - type of external ip, ephemeral by default; alternatively, a list of fixed gce ip names can be given (if there is not enough specified ip, 'ephemeral' will be used)
+      - type of external ip, ephemeral by default; alternatively, a list of fixed gce ips or ip names can be given (if there is not enough specified ip, 'ephemeral' will be used)
     required: false
     default: "ephemeral"
   disk_auto_delete:
@@ -242,12 +242,15 @@ EXAMPLES = '''
 
 '''
 
+import socket
+
 try:
     import libcloud
     from libcloud.compute.types import Provider
     from libcloud.compute.providers import get_driver
     from libcloud.common.google import GoogleBaseError, QuotaExceededError, \
         ResourceExistsError, ResourceInUseError, ResourceNotFoundError
+    from libcloud.compute.drivers.gce import GCEAddress
     _ = Provider.GCE
     HAS_LIBCLOUD = True
 except ImportError:
@@ -334,7 +337,16 @@ def create_instances(module, gce, instance_names):
         instance_external_ip = None
     elif not isinstance(external_ip, basestring):
         try:
-            instance_external_ip = gce.ex_get_address(external_ip.pop(0) if len(external_ip) != 0 else 'ephemeral')
+            if len(external_ip) != 0:
+                instance_external_ip = external_ip.pop(0)
+                # check if instance_external_ip is an ip or a name
+                try:
+                    socket.inet_aton(instance_external_ip)
+                    instance_external_ip = GCEAddress(id='unknown', name='unknown', address=instance_external_ip, region='unknown', driver=gce)
+                except socket.error:
+                    instance_external_ip = gce.ex_get_address(instance_external_ip)
+            else:
+                instance_external_ip = 'ephemeral'
         except GoogleBaseError, e:
             module.fail_json(msg='Unexpected error attempting to get a static ip %s, error: %s' % (external_ip, e.value))
     else: