summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Huettner <felix.huettner@mail.schwarz>2021-08-26 17:27:18 +0200
committerFelix Huettner <felix.huettner@mail.schwarz>2021-08-27 08:18:31 +0200
commitbd76a5766c76727109d67020696804efafea73f1 (patch)
treedd2cd4dc7dbef3e195a7067d0ec9833e74bf6d71
parentb5df386022c686f1b1020253f0980e8b738091fd (diff)
downloadpython-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.py12
-rw-r--r--ironicclient/v1/node.py8
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: