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"