Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/badfish/helpers/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ def create_parser():
parser.add_argument("-p", help="BMC password")
parser.add_argument("-i", help="Path to interfaces yaml", default=None)
parser.add_argument("-t", help="Type of host as defined on interfaces yaml")
parser.add_argument("--rack", help="Rack name of the host", default=None)
parser.add_argument("--uloc", help="U-location name of the host", default=None)
parser.add_argument("--blade", help="Blade name of the host", default=None)
parser.add_argument("-l", "--log", help="Optional argument for logging results to a file")
parser.add_argument(
"-o",
Expand Down
38 changes: 31 additions & 7 deletions src/badfish/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,9 @@ async def badfish_factory(
_console=None,
_progress_disabled=False,
_timeout=TIMEOUT,
_rack=None,
_uloc=None,
_blade=None,
):
if not _logger:
bfl = BadfishLogger()
Expand All @@ -64,6 +67,9 @@ async def badfish_factory(
_console,
_progress_disabled,
_timeout,
_rack,
_uloc,
_blade,
)
await badfish.init()
return badfish
Expand All @@ -82,11 +88,17 @@ def __init__(
_console=None,
_progress_disabled=False,
_timeout=TIMEOUT,
_rack=None,
_uloc=None,
_blade=None,
):
self.host = _host
self.username = _username
self.password = _password
self.retries = _retries
self.rack = _rack
self.uloc = _uloc
self.blade = _blade
self.host_uri = "https://%s" % _host
self.redfish_uri = "/redfish/v1"
self.root_uri = "%s%s" % (self.host_uri, self.redfish_uri)
Expand Down Expand Up @@ -164,19 +176,25 @@ async def error_handler(self, _response, message=None):
async def get_interfaces_by_type(self, host_type, _interfaces_path):
definitions = await self.read_yaml(_interfaces_path)

host_name_split = self.host.split(".")[0].split("-")
host_name_split = self.host.split(":")[0].split(".")[0].split("-")
host_model = None
rack = None
uloc = None
host_blade = None
prefix = [host_type]

if len(host_name_split) > 1:
host_model = host_name_split[-1]
rack = host_name_split[1]
uloc = host_name_split[2]
prefix.extend([rack, uloc])
rack = self.rack if self.rack is not None else host_name_split[1]
uloc = self.uloc if self.uloc is not None else (
host_name_split[2] if len(host_name_split) > 2 else None
)
for val in [rack, uloc]:
if val is not None:
prefix.append(val)

if len(host_name_split) > 4:
if self.blade is not None:
host_blade = self.blade
prefix.append(host_blade)
elif len(host_name_split) > 4:
host_blade = host_name_split[3]
prefix.append(host_blade)

Expand Down Expand Up @@ -2904,6 +2922,9 @@ async def execute_badfish(_host, _args, logger, format_handler=None, console=Non
host_type = _args["t"]
interfaces_path = _args["i"]
force = _args["force"]
rack = _args.get("rack")
uloc = _args.get("uloc")
blade = _args.get("blade")
pxe = _args["pxe"]
device = _args["boot_to"]
boot_to_type = _args["boot_to_type"]
Expand Down Expand Up @@ -2974,6 +2995,9 @@ async def execute_badfish(_host, _args, logger, format_handler=None, console=Non
_console=console,
_progress_disabled=progress_disabled,
_timeout=timeout,
_rack=rack,
_uloc=uloc,
_blade=blade,
)

if _args["host_list"] and not _args["output"]:
Expand Down
63 changes: 63 additions & 0 deletions tests/test_custom_interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,66 @@ async def test_get_interface_by_type(self):
f"{host_type} interfaces for host: {host} : "
f"{interfaces} does not match expected: {expected_interfaces}"
)


class TestGetInterfaceByTypeOverride(TestBase):
@pytest.mark.asyncio
async def test_explicit_rack_uloc(self):
# Non-standard hostname; rack and uloc provided explicitly to match e27 interfaces
badfish = Badfish(
_host="server-r750.example.com",
_username="",
_password="",
_logger="",
_retries="",
_rack="e27",
_uloc="h01",
)
for host_type, expected_str in E27_EXPECTED_INTERFACES.items():
expected_interfaces = expected_str.split(",")
with self.subTest(host_type=host_type):
interfaces = await badfish.get_interfaces_by_type(host_type, _interfaces_path=INTERFACES_PATH)
assert interfaces == expected_interfaces, (
f"{host_type} interfaces with explicit rack/uloc: "
f"{interfaces} does not match expected: {expected_interfaces}"
)

@pytest.mark.asyncio
async def test_explicit_blade(self):
# Non-standard hostname; rack, uloc, and blade provided explicitly for blade b01
badfish = Badfish(
_host="server-fc640.example.com",
_username="",
_password="",
_logger="",
_retries="",
_rack="e99",
_uloc="h01",
_blade="b01",
)
expected_interfaces = FC640_B01_INTERFACES["uefi"].split(",")
interfaces = await badfish.get_interfaces_by_type("uefi", _interfaces_path=INTERFACES_PATH)
assert interfaces == expected_interfaces, (
f"uefi interfaces with explicit blade b01: "
f"{interfaces} does not match expected: {expected_interfaces}"
)

@pytest.mark.asyncio
async def test_explicit_blade_b02(self):
# Non-standard hostname; rack, uloc, and blade provided explicitly for blade b02
badfish = Badfish(
_host="server-fc640.example.com",
_username="",
_password="",
_logger="",
_retries="",
_rack="e99",
_uloc="h01",
_blade="b02",
)
expected_interfaces = FC640_B02_INTERFACES["uefi"].split(",")
interfaces = await badfish.get_interfaces_by_type("uefi", _interfaces_path=INTERFACES_PATH)
assert interfaces == expected_interfaces, (
f"uefi interfaces with explicit blade b02: "
f"{interfaces} does not match expected: {expected_interfaces}"
)
Loading