From da21b66e972f91338551a55996c7e8b0e9a3c461 Mon Sep 17 00:00:00 2001 From: "Wahlstedt, Walter (ww229g)" Date: Wed, 24 May 2023 12:16:02 -0400 Subject: [PATCH] rename interface Change-Id: I413e3d1770401e58cbf5b801892b46378d7840b0 --- .../drivers/node/maasdriver/actions/node.py | 40 ++++++++++++ .../node/maasdriver/models/interface.py | 36 +++++++++++ .../drivers/node/maasdriver/models/machine.py | 61 +++++++++++++++++++ 3 files changed, 137 insertions(+) diff --git a/python/drydock_provisioner/drivers/node/maasdriver/actions/node.py b/python/drydock_provisioner/drivers/node/maasdriver/actions/node.py index 0d1830c4..e93f393b 100644 --- a/python/drydock_provisioner/drivers/node/maasdriver/actions/node.py +++ b/python/drydock_provisioner/drivers/node/maasdriver/actions/node.py @@ -1472,7 +1472,47 @@ class ApplyNodeNetworking(BaseMaasAction): machine.reset_network_config() machine.refresh() + self.logger.debug( + "The variable, n.interfaces is : %s" + % (n.interfaces)) + for i in n.interfaces: + self.logger.debug( + "The node, name is : %s" + % (n.name)) + self.logger.debug( + "The interface, name is : %s" + % (i.device_name)) + self.logger.debug( + "The interface, type is : %s" + % (type(i))) + self.logger.debug( + "The interface, is : %s" + % (i)) + self.logger.debug( + "The interface, network link is : %s" + % (i.network_link)) + + hw_iface_list = i.get_hw_slaves() + for hw_iface in hw_iface_list: + self.logger.debug( + "The logical name for hw_iface is : %s" + % (n.get_logicalname(hw_iface))) + + for i in n.interfaces: + + self.logger.debug( + "The variable, name is : %s" + % (i.device_name)) + # self.logger.debug( + # "The variable, i is : %s" + # % (i)) + # rename only ens ones + if "ens" in i.device_name: + self.logger.debug("The device name is : %s" % (i.device_name)) + + machine.rename_interface(i.device_name) + if not i.network_link: self.logger.debug( "Interface %s has no network link, skipping configuration." diff --git a/python/drydock_provisioner/drivers/node/maasdriver/models/interface.py b/python/drydock_provisioner/drivers/node/maasdriver/models/interface.py index 56647665..f37626e9 100644 --- a/python/drydock_provisioner/drivers/node/maasdriver/models/interface.py +++ b/python/drydock_provisioner/drivers/node/maasdriver/models/interface.py @@ -108,6 +108,42 @@ class Interface(model_base.ResourceBase): return False + def update(self, **kwargs): + """Update this interface. + + {system_id} (string):Node/machine ID Required. + {id} (string):interface ID Required. + """ + if kwargs: + url = self.interpolate_url() + + self.logger.debug("Updating interface %s:%s on system %s." % + (self.name, self.resource_id, self.system_id)) + iface_params = dict() + + # self.logger.debug("Setting interface parameters for interface %s on system %s." % + # (self.resource_id, self.system_id)) + + for k, v in kwargs.items(): + iface_params[k] = v + + iface_params["id"] = self.resource_id + + resp = self.api_client.put(url, files=iface_params) + + if not resp.ok: + self.logger.warning( + "Could not update interface, MaaS error: %s - %s" % + (resp.status_code, resp.text)) + raise errors.DriverError( + "Could not update interface, MaaS error: %s - %s" % + (resp.status_code, resp.text)) + else: + self.logger.warning( + "Could not update interface, no parameters supplied for update") + # resp = self.api_client.put(url, op='interfaces', + # files={"name": path_name, "id": interface_id}) + def disconnect(self): """Disconnect this interface from subnets and VLANs.""" url = self.interpolate_url() diff --git a/python/drydock_provisioner/drivers/node/maasdriver/models/machine.py b/python/drydock_provisioner/drivers/node/maasdriver/models/machine.py index 98aac0fd..02f79e19 100644 --- a/python/drydock_provisioner/drivers/node/maasdriver/models/machine.py +++ b/python/drydock_provisioner/drivers/node/maasdriver/models/machine.py @@ -14,6 +14,7 @@ """Model representing MAAS node/machine resource.""" import logging import base64 +import json from threading import Lock, Condition @@ -82,6 +83,65 @@ class Machine(model_base.ResourceBase): return i return None + def get_commissioning_results(self): + """Load the commissioning script results""" + self.resource_url = 'nodes/{resource_id}/results/' + + url = self.interpolate_url() + + options = { + "filters": "99-netiface-names", + "include_output": True, + } + + resp = self.api_client.get(url, params=options) + # self.logger.debug("MaaS query URL : %s | Options: %s " % url % options) + self.logger.debug("MaaS response: %s" % resp.text) + + + # output_str = resp.decode('utf-8') + json_data = resp.json() + + data_dict = json.loads(base64.b64decode(json_data[0].get("results")[0].get("output"))) + + self.logger.debug("MaaS data_dict: %s" % json.loads(data_dict)) + + if resp.status_code == 200: + self.results = data_dict + + if not resp.ok: + brief_msg = ("Error getting commissioning script, received HTTP %s from MaaS" % + resp.status_code) + self.logger.error(brief_msg) + self.logger.debug("MaaS response: %s" % resp.text) + raise errors.DriverError(brief_msg) + + def rename_interface(self, interface_name): + """rename interface""" + url = self.interpolate_url() + + int_names = self.get_commissioning_results() + path_name = int_names.get(interface_name, "") + + if path_name: + self.logger.info("Interface %s rename to %s" + % (interface_name, path_name)) + iface = self.get_network_interface(interface_name) + if iface.name is not interface_name: + self.logger.info("Interface %s not the correct interface to rename." + % (iface.name)) + return None + # maas_interface.update(name=path_name) + resp = self.api_client.put(url, op='interfaces', + params={"name": path_name, "id": iface.resource_id}) + + if not resp.ok: + brief_msg = ("Error updating interface name, received HTTP %s from MaaS" % + resp.status_code) + self.logger.error(brief_msg) + self.logger.debug("MaaS response: %s" % resp.text) + raise errors.DriverError(brief_msg) + def interface_for_mac(self, mac_address): """Find the machine interface that owns the specified ``mac_address``. @@ -392,6 +452,7 @@ class Machine(model_base.ResourceBase): def set_power_parameters(self, power_type, **kwargs): """Set power parameters for this node. + Only available after the node has been added to MAAS. :param power_type: The type of power management for the node