From 9953b5a2e8d7bd3269ab720f844cdb6450337b9c Mon Sep 17 00:00:00 2001 From: Julia Kreger Date: Fri, 2 Sep 2022 15:43:08 -0700 Subject: [PATCH] add default conductor group capability When creating nodes, previously there was no way to set a default conductor group to create nodes with, thus forcing a two step process, a dedicated conductor without a conductor group to serve reqeusts for it. With this change, an operator can set specific conductor_group settings by API, allowing increased delineation with reduced risk of misconfiguration or mis-step. Story: 2010267 Task: 46183 Change-Id: I21d58750504b2eecf3368d2e03eaca050065c3d7 --- ironic/api/controllers/v1/node.py | 2 +- ironic/conf/default.py | 5 +++++ .../unit/api/controllers/v1/test_node.py | 21 +++++++++++++++++++ ...ault-conductor-group-a0355c5e9345a037.yaml | 7 +++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/add-default-conductor-group-a0355c5e9345a037.yaml diff --git a/ironic/api/controllers/v1/node.py b/ironic/api/controllers/v1/node.py index d21b075c81..83723bcc62 100644 --- a/ironic/api/controllers/v1/node.py +++ b/ironic/api/controllers/v1/node.py @@ -2538,7 +2538,7 @@ class NodesController(rest.RestController): # NOTE(jroll) this is special-cased to "" and not None, # because it is used in hash ring calculations if not node.get('conductor_group'): - node['conductor_group'] = '' + node['conductor_group'] = CONF.default_conductor_group if node.get('name') is not None: error_msg = _("Cannot create node with invalid name '%(name)s'") diff --git a/ironic/conf/default.py b/ironic/conf/default.py index c7aff69cc3..b2a6caab83 100644 --- a/ironic/conf/default.py +++ b/ironic/conf/default.py @@ -81,6 +81,11 @@ api_opts = [ mutable=True, help=_('Resource class to use for new nodes when no resource ' 'class is provided in the creation request.')), + cfg.StrOpt('default_conductor_group', + mutable=True, + default="", + help=_('The conductor_group to use for new nodes when no ' + 'conductor_group was defined in the creation request.')), ] driver_opts = [ diff --git a/ironic/tests/unit/api/controllers/v1/test_node.py b/ironic/tests/unit/api/controllers/v1/test_node.py index d56652b1e2..b94e7e6fdb 100644 --- a/ironic/tests/unit/api/controllers/v1/test_node.py +++ b/ironic/tests/unit/api/controllers/v1/test_node.py @@ -4495,6 +4495,27 @@ class TestPost(test_api_base.BaseApiTest): headers={api_base.Version.string: "1.21"}) self.assertEqual('class2', result['resource_class']) + def test_create_node_with_default_conductor_group(self): + self.config(default_conductor_group='magic') + + ndict = test_api_utils.post_get_test_node() + self.post_json('/nodes', ndict) + + # newer version is needed to see the resource_class field + result = self.get_json('/nodes/%s' % ndict['uuid'], + headers={api_base.Version.string: "1.46"}) + self.assertEqual('magic', result['conductor_group']) + + def test_create_node_explicit_default_conductor_group(self): + self.config(default_conductor_group='meow') + ndict = test_api_utils.post_get_test_node(conductor_group='mouse') + self.post_json('/nodes', ndict, + headers={api_base.Version.string: "1.46"}) + + result = self.get_json('/nodes/%s' % ndict['uuid'], + headers={api_base.Version.string: "1.46"}) + self.assertEqual('mouse', result['conductor_group']) + def test_create_node_doesnt_contain_id(self): # FIXME(comstud): I'd like to make this test not use the # dbapi, however, no matter what I do when trying to mock diff --git a/releasenotes/notes/add-default-conductor-group-a0355c5e9345a037.yaml b/releasenotes/notes/add-default-conductor-group-a0355c5e9345a037.yaml new file mode 100644 index 0000000000..5ac9dea3c1 --- /dev/null +++ b/releasenotes/notes/add-default-conductor-group-a0355c5e9345a037.yaml @@ -0,0 +1,7 @@ +--- +features: + - | + Adds the capability to define a ``default_conductor_group`` setting + which allows operators to assign a default conductor group to new nodes + created in Ironic if they do not otherwise have a ``conductor_group`` + set upon creation. By default, this setting has no value.