summaryrefslogtreecommitdiff
path: root/cloudinit/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cloudinit/cmd')
-rw-r--r--cloudinit/cmd/clean.py27
-rwxr-xr-xcloudinit/cmd/devel/net_convert.py17
-rw-r--r--cloudinit/cmd/devel/tests/test_logs.py2
-rw-r--r--cloudinit/cmd/devel/tests/test_render.py2
-rw-r--r--cloudinit/cmd/main.py9
-rw-r--r--cloudinit/cmd/query.py3
-rw-r--r--cloudinit/cmd/tests/test_clean.py8
-rw-r--r--cloudinit/cmd/tests/test_cloud_id.py2
-rw-r--r--cloudinit/cmd/tests/test_main.py9
-rw-r--r--cloudinit/cmd/tests/test_query.py30
-rw-r--r--cloudinit/cmd/tests/test_status.py2
11 files changed, 64 insertions, 47 deletions
diff --git a/cloudinit/cmd/clean.py b/cloudinit/cmd/clean.py
index de22f7f2..30e49de0 100644
--- a/cloudinit/cmd/clean.py
+++ b/cloudinit/cmd/clean.py
@@ -5,12 +5,13 @@
"""Define 'clean' utility and handler as part of cloud-init commandline."""
import argparse
+import glob
import os
import sys
from cloudinit.stages import Init
from cloudinit.util import (
- ProcessExecutionError, chdir, del_dir, del_file, get_config_logfiles,
+ ProcessExecutionError, del_dir, del_file, get_config_logfiles,
is_link, subp)
@@ -61,18 +62,18 @@ def remove_artifacts(remove_logs, remove_seed=False):
if not os.path.isdir(init.paths.cloud_dir):
return 0 # Artifacts dir already cleaned
- with chdir(init.paths.cloud_dir):
- for path in os.listdir('.'):
- if path == 'seed' and not remove_seed:
- continue
- try:
- if os.path.isdir(path) and not is_link(path):
- del_dir(path)
- else:
- del_file(path)
- except OSError as e:
- error('Could not remove {0}: {1}'.format(path, str(e)))
- return 1
+ seed_path = os.path.join(init.paths.cloud_dir, 'seed')
+ for path in glob.glob('%s/*' % init.paths.cloud_dir):
+ if path == seed_path and not remove_seed:
+ continue
+ try:
+ if os.path.isdir(path) and not is_link(path):
+ del_dir(path)
+ else:
+ del_file(path)
+ except OSError as e:
+ error('Could not remove {0}: {1}'.format(path, str(e)))
+ return 1
return 0
diff --git a/cloudinit/cmd/devel/net_convert.py b/cloudinit/cmd/devel/net_convert.py
index 1ad7e0bd..80d217ca 100755
--- a/cloudinit/cmd/devel/net_convert.py
+++ b/cloudinit/cmd/devel/net_convert.py
@@ -5,13 +5,12 @@ import argparse
import json
import os
import sys
-import yaml
from cloudinit.sources.helpers import openstack
from cloudinit.sources import DataSourceAzure as azure
from cloudinit.sources import DataSourceOVF as ovf
-from cloudinit import distros
+from cloudinit import distros, safeyaml
from cloudinit.net import eni, netplan, network_state, sysconfig
from cloudinit import log
@@ -78,13 +77,12 @@ def handle_args(name, args):
if args.kind == "eni":
pre_ns = eni.convert_eni_data(net_data)
elif args.kind == "yaml":
- pre_ns = yaml.load(net_data)
+ pre_ns = safeyaml.load(net_data)
if 'network' in pre_ns:
pre_ns = pre_ns.get('network')
if args.debug:
sys.stderr.write('\n'.join(
- ["Input YAML",
- yaml.dump(pre_ns, default_flow_style=False, indent=4), ""]))
+ ["Input YAML", safeyaml.dumps(pre_ns), ""]))
elif args.kind == 'network_data.json':
pre_ns = openstack.convert_net_json(
json.loads(net_data), known_macs=known_macs)
@@ -97,12 +95,11 @@ def handle_args(name, args):
ns = network_state.parse_net_config_data(pre_ns)
if not ns:
raise RuntimeError("No valid network_state object created from"
- "input data")
+ " input data")
if args.debug:
- sys.stderr.write('\n'.join([
- "", "Internal State",
- yaml.dump(ns, default_flow_style=False, indent=4), ""]))
+ sys.stderr.write('\n'.join(
+ ["", "Internal State", safeyaml.dumps(ns), ""]))
distro_cls = distros.fetch(args.distro)
distro = distro_cls(args.distro, {}, None)
config = {}
@@ -116,6 +113,8 @@ def handle_args(name, args):
config['postcmds'] = False
# trim leading slash
config['netplan_path'] = config['netplan_path'][1:]
+ # enable some netplan features
+ config['features'] = ['dhcp-use-domains', 'ipv6-mtu']
else:
r_cls = sysconfig.Renderer
config = distro.renderer_configs.get('sysconfig')
diff --git a/cloudinit/cmd/devel/tests/test_logs.py b/cloudinit/cmd/devel/tests/test_logs.py
index 4951797b..d2dfa8de 100644
--- a/cloudinit/cmd/devel/tests/test_logs.py
+++ b/cloudinit/cmd/devel/tests/test_logs.py
@@ -2,7 +2,7 @@
from datetime import datetime
import os
-from six import StringIO
+from io import StringIO
from cloudinit.cmd.devel import logs
from cloudinit.sources import INSTANCE_JSON_SENSITIVE_FILE
diff --git a/cloudinit/cmd/devel/tests/test_render.py b/cloudinit/cmd/devel/tests/test_render.py
index 988bba03..a7fcf2ce 100644
--- a/cloudinit/cmd/devel/tests/test_render.py
+++ b/cloudinit/cmd/devel/tests/test_render.py
@@ -1,7 +1,7 @@
# This file is part of cloud-init. See LICENSE file for license information.
-from six import StringIO
import os
+from io import StringIO
from collections import namedtuple
from cloudinit.cmd.devel import render
diff --git a/cloudinit/cmd/main.py b/cloudinit/cmd/main.py
index 933c019a..a5446da7 100644
--- a/cloudinit/cmd/main.py
+++ b/cloudinit/cmd/main.py
@@ -632,13 +632,14 @@ def status_wrapper(name, args, data_d=None, link_d=None):
'start': None,
'finished': None,
}
+
if status is None:
status = {'v1': {}}
- for m in modes:
- status['v1'][m] = nullstatus.copy()
status['v1']['datasource'] = None
- elif mode not in status['v1']:
- status['v1'][mode] = nullstatus.copy()
+
+ for m in modes:
+ if m not in status['v1']:
+ status['v1'][m] = nullstatus.copy()
v1 = status['v1']
v1['stage'] = mode
diff --git a/cloudinit/cmd/query.py b/cloudinit/cmd/query.py
index 1d888b9d..e3db8679 100644
--- a/cloudinit/cmd/query.py
+++ b/cloudinit/cmd/query.py
@@ -5,7 +5,6 @@
import argparse
from errno import EACCES
import os
-import six
import sys
from cloudinit.handlers.jinja_template import (
@@ -149,7 +148,7 @@ def handle_args(name, args):
response = '\n'.join(sorted(response.keys()))
elif args.list_keys:
response = '\n'.join(sorted(response.keys()))
- if not isinstance(response, six.string_types):
+ if not isinstance(response, str):
response = util.json_dumps(response)
print(response)
return 0
diff --git a/cloudinit/cmd/tests/test_clean.py b/cloudinit/cmd/tests/test_clean.py
index 5a3ec3bf..13a69aa1 100644
--- a/cloudinit/cmd/tests/test_clean.py
+++ b/cloudinit/cmd/tests/test_clean.py
@@ -5,7 +5,7 @@ from cloudinit.util import ensure_dir, sym_link, write_file
from cloudinit.tests.helpers import CiTestCase, wrap_and_call, mock
from collections import namedtuple
import os
-from six import StringIO
+from io import StringIO
mypaths = namedtuple('MyPaths', 'cloud_dir')
@@ -22,7 +22,8 @@ class TestClean(CiTestCase):
class FakeInit(object):
cfg = {'def_log_file': self.log1,
'output': {'all': '|tee -a {0}'.format(self.log2)}}
- paths = mypaths(cloud_dir=self.artifact_dir)
+ # Ensure cloud_dir has a trailing slash, to match real behaviour
+ paths = mypaths(cloud_dir='{}/'.format(self.artifact_dir))
def __init__(self, ds_deps):
pass
@@ -136,7 +137,8 @@ class TestClean(CiTestCase):
clean.remove_artifacts, remove_logs=False)
self.assertEqual(1, retcode)
self.assertEqual(
- 'ERROR: Could not remove dir1: oops\n', m_stderr.getvalue())
+ 'ERROR: Could not remove %s/dir1: oops\n' % self.artifact_dir,
+ m_stderr.getvalue())
def test_handle_clean_args_reboots(self):
"""handle_clean_args_reboots when reboot arg is provided."""
diff --git a/cloudinit/cmd/tests/test_cloud_id.py b/cloudinit/cmd/tests/test_cloud_id.py
index 73738170..3f3727fd 100644
--- a/cloudinit/cmd/tests/test_cloud_id.py
+++ b/cloudinit/cmd/tests/test_cloud_id.py
@@ -4,7 +4,7 @@
from cloudinit import util
from collections import namedtuple
-from six import StringIO
+from io import StringIO
from cloudinit.cmd import cloud_id
diff --git a/cloudinit/cmd/tests/test_main.py b/cloudinit/cmd/tests/test_main.py
index a1e534fb..384fddc6 100644
--- a/cloudinit/cmd/tests/test_main.py
+++ b/cloudinit/cmd/tests/test_main.py
@@ -3,11 +3,12 @@
from collections import namedtuple
import copy
import os
-from six import StringIO
+from io import StringIO
from cloudinit.cmd import main
+from cloudinit import safeyaml
from cloudinit.util import (
- ensure_dir, load_file, write_file, yaml_dumps)
+ ensure_dir, load_file, write_file)
from cloudinit.tests.helpers import (
FilesystemMockingTestCase, wrap_and_call)
@@ -39,7 +40,7 @@ class TestMain(FilesystemMockingTestCase):
],
'cloud_init_modules': ['write-files', 'runcmd'],
}
- cloud_cfg = yaml_dumps(self.cfg)
+ cloud_cfg = safeyaml.dumps(self.cfg)
ensure_dir(os.path.join(self.new_root, 'etc', 'cloud'))
self.cloud_cfg_file = os.path.join(
self.new_root, 'etc', 'cloud', 'cloud.cfg')
@@ -113,7 +114,7 @@ class TestMain(FilesystemMockingTestCase):
"""When local-hostname metadata is present, call cc_set_hostname."""
self.cfg['datasource'] = {
'None': {'metadata': {'local-hostname': 'md-hostname'}}}
- cloud_cfg = yaml_dumps(self.cfg)
+ cloud_cfg = safeyaml.dumps(self.cfg)
write_file(self.cloud_cfg_file, cloud_cfg)
cmdargs = myargs(
debug=False, files=None, force=False, local=False, reporter=None,
diff --git a/cloudinit/cmd/tests/test_query.py b/cloudinit/cmd/tests/test_query.py
index 28738b1e..6d36a4ea 100644
--- a/cloudinit/cmd/tests/test_query.py
+++ b/cloudinit/cmd/tests/test_query.py
@@ -1,7 +1,7 @@
# This file is part of cloud-init. See LICENSE file for license information.
import errno
-from six import StringIO
+from io import StringIO
from textwrap import dedent
import os
@@ -150,7 +150,9 @@ class TestQuery(CiTestCase):
instance_data=self.instance_data, list_keys=False,
user_data='ud', vendor_data='vd', varname=None)
with mock.patch('sys.stdout', new_callable=StringIO) as m_stdout:
- self.assertEqual(0, query.handle_args('anyname', args))
+ with mock.patch('os.getuid') as m_getuid:
+ m_getuid.return_value = 100
+ self.assertEqual(0, query.handle_args('anyname', args))
self.assertEqual(
'{\n "my_var": "it worked",\n "userdata": "<%s> file:ud",\n'
' "vendordata": "<%s> file:vd"\n}\n' % (
@@ -165,7 +167,9 @@ class TestQuery(CiTestCase):
instance_data=self.instance_data, list_keys=False,
user_data='ud', vendor_data='vd', varname='my_var')
with mock.patch('sys.stdout', new_callable=StringIO) as m_stdout:
- self.assertEqual(0, query.handle_args('anyname', args))
+ with mock.patch('os.getuid') as m_getuid:
+ m_getuid.return_value = 100
+ self.assertEqual(0, query.handle_args('anyname', args))
self.assertEqual('it worked\n', m_stdout.getvalue())
def test_handle_args_returns_nested_varname(self):
@@ -177,7 +181,9 @@ class TestQuery(CiTestCase):
instance_data=self.instance_data, user_data='ud', vendor_data='vd',
list_keys=False, varname='v1.key_2')
with mock.patch('sys.stdout', new_callable=StringIO) as m_stdout:
- self.assertEqual(0, query.handle_args('anyname', args))
+ with mock.patch('os.getuid') as m_getuid:
+ m_getuid.return_value = 100
+ self.assertEqual(0, query.handle_args('anyname', args))
self.assertEqual('value-2\n', m_stdout.getvalue())
def test_handle_args_returns_standardized_vars_to_top_level_aliases(self):
@@ -206,7 +212,9 @@ class TestQuery(CiTestCase):
instance_data=self.instance_data, user_data='ud', vendor_data='vd',
list_keys=False, varname=None)
with mock.patch('sys.stdout', new_callable=StringIO) as m_stdout:
- self.assertEqual(0, query.handle_args('anyname', args))
+ with mock.patch('os.getuid') as m_getuid:
+ m_getuid.return_value = 100
+ self.assertEqual(0, query.handle_args('anyname', args))
self.assertEqual(expected, m_stdout.getvalue())
def test_handle_args_list_keys_sorts_top_level_keys_when_no_varname(self):
@@ -221,7 +229,9 @@ class TestQuery(CiTestCase):
instance_data=self.instance_data, list_keys=True, user_data='ud',
vendor_data='vd', varname=None)
with mock.patch('sys.stdout', new_callable=StringIO) as m_stdout:
- self.assertEqual(0, query.handle_args('anyname', args))
+ with mock.patch('os.getuid') as m_getuid:
+ m_getuid.return_value = 100
+ self.assertEqual(0, query.handle_args('anyname', args))
self.assertEqual(expected, m_stdout.getvalue())
def test_handle_args_list_keys_sorts_nested_keys_when_varname(self):
@@ -236,7 +246,9 @@ class TestQuery(CiTestCase):
instance_data=self.instance_data, list_keys=True,
user_data='ud', vendor_data='vd', varname='v1')
with mock.patch('sys.stdout', new_callable=StringIO) as m_stdout:
- self.assertEqual(0, query.handle_args('anyname', args))
+ with mock.patch('os.getuid') as m_getuid:
+ m_getuid.return_value = 100
+ self.assertEqual(0, query.handle_args('anyname', args))
self.assertEqual(expected, m_stdout.getvalue())
def test_handle_args_list_keys_errors_when_varname_is_not_a_dict(self):
@@ -252,7 +264,9 @@ class TestQuery(CiTestCase):
vendor_data='vd', varname='top')
with mock.patch('sys.stderr', new_callable=StringIO) as m_stderr:
with mock.patch('sys.stdout', new_callable=StringIO) as m_stdout:
- self.assertEqual(1, query.handle_args('anyname', args))
+ with mock.patch('os.getuid') as m_getuid:
+ m_getuid.return_value = 100
+ self.assertEqual(1, query.handle_args('anyname', args))
self.assertEqual('', m_stdout.getvalue())
self.assertIn(expected_error, m_stderr.getvalue())
diff --git a/cloudinit/cmd/tests/test_status.py b/cloudinit/cmd/tests/test_status.py
index aded8580..1ed10896 100644
--- a/cloudinit/cmd/tests/test_status.py
+++ b/cloudinit/cmd/tests/test_status.py
@@ -2,7 +2,7 @@
from collections import namedtuple
import os
-from six import StringIO
+from io import StringIO
from textwrap import dedent
from cloudinit.atomic_helper import write_json