From 3945ccd5c3df429e1a4b6221ac6be6dc0410c513 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Thu, 25 Oct 2018 16:07:07 -0400 Subject: [PATCH] Advance storage configuration API Enumerate disks in an array in disks list. Add array associated with disk to disk data. Show detailed data on arrays and volumes. --- confluent_server/confluent/messages.py | 30 +++++++++++++++- .../plugins/hardwaremanagement/ipmi.py | 36 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/confluent_server/confluent/messages.py b/confluent_server/confluent/messages.py index de2459f8..6badb1d4 100644 --- a/confluent_server/confluent/messages.py +++ b/confluent_server/confluent/messages.py @@ -1253,11 +1253,37 @@ class KeyValueData(ConfluentMessage): else: self.kvpairs = {name: kvdata} +class Array(ConfluentMessage): + def __init__(self, name, disks=None, raid=None, volumes=None, + id=None, capacity=None, available=None): + self.kvpairs = { + name: { + 'disks': disks, + 'raid': raid, + 'id': id, + 'volumes': volumes, + 'capacity': capacity, + 'available': available, + } + } + +class Volume(ConfluentMessage): + def __init__(self, name, volname, size, state, array): + self.kvpairs = { + name: { + 'name': volname, + 'size': size, + 'state': state, + 'array': array, + } + } + class Disk(ConfluentMessage): valid_states = set([ 'jbod', 'unconfigured', 'hotspare', + 'online', ]) state_aliases = { 'unconfigured good': 'unconfigured', @@ -1274,7 +1300,8 @@ class Disk(ConfluentMessage): def __init__(self, name, label=None, description=None, - diskid=None, state=None, serial=None, fru=None): + diskid=None, state=None, serial=None, fru=None, + array=None): state = self._normalize_state(state) self.kvpairs = { name: { @@ -1284,6 +1311,7 @@ class Disk(ConfluentMessage): 'state': state, 'serial': serial, 'fru': fru, + 'array': array, } } diff --git a/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py b/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py index cbcc1c83..d236c55c 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/ipmi.py @@ -1005,12 +1005,24 @@ class IpmiHandler(object): msg.Disk(self.node, disk.name, disk.description, disk.id, disk.status, disk.serial, disk.fru)) + for arr in scfg.arrays: + arrname = '{0}-{1}'.format(*arr.id) + for disk in arr.disks: + if (name == 'all' or simplify_name(disk.name) == name or + disk == name): + self.output.put( + msg.Disk(self.node, disk.name, disk.description, + disk.id, disk.status, disk.serial, + disk.fru, arrname)) def list_disks(self): scfg = self.ipmicmd.get_storage_configuration() self.output.put(msg.ChildCollection('all')) for disk in scfg.disks: self.output.put(msg.ChildCollection(simplify_name(disk.name))) + for arr in scfg.arrays: + for disk in arr.disks: + self.output.put(msg.ChildCollection(simplify_name(disk.name))) def list_arrays(self): scfg = self.ipmicmd.get_storage_configuration() @@ -1018,6 +1030,30 @@ class IpmiHandler(object): for arr in scfg.arrays: self.output.put(msg.ChildCollection('{0}-{1}'.format(*arr.id))) + def show_array(self, name): + scfg = self.ipmicmd.get_storage_configuration() + for arr in scfg.arrays: + arrname = '{0}-{1}'.format(*arr.id) + if arrname == name: + vols = [] + for vol in arr.volumes: + vols.append(simplify_name(vol.name)) + disks = [] + for disk in arr.disks: + disks.append(simplify_name(disk.name)) + self.output.put(msg.Array(self.node, disks, arr.raid, + vols, arrname, arr.capacity, + arr.available_capacity)) + + def show_volume(self, name): + scfg = self.ipmicmd.get_storage_configuration() + for arr in scfg.arrays: + arrname = '{0}-{1}'.format(*arr.id) + for vol in arr.volumes: + if name == simplify_name(vol.name): + self.output.put(msg.Volume(self.node, vol.name, vol.size, + vol.status, arrname)) + def list_volumes(self): scfg = self.ipmicmd.get_storage_configuration() self.output.put(msg.ChildCollection('all'))