diff --git a/confluent_server/confluent/messages.py b/confluent_server/confluent/messages.py index 396cd58f..6f0c3c25 100644 --- a/confluent_server/confluent/messages.py +++ b/confluent_server/confluent/messages.py @@ -515,6 +515,8 @@ def get_input_message(path, operation, inputdata, nodes=None, multinode=False, return InputVolumes(path, nodes, inputdata) elif 'inventory/firmware/updates/active' in '/'.join(path) and inputdata: return InputFirmwareUpdate(path, nodes, inputdata, configmanager) + elif ('/'.join(path).startswith('power/inlets/') or '/'.join(path).startswith('power/outlets/')) and inputdata: + return InputPowerMessage(path, nodes, inputdata) elif '/'.join(path).startswith('media/detach'): return DetachMedia(path, nodes, inputdata) elif '/'.join(path).startswith('media/') and inputdata: diff --git a/confluent_server/confluent/plugins/hardwaremanagement/geist.py b/confluent_server/confluent/plugins/hardwaremanagement/geist.py index acc9713d..979550f5 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/geist.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/geist.py @@ -54,15 +54,20 @@ class GeistClient(object): ['secret.hardwaremanagementuser', 'secret.hardwaremanagementpassword'], decrypt=True) + credcfg = credcfg.get(self.node, {}) username = credcfg.get( 'secret.hardwaremanagementuser', {}).get('value', None) passwd = credcfg.get( 'secret.hardwaremanagementpassword', {}).get('value', None) + if not isinstance(username, str): + username = username.decode('utf8') + if not isinstance(passwd, str): + passwd = passwd.decode('utf8') if not username or not passwd: raise Exception('Missing username or password') self.username = username rsp = self.wc.grab_json_response( - '/api/auth/{0]'.format(username), + '/api/auth/{0}'.format(username), {'cmd': 'login', 'data': {'password': passwd}}) token = rsp['data']['token'] return token @@ -85,7 +90,7 @@ class GeistClient(object): def set_outlet(self, outlet, state): rsp = self.wc.grab_json_response('/api/dev') - if len(rsp['data'] != 1): + if len(rsp['data']) != 1: self.logout() raise Exception('Multiple PDUs per endpoint not supported') pdu = list(rsp['data'])[0] @@ -101,3 +106,10 @@ def retrieve(nodes, element, configmanager, inputdata): gc = GeistClient(node, configmanager) state = gc.get_outlet(element[-1]) yield msg.PowerState(node=node, state=state) + +def update(nodes, element, configmanager, inputdata): + for node in nodes: + gc = GeistClient(node, configmanager) + newstate = inputdata.powerstate(node) + gc.set_outlet(element[-1], newstate) + return retrieve(nodes, element, configmanager, inputdata) \ No newline at end of file diff --git a/confluent_server/confluent/plugins/hardwaremanagement/pdu.py b/confluent_server/confluent/plugins/hardwaremanagement/pdu.py index e7570b4d..825e9609 100644 --- a/confluent_server/confluent/plugins/hardwaremanagement/pdu.py +++ b/confluent_server/confluent/plugins/hardwaremanagement/pdu.py @@ -68,26 +68,12 @@ def get_outlets(nodes, emebs, inletname): def update(nodes, element, configmanager, inputdata): emebs = configmanager.get_node_attributes( nodes, (u'power.*pdu', u'power.*outlet')) - for node in nodes: - for attrib in emebs[node]: - print(repr(attrib)) - try: - em = emebs[node]['enclosure.manager']['value'] - eb = emebs[node]['enclosure.bay']['value'] - except KeyError: - em = node - eb = -1 - if not em: - em = node - if not eb: - eb = -1 - try: - for rsp in core.handle_path( - '/nodes/{0}/_enclosure/reseat_bay'.format(em), - 'update', configmanager, - inputdata={'reseat': int(eb)}): - yield rsp - except pygexc.UnsupportedFunctionality as uf: - yield msg.ConfluentNodeError(node, str(uf)) - except exc.TargetEndpointUnreachable as uf: - yield msg.ConfluentNodeError(node, str(uf)) + inletname = element[-1] + outlets = get_outlets(nodes, emebs, inletname) + for node in outlets: + for pgroup in outlets[node]: + pdu = outlets[node][pgroup]['pdu'] + outlet = outlets[node][pgroup]['outlet'] + for rsp in core.handle_path('/nodes/{0}/power/outlets/{1}'.format(pdu, outlet), + 'update', configmanager, inputdata={'state': inputdata.powerstate(node)}): + yield msg.KeyValueData({pgroup: rsp.kvpairs['state']['value']}, node)