summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moser <smoser@brickies.net>2017-02-28 17:14:45 -0500
committerScott Moser <smoser@brickies.net>2017-03-03 01:30:15 -0500
commitade8c2e0266b020089145075e8236b95c000a3cb (patch)
treecde54a3e19f354ea6a05831038dff1840327b5fd
parent33518d7d62493c7d00e3792146399c9572abe915 (diff)
downloadvyos-cloud-init-ade8c2e0266b020089145075e8236b95c000a3cb.tar.gz
vyos-cloud-init-ade8c2e0266b020089145075e8236b95c000a3cb.zip
Move warning functionality to cloudinit/warnings.py
This moves the warning code that was added specifically for EC2 into a generic path at cloudinit/warnings.py. It also adds support for writing warning files into the warnings directory to be shown by Z99-cloudinit-warnings.sh.
-rw-r--r--cloudinit/helpers.py1
-rw-r--r--cloudinit/sources/DataSourceEc2.py47
-rw-r--r--cloudinit/warnings.py115
3 files changed, 121 insertions, 42 deletions
diff --git a/cloudinit/helpers.py b/cloudinit/helpers.py
index 38f5f899..7435d58d 100644
--- a/cloudinit/helpers.py
+++ b/cloudinit/helpers.py
@@ -340,6 +340,7 @@ class Paths(object):
"vendordata": "vendor-data.txt.i",
"instance_id": ".instance-id",
"manual_clean_marker": "manual-clean",
+ "warnings": "warnings",
}
# Set when a datasource becomes active
self.datasource = ds
diff --git a/cloudinit/sources/DataSourceEc2.py b/cloudinit/sources/DataSourceEc2.py
index c7df8060..6f01a139 100644
--- a/cloudinit/sources/DataSourceEc2.py
+++ b/cloudinit/sources/DataSourceEc2.py
@@ -9,7 +9,6 @@
# This file is part of cloud-init. See LICENSE file for license information.
import os
-import textwrap
import time
from cloudinit import ec2_utils as ec2
@@ -17,6 +16,7 @@ from cloudinit import log as logging
from cloudinit import sources
from cloudinit import url_helper as uhelp
from cloudinit import util
+from cloudinit import warnings
LOG = logging.getLogger(__name__)
@@ -224,7 +224,8 @@ class DataSourceEc2(sources.DataSource):
return
if self.cloud_platform == Platforms.UNKNOWN:
warn_if_necessary(
- util.get_cfg_by_path(cfg, STRICT_ID_PATH, STRICT_ID_DEFAULT))
+ util.get_cfg_by_path(cfg, STRICT_ID_PATH, STRICT_ID_DEFAULT),
+ cfg)
def read_strict_mode(cfgval, default):
@@ -265,7 +266,7 @@ def parse_strict_mode(cfgval):
return mode, sleep
-def warn_if_necessary(cfgval):
+def warn_if_necessary(cfgval, cfg):
try:
mode, sleep = parse_strict_mode(cfgval)
except ValueError as e:
@@ -275,45 +276,7 @@ def warn_if_necessary(cfgval):
if mode == "false":
return
- show_warning(sleep)
-
-
-def show_warning(sleep):
- message = textwrap.dedent("""
- ****************************************************************
- # This system is using the EC2 Metadata Service, but does not #
- # appear to be running on Amazon EC2 or one of cloud-init's #
- # known platforms that provide a EC2 Metadata service. In the #
- # future, cloud-init may stop reading metadata from the EC2 #
- # Metadata Service unless the platform can be identified #
- # #
- # If you are seeing this message, please file a bug against #
- # cloud-init at https://bugs.launchpad.net/cloud-init/+filebug #
- # Make sure to include the cloud provider your instance is #
- # running on. #
- # #
- # For more information see #
- # https://bugs.launchpad.net/cloud-init/+bug/1660385 #
- # #
- # After you have filed a bug, you can disable this warning by #
- # launching your instance with the cloud-config below, or #
- # putting that content into #
- # /etc/cloud/cloud.cfg.d/99-ec2-datasource.cfg #
- # #
- # #cloud-config #
- # datasource: #
- # Ec2: #
- # strict_id: false #
- # #
- """)
- closemsg = ""
- if sleep:
- closemsg = " [sleeping for %d seconds] " % sleep
- message += closemsg.center(64, "*")
- print(message)
- LOG.warn(message)
- if sleep:
- time.sleep(sleep)
+ warnings.show_warning('non_ec2_md', cfg, mode=True, sleep=sleep)
def identify_aws(data):
diff --git a/cloudinit/warnings.py b/cloudinit/warnings.py
new file mode 100644
index 00000000..77c092f9
--- /dev/null
+++ b/cloudinit/warnings.py
@@ -0,0 +1,115 @@
+# This file is part of cloud-init. See LICENSE file for license information.
+
+from cloudinit import helpers
+from cloudinit import log as logging
+from cloudinit import util
+
+import os
+import time
+
+LOG = logging.getLogger()
+
+WARNINGS = {
+ 'non_ec2_md': """
+This system is using the EC2 Metadata Service, but does not appear to
+be running on Amazon EC2 or one of cloud-init's known platforms that
+provide a EC2 Metadata service. In the future, cloud-init may stop
+reading metadata from the EC2 Metadata Service unless the platform can
+be identified.
+
+If you are seeing this message, please file a bug against
+cloud-init at
+ https://bugs.launchpad.net/cloud-init/+filebug?field.tags=dsid
+Make sure to include the cloud provider your instance is
+running on.
+
+For more information see
+ https://bugs.launchpad.net/bugs/1660385
+
+After you have filed a bug, you can disable this warning by
+launching your instance with the cloud-config below, or
+putting that content into
+ /etc/cloud/cloud.cfg.d/99-ec2-datasource.cfg
+
+#cloud-config
+datasource:
+ Ec2:
+ strict_id: false""",
+}
+
+
+def _get_warn_dir(cfg):
+ paths = helpers.Paths(
+ path_cfgs=cfg.get('system_info', {}).get('paths', {}))
+ return paths.get_ipath_cur('warnings')
+
+
+def _load_warn_cfg(cfg, name, mode=True, sleep=None):
+ # parse cfg['warnings']['name'] returning boolean, sleep
+ # expected value is form of:
+ # (on|off|true|false|sleep)[,sleeptime]
+ # boolean True == on, False == off
+ default = (mode, sleep)
+ if not cfg or not isinstance(cfg, dict):
+ return default
+
+ ncfg = util.get_cfg_by_path(cfg, ('warnings', name))
+ if ncfg is None:
+ return default
+
+ if ncfg in ("on", "true", True):
+ return True, None
+
+ if ncfg in ("off", "false", False):
+ return False, None
+
+ mode, _, csleep = ncfg.partition(",")
+ if mode != "sleep":
+ return default
+
+ if csleep:
+ try:
+ sleep = int(csleep)
+ except ValueError:
+ return default
+
+ return True, sleep
+
+
+def show_warning(name, cfg=None, sleep=None, mode=True, **kwargs):
+ # kwargs are used for .format of the message.
+ # sleep and mode are default values used if
+ # cfg['warnings']['name'] is not present.
+ if cfg is None:
+ cfg = {}
+
+ mode, sleep = _load_warn_cfg(cfg, name, mode=mode, sleep=sleep)
+ if not mode:
+ return
+
+ msg = WARNINGS[name].format(**kwargs)
+ msgwidth = 70
+ linewidth = msgwidth + 4
+
+ fmt = "# %%-%ds #" % msgwidth
+ topline = "*" * linewidth + "\n"
+ fmtlines = []
+ for line in msg.strip("\n").splitlines():
+ fmtlines.append(fmt % line)
+
+ closeline = topline
+ if sleep:
+ sleepmsg = " [sleeping for %d seconds] " % sleep
+ closeline = sleepmsg.center(linewidth, "*") + "\n"
+
+ util.write_file(
+ os.path.join(_get_warn_dir(cfg), name),
+ topline + "\n".join(fmtlines) + "\n" + topline)
+
+ LOG.warn(topline + "\n".join(fmtlines) + "\n" + closeline)
+
+ if sleep:
+ LOG.debug("sleeping %d seconds for warning '%s'" % (sleep, name))
+ time.sleep(sleep)
+
+# vi: ts=4 expandtab