summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moser <smoser@ubuntu.com>2016-06-15 23:28:51 -0400
committerScott Moser <smoser@ubuntu.com>2016-06-15 23:28:51 -0400
commit52fd44f4312120faa3fcab22150422bc16020130 (patch)
tree790d277e08dd39da82dd956c89709e17538a1a82
parent7f96bab59df7782d5e0a871725c3524e12293201 (diff)
parent2e911631b8ad1d687fa865dc216a5ee79ae23653 (diff)
downloadcloud-init-52fd44f4312120faa3fcab22150422bc16020130.tar.gz
merge with trunk
-rw-r--r--ChangeLog1
-rw-r--r--cloudinit/cmd/__init__.py21
-rw-r--r--[-rwxr-xr-x]cloudinit/cmd/main.py (renamed from bin/cloud-init)46
-rw-r--r--cloudinit/config/cc_apt_configure.py3
-rw-r--r--cloudinit/config/cc_growpart.py10
-rw-r--r--cloudinit/distros/__init__.py2
-rw-r--r--cloudinit/distros/arch.py4
-rw-r--r--cloudinit/distros/debian.py4
-rw-r--r--cloudinit/net/eni.py4
-rw-r--r--cloudinit/sources/DataSourceAltCloud.py3
-rw-r--r--cloudinit/sources/DataSourceGCE.py2
-rw-r--r--cloudinit/sources/DataSourceNoCloud.py19
-rw-r--r--cloudinit/sources/DataSourceOVF.py10
-rw-r--r--cloudinit/sources/DataSourceOpenNebula.py2
-rw-r--r--cloudinit/sources/helpers/openstack.py2
-rwxr-xr-xsetup.py8
-rw-r--r--tests/unittests/test_cli.py43
-rw-r--r--tests/unittests/test_datasource/test_gce.py2
-rwxr-xr-xtools/run-pep85
-rwxr-xr-xtools/run-pyflakes2
20 files changed, 98 insertions, 95 deletions
diff --git a/ChangeLog b/ChangeLog
index e2869522..66539792 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -122,6 +122,7 @@
- ConfigDrive: improved support for networking information from
a network_data.json or older interfaces formated network_config.
- Change missing Cheetah log warning to debug [Andrew Jorgensen]
+ - Remove trailing dot from GCE metadata URL (LP: #1581200) [Phil Roche]
0.7.6:
- open 0.7.6
diff --git a/cloudinit/cmd/__init__.py b/cloudinit/cmd/__init__.py
new file mode 100644
index 00000000..da124641
--- /dev/null
+++ b/cloudinit/cmd/__init__.py
@@ -0,0 +1,21 @@
+# vi: ts=4 expandtab
+#
+# Copyright (C) 2012 Canonical Ltd.
+# Copyright (C) 2012 Hewlett-Packard Development Company, L.P.
+# Copyright (C) 2012 Yahoo! Inc.
+#
+# Author: Scott Moser <scott.moser@canonical.com>
+# Author: Juerg Haefliger <juerg.haefliger@hp.com>
+# Author: Joshua Harlow <harlowja@yahoo-inc.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 3, as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/bin/cloud-init b/cloudinit/cmd/main.py
index 21c3a684..63621c1d 100755..100644
--- a/bin/cloud-init
+++ b/cloudinit/cmd/main.py
@@ -25,19 +25,12 @@ import argparse
import json
import os
import sys
-import time
import tempfile
+import time
import traceback
-# This is more just for running from the bin folder so that
-# cloud-init binary can find the cloudinit module
-possible_topdir = os.path.normpath(os.path.join(os.path.abspath(
- sys.argv[0]), os.pardir, os.pardir))
-if os.path.exists(os.path.join(possible_topdir, "cloudinit", "__init__.py")):
- sys.path.insert(0, possible_topdir)
-
from cloudinit import patcher
-patcher.patch()
+patcher.patch() # noqa
from cloudinit import log as logging
from cloudinit import netinfo
@@ -46,9 +39,10 @@ from cloudinit import sources
from cloudinit import stages
from cloudinit import templater
from cloudinit import util
+from cloudinit import version
+
from cloudinit import reporting
from cloudinit.reporting import events
-from cloudinit import version
from cloudinit.settings import (PER_INSTANCE, PER_ALWAYS, PER_ONCE,
CLOUD_CONFIG)
@@ -188,7 +182,7 @@ def main_init(name, args):
LOG.debug("Closing stdin")
util.close_stdin()
(outfmt, errfmt) = util.fixup_output(init.cfg, name)
- except:
+ except Exception:
util.logexc(LOG, "Failed to setup output redirection!")
print_exc("Failed to setup output redirection!")
if args.debug:
@@ -325,7 +319,7 @@ def main_init(name, args):
if outfmt_orig != outfmt or errfmt_orig != errfmt:
LOG.warn("Stdout, stderr changing to (%s, %s)", outfmt, errfmt)
(outfmt, errfmt) = util.fixup_output(mods.cfg, name)
- except:
+ except Exception:
util.logexc(LOG, "Failed to re-adjust output redirection!")
logging.setupLogging(mods.cfg)
@@ -367,7 +361,7 @@ def main_modules(action_name, args):
LOG.debug("Closing stdin")
util.close_stdin()
util.fixup_output(mods.cfg, name)
- except:
+ except Exception:
util.logexc(LOG, "Failed to setup output redirection!")
if args.debug:
# Reset so that all the debug handlers are closed out
@@ -430,7 +424,7 @@ def main_single(name, args):
LOG.debug("Closing stdin")
util.close_stdin()
util.fixup_output(mods.cfg, None)
- except:
+ except Exception:
util.logexc(LOG, "Failed to setup output redirection!")
if args.debug:
# Reset so that all the debug handlers are closed out
@@ -510,7 +504,7 @@ def status_wrapper(name, args, data_d=None, link_d=None):
else:
try:
status = json.loads(util.load_file(status_path))
- except:
+ except Exception:
pass
if status is None:
@@ -569,8 +563,12 @@ def status_wrapper(name, args, data_d=None, link_d=None):
return len(v1[mode]['errors'])
-def main():
- parser = argparse.ArgumentParser()
+def main(sysv_args=None):
+ if sysv_args is not None:
+ parser = argparse.ArgumentParser(prog=sysv_args[0])
+ sysv_args = sysv_args[1:]
+ else:
+ parser = argparse.ArgumentParser()
# Top level args
parser.add_argument('--version', '-v', action='version',
@@ -646,7 +644,12 @@ def main():
' pass to this module'))
parser_single.set_defaults(action=('single', main_single))
- args = parser.parse_args()
+ args = parser.parse_args(args=sysv_args)
+
+ try:
+ (name, functor) = args.action
+ except AttributeError:
+ parser.error('too few arguments')
# Setup basic logging to start (until reinitialized)
# iff in debug mode...
@@ -656,9 +659,6 @@ def main():
# Setup signal handlers before running
signal_handler.attach_handlers()
- if not hasattr(args, 'action'):
- parser.error('too few arguments')
- (name, functor) = args.action
if name in ("modules", "init"):
functor = status_wrapper
@@ -683,7 +683,3 @@ def main():
return util.log_time(
logfunc=LOG.debug, msg="cloud-init mode '%s'" % name,
get_uptime=True, func=functor, args=(name, args))
-
-
-if __name__ == '__main__':
- sys.exit(main())
diff --git a/cloudinit/config/cc_apt_configure.py b/cloudinit/config/cc_apt_configure.py
index 96c4a43d..05ad4b03 100644
--- a/cloudinit/config/cc_apt_configure.py
+++ b/cloudinit/config/cc_apt_configure.py
@@ -208,8 +208,9 @@ def add_apt_sources(srclist, template_params=None, aa_repo_match=None):
template_params = {}
if aa_repo_match is None:
- def aa_repo_match(x):
+ def _aa_repo_match(x):
return False
+ aa_repo_match = _aa_repo_match
errorlist = []
srcdict = convert_to_new_format(srclist)
diff --git a/cloudinit/config/cc_growpart.py b/cloudinit/config/cc_growpart.py
index 859d69f1..40560f11 100644
--- a/cloudinit/config/cc_growpart.py
+++ b/cloudinit/config/cc_growpart.py
@@ -36,13 +36,13 @@ DEFAULT_CONFIG = {
}
-def enum(**enums):
- return type('Enum', (), enums)
+class RESIZE(object):
+ SKIPPED = "SKIPPED"
+ CHANGED = "CHANGED"
+ NOCHANGE = "NOCHANGE"
+ FAILED = "FAILED"
-RESIZE = enum(SKIPPED="SKIPPED", CHANGED="CHANGED", NOCHANGE="NOCHANGE",
- FAILED="FAILED")
-
LOG = logging.getLogger(__name__)
diff --git a/cloudinit/distros/__init__.py b/cloudinit/distros/__init__.py
index 5c29c804..14b500f8 100644
--- a/cloudinit/distros/__init__.py
+++ b/cloudinit/distros/__init__.py
@@ -454,7 +454,7 @@ class Distro(object):
keys = kwargs['ssh_authorized_keys']
if isinstance(keys, six.string_types):
keys = [keys]
- if isinstance(keys, dict):
+ elif isinstance(keys, dict):
keys = list(keys.values())
if keys is not None:
if not isinstance(keys, (tuple, list, set)):
diff --git a/cloudinit/distros/arch.py b/cloudinit/distros/arch.py
index 93a2e008..66209f22 100644
--- a/cloudinit/distros/arch.py
+++ b/cloudinit/distros/arch.py
@@ -196,6 +196,6 @@ def convert_resolv_conf(settings):
"""Returns a settings string formatted for resolv.conf."""
result = ''
if isinstance(settings, list):
- for ns in list:
+ for ns in settings:
result = result + 'nameserver %s\n' % ns
- return result
+ return result
diff --git a/cloudinit/distros/debian.py b/cloudinit/distros/debian.py
index 511ed4fe..53f3aa4d 100644
--- a/cloudinit/distros/debian.py
+++ b/cloudinit/distros/debian.py
@@ -25,8 +25,8 @@ import os
from cloudinit import distros
from cloudinit import helpers
from cloudinit import log as logging
-from cloudinit import net
from cloudinit.net import eni
+from cloudinit.net.network_state import parse_net_config_data
from cloudinit import util
from cloudinit.distros.parsers.hostname import HostnameConf
@@ -85,7 +85,7 @@ class Distro(distros.Distro):
return ['all']
def _write_network_config(self, netconfig):
- ns = net.parse_net_config_data(netconfig)
+ ns = parse_net_config_data(netconfig)
self._net_renderer.render_network_state("/", ns)
_maybe_remove_legacy_eth0()
return []
diff --git a/cloudinit/net/eni.py b/cloudinit/net/eni.py
index c8adb1ae..ccd16ba7 100644
--- a/cloudinit/net/eni.py
+++ b/cloudinit/net/eni.py
@@ -389,8 +389,8 @@ class Renderer(renderer.Renderer):
iface['control'] = subnet.get('control', 'auto')
if iface['mode'].endswith('6'):
iface['inet'] += '6'
- elif (iface['mode'] == 'static'
- and ":" in subnet['address']):
+ elif (iface['mode'] == 'static' and
+ ":" in subnet['address']):
iface['inet'] += '6'
if iface['mode'].startswith('dhcp'):
iface['mode'] = 'dhcp'
diff --git a/cloudinit/sources/DataSourceAltCloud.py b/cloudinit/sources/DataSourceAltCloud.py
index cd61df31..a3529609 100644
--- a/cloudinit/sources/DataSourceAltCloud.py
+++ b/cloudinit/sources/DataSourceAltCloud.py
@@ -205,8 +205,7 @@ class DataSourceAltCloud(sources.DataSource):
_err.message)
return False
except OSError as _err:
- util.logexc(LOG, 'Failed command: %s\n%s', ' '.join(cmd),
- _err.message)
+ util.logexc(LOG, 'Failed command: %s\n%s', ' '.join(cmd), _err)
return False
floppy_dev = '/dev/fd0'
diff --git a/cloudinit/sources/DataSourceGCE.py b/cloudinit/sources/DataSourceGCE.py
index 9234d1f8..c660a350 100644
--- a/cloudinit/sources/DataSourceGCE.py
+++ b/cloudinit/sources/DataSourceGCE.py
@@ -25,7 +25,7 @@ from cloudinit import util
LOG = logging.getLogger(__name__)
BUILTIN_DS_CONFIG = {
- 'metadata_url': 'http://metadata.google.internal./computeMetadata/v1/'
+ 'metadata_url': 'http://metadata.google.internal/computeMetadata/v1/'
}
REQUIRED_FIELDS = ('instance-id', 'availability-zone', 'local-hostname')
diff --git a/cloudinit/sources/DataSourceNoCloud.py b/cloudinit/sources/DataSourceNoCloud.py
index 7e30118c..cdc9eef5 100644
--- a/cloudinit/sources/DataSourceNoCloud.py
+++ b/cloudinit/sources/DataSourceNoCloud.py
@@ -24,7 +24,7 @@ import errno
import os
from cloudinit import log as logging
-from cloudinit import net
+from cloudinit.net import eni
from cloudinit import sources
from cloudinit import util
@@ -34,7 +34,6 @@ LOG = logging.getLogger(__name__)
class DataSourceNoCloud(sources.DataSource):
def __init__(self, sys_cfg, distro, paths):
sources.DataSource.__init__(self, sys_cfg, distro, paths)
- self.dsmode = 'local'
self.seed = None
self.seed_dirs = [os.path.join(paths.seed_dir, 'nocloud'),
os.path.join(paths.seed_dir, 'nocloud-net')]
@@ -194,8 +193,7 @@ class DataSourceNoCloud(sources.DataSource):
# LP: #1568150 need getattr in the case that an old class object
# has been loaded from a pickled file and now executing new source.
dirs = getattr(self, 'seed_dirs', [self.seed_dir])
- quick_id = _quick_read_instance_id(cmdline_id=self.cmdline_id,
- dirs=dirs)
+ quick_id = _quick_read_instance_id(dirs=dirs)
if not quick_id:
return None
return quick_id == current
@@ -203,20 +201,19 @@ class DataSourceNoCloud(sources.DataSource):
@property
def network_config(self):
if self._network_config is None:
- if self.network_eni is not None:
- self._network_config = net.convert_eni_data(self.network_eni)
+ if self._network_eni is not None:
+ self._network_config = eni.convert_eni_data(self._network_eni)
return self._network_config
-def _quick_read_instance_id(cmdline_id, dirs=None):
+def _quick_read_instance_id(dirs=None):
if dirs is None:
dirs = []
iid_key = 'instance-id'
- if cmdline_id is None:
- fill = {}
- if parse_cmdline_data(cmdline_id, fill) and iid_key in fill:
- return fill[iid_key]
+ fill = {}
+ if load_cmdline_data(fill) and iid_key in fill:
+ return fill[iid_key]
for d in dirs:
if d is None:
diff --git a/cloudinit/sources/DataSourceOVF.py b/cloudinit/sources/DataSourceOVF.py
index f2bb9366..43347cfb 100644
--- a/cloudinit/sources/DataSourceOVF.py
+++ b/cloudinit/sources/DataSourceOVF.py
@@ -37,16 +37,16 @@ from cloudinit.sources.helpers.vmware.imc.config_file \
import ConfigFile
from cloudinit.sources.helpers.vmware.imc.config_nic \
import NicConfigurator
+from cloudinit.sources.helpers.vmware.imc.guestcust_error \
+ import GuestCustErrorEnum
from cloudinit.sources.helpers.vmware.imc.guestcust_event \
import GuestCustEventEnum
from cloudinit.sources.helpers.vmware.imc.guestcust_state \
import GuestCustStateEnum
-from cloudinit.sourceshelpers.vmware.imc.guestcust_error \
- import GuestCustErrorEnum
-from cloudinit.sourceshelpers.vmware.imc.guestcust_util import (
- set_customization_status,
+from cloudinit.sources.helpers.vmware.imc.guestcust_util import (
+ enable_nics,
get_nics_to_enable,
- enable_nics
+ set_customization_status
)
LOG = logging.getLogger(__name__)
diff --git a/cloudinit/sources/DataSourceOpenNebula.py b/cloudinit/sources/DataSourceOpenNebula.py
index 8f85b115..7b3a76b9 100644
--- a/cloudinit/sources/DataSourceOpenNebula.py
+++ b/cloudinit/sources/DataSourceOpenNebula.py
@@ -104,7 +104,7 @@ class DataSourceOpenNebula(sources.DataSource):
def get_hostname(self, fqdn=False, resolve_ip=None):
if resolve_ip is None:
- if self.dsmode == sources.DSMODE_NET:
+ if self.dsmode == sources.DSMODE_NETWORK:
resolve_ip = True
else:
resolve_ip = False
diff --git a/cloudinit/sources/helpers/openstack.py b/cloudinit/sources/helpers/openstack.py
index 494335b3..d52cb56a 100644
--- a/cloudinit/sources/helpers/openstack.py
+++ b/cloudinit/sources/helpers/openstack.py
@@ -157,7 +157,7 @@ class BaseReader(object):
pass
@abc.abstractmethod
- def _path_read(self, path):
+ def _path_read(self, path, decode=False):
pass
@abc.abstractmethod
diff --git a/setup.py b/setup.py
index 8c8f2402..0af576a9 100755
--- a/setup.py
+++ b/setup.py
@@ -204,10 +204,14 @@ setuptools.setup(
author_email='scott.moser@canonical.com',
url='http://launchpad.net/cloud-init/',
packages=setuptools.find_packages(exclude=['tests']),
- scripts=['bin/cloud-init',
- 'tools/cloud-init-per'],
+ scripts=['tools/cloud-init-per'],
license='GPLv3',
data_files=data_files,
install_requires=requirements,
cmdclass=cmdclass,
+ entry_points={
+ 'console_scripts': [
+ 'cloud-init = cloudinit.cmd.main:main'
+ ],
+ }
)
diff --git a/tests/unittests/test_cli.py b/tests/unittests/test_cli.py
index 163ce64c..5fa252f7 100644
--- a/tests/unittests/test_cli.py
+++ b/tests/unittests/test_cli.py
@@ -1,12 +1,10 @@
-import imp
-import os
import six
-import sys
from . import helpers as test_helpers
-mock = test_helpers.mock
-BIN_CLOUDINIT = "bin/cloud-init"
+from cloudinit.cmd import main as cli
+
+mock = test_helpers.mock
class TestCLI(test_helpers.FilesystemMockingTestCase):
@@ -15,35 +13,22 @@ class TestCLI(test_helpers.FilesystemMockingTestCase):
super(TestCLI, self).setUp()
self.stderr = six.StringIO()
self.patchStdoutAndStderr(stderr=self.stderr)
- self.sys_exit = mock.MagicMock()
- self.patched_funcs.enter_context(
- mock.patch.object(sys, 'exit', self.sys_exit))
-
- def _call_main(self):
- self.patched_funcs.enter_context(
- mock.patch.object(sys, 'argv', ['cloud-init']))
- cli = imp.load_module(
- 'cli', open(BIN_CLOUDINIT), '', ('', 'r', imp.PY_SOURCE))
+
+ def _call_main(self, sysv_args=None):
+ if not sysv_args:
+ sysv_args = ['cloud-init']
try:
- return cli.main()
- except Exception:
- pass
+ return cli.main(sysv_args=sysv_args)
+ except SystemExit as e:
+ return e.code
- @test_helpers.skipIf(not os.path.isfile(BIN_CLOUDINIT), "no bin/cloudinit")
def test_no_arguments_shows_usage(self):
- self._call_main()
- self.assertIn('usage: cloud-init', self.stderr.getvalue())
-
- @test_helpers.skipIf(not os.path.isfile(BIN_CLOUDINIT), "no bin/cloudinit")
- def test_no_arguments_exits_2(self):
exit_code = self._call_main()
- if self.sys_exit.call_count:
- self.assertEqual(mock.call(2), self.sys_exit.call_args)
- else:
- self.assertEqual(2, exit_code)
+ self.assertIn('usage: cloud-init', self.stderr.getvalue())
+ self.assertEqual(2, exit_code)
- @test_helpers.skipIf(not os.path.isfile(BIN_CLOUDINIT), "no bin/cloudinit")
def test_no_arguments_shows_error_message(self):
- self._call_main()
+ exit_code = self._call_main()
self.assertIn('cloud-init: error: too few arguments',
self.stderr.getvalue())
+ self.assertEqual(2, exit_code)
diff --git a/tests/unittests/test_datasource/test_gce.py b/tests/unittests/test_datasource/test_gce.py
index 1f7eb99e..6e62a4d2 100644
--- a/tests/unittests/test_datasource/test_gce.py
+++ b/tests/unittests/test_datasource/test_gce.py
@@ -52,7 +52,7 @@ GCE_META_ENCODING = {
HEADERS = {'X-Google-Metadata-Request': 'True'}
MD_URL_RE = re.compile(
- r'http://metadata.google.internal./computeMetadata/v1/.*')
+ r'http://metadata.google.internal/computeMetadata/v1/.*')
def _set_mock_metadata(gce_meta=None):
diff --git a/tools/run-pep8 b/tools/run-pep8
index 086400fc..4bd0bbfb 100755
--- a/tools/run-pep8
+++ b/tools/run-pep8
@@ -1,8 +1,7 @@
#!/bin/bash
-pycheck_dirs=( "cloudinit/" "bin/" "tests/" "tools/" )
-# FIXME: cloud-init modifies sys module path, pep8 does not like
-# bin_files=( "bin/cloud-init" )
+pycheck_dirs=( "cloudinit/" "tests/" "tools/" )
+
CR="
"
[ "$1" = "-v" ] && { verbose="$1"; shift; } || verbose=""
diff --git a/tools/run-pyflakes b/tools/run-pyflakes
index 4bea17f4..b3759a94 100755
--- a/tools/run-pyflakes
+++ b/tools/run-pyflakes
@@ -3,7 +3,7 @@
PYTHON_VERSION=${PYTHON_VERSION:-2}
CR="
"
-pycheck_dirs=( "cloudinit/" "bin/" "tests/" "tools/" )
+pycheck_dirs=( "cloudinit/" "tests/" "tools/" )
set -f
if [ $# -eq 0 ]; then