diff --git a/confluent/httpapi.py b/confluent/httpapi.py index ca590949..6724a338 100644 --- a/confluent/httpapi.py +++ b/confluent/httpapi.py @@ -203,7 +203,8 @@ def resourcehandler(env, start_response): operation = opmap[env['REQUEST_METHOD']] resource = '.' + env['PATH_INFO'][env['PATH_INFO'].rindex('/'):] try: - hdlr = pluginapi.handle_path(env['PATH_INFO'], operation, cfgmgr) + hdlr = pluginapi.handle_path(env['PATH_INFO'], operation, + cfgmgr, querydict) except exc.NotFoundException: start_response('404 Not found', headers) yield "404 - Request path not recognized" diff --git a/confluent/pluginapi.py b/confluent/pluginapi.py index d55a8408..4f227260 100644 --- a/confluent/pluginapi.py +++ b/confluent/pluginapi.py @@ -84,7 +84,7 @@ def stripnode(iterablersp, node): i.strip_node(node) yield i -def handle_path(path, operation, configmanager): +def handle_path(path, operation, configmanager, inputdata=None): '''Given a full path request, return an object. The plugins should generally return some sort of iterator. @@ -103,7 +103,8 @@ def handle_path(path, operation, configmanager): if 'handler' in plugroute: #fixed handler definition passvalue = pluginmap[plugroute['handler']].__dict__[operation]( nodes=(node,), element=element, - configmanager=configmanager) + configmanager=configmanager, + inputdata=inputdata) elif 'pluginattrs' in plugroute: nodeattr = configmanager.get_node_attributes( [node], plugroute['pluginattrs']) @@ -111,10 +112,12 @@ def handle_path(path, operation, configmanager): if attrname in nodeattr[node]: passvalue = pluginmap[nodeattr[node][attrname]['value']].__dict__[operation]( nodes=(node,), element=element, - configmanager=configmanager) + configmanager=configmanager, + inputdata=inputdata) if 'default' in plugroute: passvalue = pluginmap[plugroute['default']].__dict__[operation]( - nodes=(node,), element=element, configmanager=configmanager) + nodes=(node,), element=element, configmanager=configmanager, + inputdata=inputdata) if isinstance(passvalue, console.Console): return passvalue else: diff --git a/plugins/configuration/attributes.py b/plugins/configuration/attributes.py index c6411e7a..33ab65b6 100644 --- a/plugins/configuration/attributes.py +++ b/plugins/configuration/attributes.py @@ -1,6 +1,6 @@ import confluent.messages as msg -def retrieve(nodes, element, configmanager): +def retrieve(nodes, element, configmanager, inputdata): attributes = configmanager.get_node_attributes(nodes) for node in attributes.iterkeys(): for attribute in attributes[node].iterkeys(): diff --git a/plugins/hardwaremanagement/ipmi.py b/plugins/hardwaremanagement/ipmi.py index 8cd466c0..4ab907cb 100644 --- a/plugins/hardwaremanagement/ipmi.py +++ b/plugins/hardwaremanagement/ipmi.py @@ -168,7 +168,7 @@ class IpmiConsole(confluent.interface.console.Console): class IpmiIterator(object): - def __init__(self, operator, nodes, element, cfg): + def __init__(self, operator, nodes, element, cfg, inputdata): crypt = cfg.decrypt cfg.decrypt = True configdata = cfg.get_node_attributes(nodes, @@ -178,7 +178,7 @@ class IpmiIterator(object): cfg.decrypt = crypt self.gpile = greenpool.GreenPile() for node in nodes: - self.gpile.spawn(perform_request, operator, node, element, configdata) + self.gpile.spawn(perform_request, operator, node, element, configdata, inputdata) def __iter__(self): return self @@ -189,15 +189,15 @@ class IpmiIterator(object): return ndata -def perform_request(operator, node, element, configdata): - return IpmiHandler(operator, node, element, configdata).handle_request() +def perform_request(operator, node, element, configdata, inputdata): + return IpmiHandler(operator, node, element, configdata, inputdata).handle_request() class IpmiHandler(object): def __iter__(): return self - def __init__(self, operation, node, element, cfd): + def __init__(self, operation, node, element, cfd, inputdata): global chainpulled global _ipmithread global pullchain @@ -212,6 +212,7 @@ class IpmiHandler(object): self.op = operation connparams = get_conn_params(node, self.cfg) self.ipmicmd = None + self.inputdata = inputdata ipmiq.append((ipmicommand.Command,{'bmc': connparams['bmc'], 'userid': connparams['username'], 'password': connparams['passphrase'], @@ -255,18 +256,26 @@ class IpmiHandler(object): power = self.call_ipmicmd(self.ipmicmd.get_power) return msg.PowerState(node=self.node, state=power['powerstate']) + elif 'update' == self.op: + self.call_ipmicmd(self.ipmicmd.set_power, self.inputdata['powerstate']) + power = self.call_ipmicmd(self.ipmicmd.get_power) + print repr(power) -def create(nodes, element, configmanager): + + +def create(nodes, element, configmanager, inputdata): if element == '_console/session': if len(nodes) > 1: raise Exception("_console/session does not support multiple nodes") return IpmiConsole(nodes[0], configmanager) else: - raise Exception( - "TODO(jbjohnso): ipmi api implementation of %s" % element) + return IpmiIterator('update', nodes, element, configmanager, inputdata) + +def update(nodes, element, configmanager, inputdata): + create(nodes, element, configmanager, inputdata) -def retrieve(nodes, element, configmanager): - return IpmiIterator('read', nodes, element, configmanager) +def retrieve(nodes, element, configmanager, inputdata): + return IpmiIterator('read', nodes, element, configmanager, inputdata)