Wait for MAAS warmup

  * in case of fast service start => acces to maas API
    maas can throw '503 - MAAS is starting' error

Change-Id: Id68877e94aba8b17fedd1f0fa6f563c43cd047a6
Closes-Bug: PROD-21039 (PROD:21039)
diff --git a/_modules/maasng.py b/_modules/maasng.py
index ce8e99e..0ea58ae 100644
--- a/_modules/maasng.py
+++ b/_modules/maasng.py
@@ -70,7 +70,9 @@
     return Lazy()
 
 
-def _create_maas_client():
+def _create_maas_client(api_url=None):
+    if not api_url:
+        api_url = 'http://localhost:5240/MAAS'
     global APIKEY_FILE
     try:
         api_token = file(APIKEY_FILE).read().splitlines()[-1].strip()\
@@ -78,7 +80,6 @@
     except:
         LOG.exception('token')
     auth = MAASOAuth(*api_token)
-    api_url = 'http://localhost:5240/MAAS'
     dispatcher = MAASDispatcher()
     return MAASClient(auth, dispatcher, api_url)
 
@@ -1157,6 +1158,51 @@
 # MAAS CONFIG SECTION
 
 
+def _getHTTPCode(url):
+    code = 404
+    try:
+        connection = urllib2.urlopen(url)
+        code = connection.getcode()
+        connection.close()
+    except urllib2.HTTPError as e:
+        code = e.getcode()
+        LOG.warning("Catch http code:{} from url:{}".format(code, url))
+        pass
+    return code
+
+
+def wait_for_http_code(url=None, expected=[200]):
+    """
+    Simple function, which just wait for avaible api, aka wait for 200.
+
+    CLI Example:
+
+    .. code-block:: bash
+
+        salt 'maas-node' maasng.wait_for_http_code url expected=[200]
+
+    """
+    ret = {}
+    started_at = time.time()
+    poll_time = 5
+    timeout = 60 * 2
+    while _getHTTPCode(url) not in expected:
+        c_timeout = timeout - (time.time() - started_at)
+        if c_timeout <= 0:
+            ret['result'] = False
+            ret["comment"] = "api:{} not answered up in time".format(url)
+            return ret
+        LOG.info(
+            "Waiting for api:{0}\n"
+            "sleep for:{1}s "
+            "Left:{2}/{3}s".format(url, poll_time, round(c_timeout),
+                                   timeout))
+        time.sleep(poll_time)
+    ret['result'] = True
+    ret["comment"] = "MAAS API:{} up.".format(url)
+    return ret
+
+
 def _get_boot_source_id_by_url(url):
     # FIXME: fix ret\validation
     try:
diff --git a/maas/region.sls b/maas/region.sls
index f50b901..dbe2ff8 100644
--- a/maas/region.sls
+++ b/maas/region.sls
@@ -146,6 +146,22 @@
   - onlyif: /bin/false
   {%- endif %}
 
+maas_warmup:
+  module.run:
+  - name: maasng.wait_for_http_code
+{#
+# FIXME
+# 405 - should be removed ,since twisted will be fixed
+# Currently - api always throw 405=>500 even if request has been made with 'expected 'HEAD
+#}
+  - url: "http://localhost:5240/MAAS"
+  - wait_for: [200, 405]
+  - require_in:
+    - module: maas_set_admin_password
+  {%- if grains.get('kitchen-test') %}
+  - onlyif: /bin/false
+  {%- endif %}
+
 maas_set_admin_password:
   cmd.run:
   - name: "maas createadmin --username {{ region.admin.username }} --password {{ region.admin.password }} --email {{ region.admin.email }} && touch /var/lib/maas/.setup_admin"