X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/71f27d198a03327c5ff3e6655beb736a04011541..087ed2edee08da7bd3c4872cabde13c57585ca5a:/lib/confd/server.py diff --git a/lib/confd/server.py b/lib/confd/server.py index 436156d..0df0061 100644 --- a/lib/confd/server.py +++ b/lib/confd/server.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +# # # Copyright (C) 2009, Google Inc. @@ -26,36 +26,58 @@ It uses UDP+HMAC for authentication with a global cluster key. """ -import sys import logging import time -from optparse import OptionParser - from ganeti import constants from ganeti import objects from ganeti import errors from ganeti import utils -from ganeti import ssconf from ganeti import serializer +from ganeti import ssconf + +from ganeti.confd import querylib class ConfdProcessor(object): """A processor for confd requests. + @ivar reader: confd SimpleConfigReader + @ivar disabled: whether confd serving is disabled + """ DISPATCH_TABLE = { - } - - def __init__(self, reader): - """Constructor for ConfdAsyncUDPServer - - @type reader: L{ssconf.SimpleConfigReader} - @param reader: ConfigReader to use to access the config + constants.CONFD_REQ_PING: querylib.PingQuery, + constants.CONFD_REQ_NODE_ROLE_BYNAME: querylib.NodeRoleQuery, + constants.CONFD_REQ_NODE_PIP_BY_INSTANCE_IP: + querylib.InstanceIpToNodePrimaryIpQuery, + constants.CONFD_REQ_CLUSTER_MASTER: querylib.ClusterMasterQuery, + constants.CONFD_REQ_NODE_PIP_LIST: querylib.NodesPipsQuery, + constants.CONFD_REQ_MC_PIP_LIST: querylib.MasterCandidatesPipsQuery, + } + + def __init__(self): + """Constructor for ConfdProcessor """ - self.reader = reader + self.disabled = True self.hmac_key = utils.ReadFile(constants.HMAC_CLUSTER_KEY) + self.reader = None + assert \ + not constants.CONFD_REQS.symmetric_difference(self.DISPATCH_TABLE), \ + "DISPATCH_TABLE is unaligned with CONFD_REQS" + + def Enable(self): + try: + self.reader = ssconf.SimpleConfigReader() + self.disabled = False + except errors.ConfigurationError: + self.disabled = True + raise + + def Disable(self): + self.disabled = True + self.reader = None def ExecQuery(self, payload_in, ip, port): """Process a single UDP request from a client. @@ -68,6 +90,9 @@ class ConfdProcessor(object): @type port: source port """ + if self.disabled: + logging.debug('Confd is disabled. Ignoring query.') + return try: request = self.ExtractRequest(payload_in) reply, rsalt = self.ProcessRequest(request) @@ -130,17 +155,14 @@ class ConfdProcessor(object): msg = "missing requested salt" raise errors.ConfdRequestError(msg) - if request.type not in self.DISPATCH_TABLE: - answer = 'not implemented' - status = constants.CONFD_REPL_STATUS_NOTIMPLEMENTED - reply = objects.ConfdReply( - protocol=constants.CONFD_PROTOCOL_VERSION, - status=status, - answer=answer, - ) - else: - # TODO: actually dispatch queries to some classes to handle them - assert False, "DISPATCH_TABLE is populated but handler is not" + query_object = self.DISPATCH_TABLE[request.type](self.reader) + status, answer = query_object.Exec(request.query) + reply = objects.ConfdReply( + protocol=constants.CONFD_PROTOCOL_VERSION, + status=status, + answer=answer, + serial=self.reader.GetConfigSerialNo(), + ) logging.debug("Sending reply: %s" % reply) @@ -154,4 +176,3 @@ class ConfdProcessor(object): """ return serializer.DumpSigned(reply.ToDict(), self.hmac_key, rsalt) -