Skip to content

Commit 5833420

Browse files
authored
Add baremetal clean command to erase node devices (#1818)
Adds a new command to clean baremetal nodes by erasing their storage devices. The node must be in "available" state, which is then transitioned to "manageable" before executing the erase_devices clean step. AI-assisted: Claude Code Signed-off-by: Christian Berendt <[email protected]>
1 parent 8c06f4e commit 5833420

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

osism/commands/baremetal.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -867,6 +867,60 @@ def take_action(self, parsed_args):
867867
continue
868868

869869

870+
class BaremetalClean(Command):
871+
def get_parser(self, prog_name):
872+
parser = super(BaremetalClean, self).get_parser(prog_name)
873+
874+
parser.add_argument(
875+
"name",
876+
type=str,
877+
help="Clean given baremetal node when in provision state available",
878+
)
879+
return parser
880+
881+
def take_action(self, parsed_args):
882+
name = parsed_args.name
883+
884+
clean_steps = [{"interface": "deploy", "step": "erase_devices"}]
885+
886+
conn = get_cloud_connection()
887+
888+
node = conn.baremetal.find_node(name, ignore_missing=True, details=True)
889+
if not node:
890+
logger.warning(f"Could not find node {name}")
891+
return
892+
893+
if node.provision_state in ["available"]:
894+
# NOTE: Clean is available in the "manageable" provision state, so we move the node into this state
895+
try:
896+
node = conn.baremetal.set_node_provision_state(node.id, "manage")
897+
node = conn.baremetal.wait_for_nodes_provision_state(
898+
[node.id], "manageable"
899+
)[0]
900+
except Exception as exc:
901+
logger.warning(
902+
f"Node {node.name} ({node.id}) could not be moved to manageable state: {exc}"
903+
)
904+
return
905+
906+
if node.provision_state in ["manageable"]:
907+
try:
908+
conn.baremetal.set_node_provision_state(
909+
node.id, "clean", clean_steps=clean_steps
910+
)
911+
logger.info(
912+
f"Successfully initiated clean for node {node.name} ({node.id})"
913+
)
914+
except Exception as exc:
915+
logger.warning(f"Clean of node {node.name} ({node.id}) failed: {exc}")
916+
return
917+
else:
918+
logger.warning(
919+
f"Node {node.name} ({node.id}) not in supported state! Provision state: {node.provision_state}, maintenance mode: {node['maintenance']}"
920+
)
921+
return
922+
923+
870924
class BaremetalMaintenanceSet(Command):
871925
def get_parser(self, prog_name):
872926
parser = super(BaremetalMaintenanceSet, self).get_parser(prog_name)

setup.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ console_scripts =
4040
osism.commands:
4141
apply = osism.commands.apply:Run
4242
baremetal burnin = osism.commands.baremetal:BaremetalBurnIn
43+
baremetal clean = osism.commands.baremetal:BaremetalClean
4344
baremetal delete = osism.commands.baremetal:BaremetalDelete
4445
baremetal deploy = osism.commands.baremetal:BaremetalDeploy
4546
baremetal dump = osism.commands.baremetal:BaremetalDump
@@ -96,6 +97,7 @@ osism.commands:
9697
manage server migrate = osism.commands.server:ServerMigrate
9798
manage volume list = osism.commands.volume:VolumeList
9899
manage baremetal burnin = osism.commands.baremetal:BaremetalBurnIn
100+
manage baremetal clean = osism.commands.baremetal:BaremetalClean
99101
manage baremetal delete = osism.commands.baremetal:BaremetalDelete
100102
manage baremetal deploy = osism.commands.baremetal:BaremetalDeploy
101103
manage baremetal dump = osism.commands.baremetal:BaremetalDump

0 commit comments

Comments
 (0)