diff options
author | Felix Huettner <felix.huettner@mail.schwarz> | 2021-08-26 17:27:18 +0200 |
---|---|---|
committer | Felix Huettner <felix.huettner@mail.schwarz> | 2021-08-27 08:18:31 +0200 |
commit | bd76a5766c76727109d67020696804efafea73f1 (patch) | |
tree | dd2cd4dc7dbef3e195a7067d0ec9833e74bf6d71 | |
parent | b5df386022c686f1b1020253f0980e8b738091fd (diff) | |
download | python-ironicclient-bd76a5766c76727109d67020696804efafea73f1.tar.gz |
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
-rw-r--r-- | ironicclient/tests/unit/v1/test_node.py | 12 | ||||
-rw-r--r-- | 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: |