-#!/usr/bin/python
+#
#
# Copyright (C) 2009, Google Inc.
from ganeti import errors
from ganeti import utils
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 = {
- constants.CONFD_REQ_PING: querylib.PingQuery,
- constants.CONFD_REQ_NODE_ROLE_BYNAME: querylib.ConfdQuery,
- constants.CONFD_REQ_NODE_PIP_BY_INSTANCE_IP: querylib.ConfdQuery,
- }
-
- def __init__(self, reader):
+ 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
- @type reader: L{ssconf.SimpleConfigReader}
- @param reader: ConfigReader to use to access the config
-
"""
- 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.
@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)
"""
return serializer.DumpSigned(reply.ToDict(), self.hmac_key, rsalt)
-