From bd76a5766c76727109d67020696804efafea73f1 Mon Sep 17 00:00:00 2001 From: Felix Huettner Date: Thu, 26 Aug 2021 17:27:18 +0200 Subject: Validate path when passing a config-drive Currently when --config-drive should point to a file or directory the command silently uses the path as a configdrive if this file/directory does not exist. This is not easily understandable for the user as no error message appears. Change-Id: I92d8ce2a61f459ce14335bfb05424dc883dbc4d1 --- ironicclient/tests/unit/v1/test_node.py | 12 +++++++++++- ironicclient/v1/node.py | 8 ++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ironicclient/tests/unit/v1/test_node.py b/ironicclient/tests/unit/v1/test_node.py index 85352e9..83808d5 100644 --- a/ironicclient/tests/unit/v1/test_node.py +++ b/ironicclient/tests/unit/v1/test_node.py @@ -1556,7 +1556,7 @@ class NodeManagerTest(testtools.TestCase): def test_node_set_provision_state_with_configdrive(self): target_state = 'active' self.mgr.set_provision_state(NODE1['uuid'], target_state, - configdrive='foo') + configdrive=b'foo') body = {'target': target_state, 'configdrive': 'foo'} expect = [ ('PUT', '/v1/nodes/%s/states/provision' % NODE1['uuid'], {}, body), @@ -1616,6 +1616,16 @@ class NodeManagerTest(testtools.TestCase): ] self.assertEqual(expect, self.api.calls) + def test_node_set_provision_state_fails_missing_dir_or_file(self): + target_state = 'active' + + with common_utils.tempdir() as dirname: + self.assertRaisesRegex(ValueError, + 'Config drive', + self.mgr.set_provision_state, + NODE1['uuid'], target_state, + configdrive=dirname + "/thisdoesnotexist") + def test_node_set_provision_state_with_cleansteps(self): cleansteps = [{"step": "upgrade", "interface": "deploy"}] target_state = 'clean' diff --git a/ironicclient/v1/node.py b/ironicclient/v1/node.py index d438d0e..6e07e3d 100644 --- a/ironicclient/v1/node.py +++ b/ironicclient/v1/node.py @@ -714,12 +714,16 @@ class NodeManager(base.CreateManager): path = "%s/states/provision" % node_uuid body = {'target': state} if configdrive: - if not isinstance(configdrive, dict): + if isinstance(configdrive, str): if os.path.isfile(configdrive): with open(configdrive, 'rb') as f: configdrive = f.read() - if os.path.isdir(configdrive): + elif os.path.isdir(configdrive): configdrive = utils.make_configdrive(configdrive) + else: + raise ValueError('Config drive seems to refer to a file ' + 'or directory but this file/directory ' + 'does not exist: %s.' % configdrive) if isinstance(configdrive, bytes): try: -- cgit v1.2.1