Skip to content

Commit

Permalink
feat(redfish): add update service
Browse files Browse the repository at this point in the history
Signed-off-by: Boris Glimcher <Boris.Glimcher@emc.com>
  • Loading branch information
glimchb committed Nov 17, 2023
1 parent 19ccb69 commit 525b7e8
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 1 deletion.
6 changes: 5 additions & 1 deletion pydpu/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import click
import grpc

from .dpuredfish import accounts, certificates, managers, systems
from .dpuredfish import accounts, certificates, managers, systems, update
from .evpn import bridge_create, port_create, svi_create, vrf_create
from .inventory import get_inventory
from .ipsec import create_new_tunnel, get_stats
Expand Down Expand Up @@ -218,6 +218,10 @@ def test(ctx, **kwargs):
ctx.obj["ADDRESS"], ctx.obj["USERNAME"], ctx.obj["PASSWORD"]
)
click.echo(list(c.get_certificates()))
u = update.UpdateService(
ctx.obj["ADDRESS"], ctx.obj["USERNAME"], ctx.obj["PASSWORD"]
)
click.echo(list(u.get_versions()))


if __name__ == "__main__":
Expand Down
52 changes: 52 additions & 0 deletions pydpu/dpuredfish/update.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import logging

import redfish


class UpdateService:
def __init__(self, host, user, password, **kwargs):
"""
Create a new connection to DPU via Redfish.
Due to timeout restrictions, every command will start its own session
and tear it down once it completes.
"""
self.logger = logging.getLogger("dpuredfish")
self._host = host
self._user = user
self._password = password
self.logger.info("Connecting to %s", host)
self._session = redfish.redfish_client(
base_url=self._host,
username=self._user,
password=self._password,
cafile=None,
capath=None,
max_retry=3,
timeout=120,
**kwargs
)

def get_version(self, module):
return self._session.get(
"/redfish/v1/UpdateService/FirmwareInventory/{}".format(module)
).dict.get("Version")

def get_versions(self):
self.logger.info("Getting Versions...")
# TODO: create decorator for login/logout
self._session.login(auth=redfish.AuthMethod.SESSION)
response = self._session.get(
"/redfish/v1/UpdateService/FirmwareInventory?$expand=.($levels=1)"
)
if "error" in response.dict or "Members" not in response.dict:
error_message = "\n".join(
msg.get("Message") for msg in response.dict.get("Messages", [])
)
raise RuntimeError(
"Unable to get firmware list: HTTP {}: {}".format(
response.status, error_message
)
)
return dict(
(i.get("Id"), i.get("Version")) for i in response.dict.get("Members")
)

0 comments on commit 525b7e8

Please sign in to comment.