Skip to content

Commit 1043c90

Browse files
authored
Merge pull request #1632 from rackerlabs/PUC-1454
feat: PU-1454: Add method to grab current RAID controller/disk in enroll process.
2 parents b48a4f0 + 4993fae commit 1043c90

2 files changed

Lines changed: 127 additions & 5 deletions

File tree

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import argparse
2+
import json
3+
import logging
4+
import logging.config
5+
import os
6+
7+
from sushy import Sushy
8+
9+
from understack_workflows.bmc import bmc_for_ip_address
10+
from understack_workflows.helpers import setup_logger
11+
12+
logger = setup_logger(__name__)
13+
14+
log_config = {
15+
"version": 1,
16+
"disable_existing_loggers": False,
17+
"loggers": {
18+
"__main__": {"level": "INFO"},
19+
"sushy.main": {"level": "INFO"},
20+
"sushy.resources.base": {"level": "INFO"},
21+
"sushy.connector": {"level": "INFO"},
22+
"urllib3.connectionpool": {"level": "INFO"},
23+
},
24+
}
25+
26+
logging.config.dictConfig(log_config)
27+
28+
29+
def main():
30+
"""Export RAID details for a BMC using Sushy.
31+
32+
- connect to the BMC using standard password
33+
34+
- Using Sushy, gather controller details:
35+
- controller name
36+
- list of drive references for raid configuration.
37+
38+
- output json object response.
39+
"""
40+
args = argument_parser().parse_args()
41+
42+
ip_address = args.ip_address
43+
password = args.password or None
44+
logger.debug("%s starting for ip_address=%s", __file__, ip_address)
45+
46+
bmc = bmc_for_ip_address(ip_address=ip_address, password=password)
47+
client = bmc.sushy()
48+
49+
# argo workflows captures stdout as the results which we can use
50+
# to return the device UUID
51+
print(json.dumps(parse_controller_details(client)))
52+
53+
54+
def argument_parser():
55+
"""Parse runtime arguments."""
56+
parser = argparse.ArgumentParser(
57+
prog=os.path.basename(__file__), description="Gather RAID Device info."
58+
)
59+
parser.add_argument("--ip-address", type=str, required=True, help="BMC IP")
60+
parser.add_argument(
61+
"--password", type=str, required=False, help="Custom Password", default=None
62+
)
63+
return parser
64+
65+
66+
def parse_controller_details(client: Sushy) -> dict:
67+
"""Parse available RAID controller details for execution."""
68+
result = {"controller": None, "physical_disks": []}
69+
system_objects = client.get_system_collection().get_members()
70+
system = system_objects[0]
71+
for c in system.storage.get_members():
72+
if "RAID" in c.identity:
73+
result["controller"] = c.identity
74+
for d in c.drives:
75+
result["physical_disks"].append(d.identity)
76+
break
77+
return result
78+
79+
80+
if __name__ == "__main__":
81+
main()

workflows/argo-events/workflowtemplates/enroll-server.yaml

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ spec:
1515
- name: ip_address
1616
- name: firmware_update
1717
value: "false"
18+
- name: raid_configure
19+
value: "true"
1820
templates:
1921
- name: main
2022
steps:
@@ -35,12 +37,20 @@ spec:
3537
- name: device_id
3638
value: "{{steps.enroll-server.outputs.result}}"
3739
when: "{{steps.server-enroll-state.outputs.result}} == enroll"
40+
- - name: get-raid-config
41+
template: get-raid-config
42+
when: "{{workflow.parameters.raid_configure}} == true"
3843
- - name: openstack-set-baremetal-node-raid-config
3944
template: openstack-set-baremetal-node-raid-config
4045
arguments:
4146
parameters:
4247
- name: device_id
4348
value: "{{steps.enroll-server.outputs.result}}"
49+
- name: controller_id
50+
value: "{{=jsonpath(steps.['get-raid-config'].outputs.result, $.controller)}}"
51+
- name: physical_disks
52+
value: "{{=jsonpath(steps.['get-raid-config'].outputs.result, $.physical_disks)}}"
53+
when: "{{workflow.parameters.raid_configure}} == true"
4454
- - name: server-manage-state
4555
template: openstack-state-cmd
4656
arguments:
@@ -135,10 +145,44 @@ spec:
135145
items:
136146
- key: clouds.yaml
137147
path: clouds.yaml
148+
- name: get-raid-config
149+
container:
150+
image: ghcr.io/rackerlabs/understack/ironic-nautobot-client:latest
151+
command:
152+
- get-raid-devices
153+
args:
154+
- --ip-address
155+
- "{{workflow.parameters.ip_address}}"
156+
volumeMounts:
157+
- mountPath: /etc/openstack
158+
name: baremetal-manage
159+
readOnly: true
160+
- mountPath: /etc/bmc_master/
161+
name: bmc-master
162+
readOnly: true
163+
env:
164+
- name: WF_NS
165+
value: "{{workflow.namespace}}"
166+
- name: WF_NAME
167+
value: "{{workflow.name}}"
168+
- name: WF_UID
169+
value: "{{workflow.uid}}"
170+
volumes:
171+
- name: bmc-master
172+
secret:
173+
secretName: bmc-master
174+
- name: baremetal-manage
175+
secret:
176+
secretName: baremetal-manage
177+
items:
178+
- key: clouds.yaml
179+
path: clouds.yaml
138180
- name: openstack-set-baremetal-node-raid-config
139181
inputs:
140182
parameters:
141183
- name: device_id
184+
- name: controller_id
185+
- name: physical_disks
142186
# https://rackerlabs.github.io/understack/user-guide/openstack-ironic/#setting-baremetal-node-flavor
143187
script:
144188
image: ghcr.io/rackerlabs/understack/openstack-client:2025.2
@@ -149,12 +193,9 @@ spec:
149193
# than passing a big json string on command line
150194
cat <<'EOF' >> raid1-config.json
151195
{ "logical_disks":
152-
[ { "controller": "RAID.SL.1-1",
196+
[ { "controller": {{ inputs.parameters.controller_id }},
153197
"is_root_volume": true,
154-
"physical_disks": [
155-
"Disk.Bay.0:Enclosure.Internal.0-1:RAID.SL.1-1",
156-
"Disk.Bay.1:Enclosure.Internal.0-1:RAID.SL.1-1"
157-
],
198+
"physical_disks": {{ inputs.parameters.physical_disks }},
158199
"raid_level": "1",
159200
"size_gb": "MAX"
160201
}

0 commit comments

Comments
 (0)