Statistics
| Branch: | Tag: | Revision:

root / lib / confd / querylib.py @ 6daf26a0

History | View | Annotate | Download (2.9 kB)

1 e16e4824 Guido Trotter
#!/usr/bin/python
2 e16e4824 Guido Trotter
#
3 e16e4824 Guido Trotter
4 e16e4824 Guido Trotter
# Copyright (C) 2009, Google Inc.
5 e16e4824 Guido Trotter
#
6 e16e4824 Guido Trotter
# This program is free software; you can redistribute it and/or modify
7 e16e4824 Guido Trotter
# it under the terms of the GNU General Public License as published by
8 e16e4824 Guido Trotter
# the Free Software Foundation; either version 2 of the License, or
9 e16e4824 Guido Trotter
# (at your option) any later version.
10 e16e4824 Guido Trotter
#
11 e16e4824 Guido Trotter
# This program is distributed in the hope that it will be useful, but
12 e16e4824 Guido Trotter
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 e16e4824 Guido Trotter
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 e16e4824 Guido Trotter
# General Public License for more details.
15 e16e4824 Guido Trotter
#
16 e16e4824 Guido Trotter
# You should have received a copy of the GNU General Public License
17 e16e4824 Guido Trotter
# along with this program; if not, write to the Free Software
18 e16e4824 Guido Trotter
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 e16e4824 Guido Trotter
# 02110-1301, USA.
20 e16e4824 Guido Trotter
21 e16e4824 Guido Trotter
22 e16e4824 Guido Trotter
"""Ganeti configuration daemon queries library.
23 e16e4824 Guido Trotter

24 e16e4824 Guido Trotter
"""
25 e16e4824 Guido Trotter
26 e16e4824 Guido Trotter
from ganeti import constants
27 e16e4824 Guido Trotter
28 e16e4824 Guido Trotter
29 e16e4824 Guido Trotter
class ConfdQuery(object):
30 e16e4824 Guido Trotter
  """Confd Query base class.
31 e16e4824 Guido Trotter

32 e16e4824 Guido Trotter
  """
33 e16e4824 Guido Trotter
  def __init__(self, reader):
34 e16e4824 Guido Trotter
    """Constructor for Confd Query
35 e16e4824 Guido Trotter

36 e16e4824 Guido Trotter
    @type reader: L{ssconf.SimpleConfigReader}
37 e16e4824 Guido Trotter
    @param reader: ConfigReader to use to access the config
38 e16e4824 Guido Trotter

39 e16e4824 Guido Trotter
    """
40 e16e4824 Guido Trotter
    self.reader = reader
41 e16e4824 Guido Trotter
42 e16e4824 Guido Trotter
  def Exec(self, query):
43 e16e4824 Guido Trotter
    """Process a single UDP request from a client.
44 e16e4824 Guido Trotter

45 e16e4824 Guido Trotter
    Different queries should override this function, which by defaults returns
46 e16e4824 Guido Trotter
    a "non-implemented" answer.
47 e16e4824 Guido Trotter

48 e16e4824 Guido Trotter
    @type query: (undefined)
49 e16e4824 Guido Trotter
    @param query: ConfdRequest 'query' field
50 e16e4824 Guido Trotter
    @rtype: (integer, undefined)
51 e16e4824 Guido Trotter
    @return: status and answer to give to the client
52 e16e4824 Guido Trotter

53 e16e4824 Guido Trotter
    """
54 e16e4824 Guido Trotter
    status = constants.CONFD_REPL_STATUS_NOTIMPLEMENTED
55 e16e4824 Guido Trotter
    answer = 'not implemented'
56 e16e4824 Guido Trotter
    return status, answer
57 e16e4824 Guido Trotter
58 e16e4824 Guido Trotter
59 e16e4824 Guido Trotter
class PingQuery(ConfdQuery):
60 e16e4824 Guido Trotter
  """An empty confd query.
61 e16e4824 Guido Trotter

62 e16e4824 Guido Trotter
  It will return success on an empty argument, and an error on any other argument.
63 e16e4824 Guido Trotter

64 e16e4824 Guido Trotter
  """
65 e16e4824 Guido Trotter
  def Exec(self, query):
66 e16e4824 Guido Trotter
    """EmptyQuery main execution
67 e16e4824 Guido Trotter

68 e16e4824 Guido Trotter
    """
69 e16e4824 Guido Trotter
    if query is None:
70 e16e4824 Guido Trotter
      status = constants.CONFD_REPL_STATUS_OK
71 e16e4824 Guido Trotter
      answer = 'ok'
72 e16e4824 Guido Trotter
    else:
73 e16e4824 Guido Trotter
      status = constants.CONFD_REPL_STATUS_ERROR
74 e16e4824 Guido Trotter
      answer = 'non-empty ping query'
75 e16e4824 Guido Trotter
76 e16e4824 Guido Trotter
    return status, answer
77 e16e4824 Guido Trotter
78 6daf26a0 Guido Trotter
79 6daf26a0 Guido Trotter
class NodeRoleQuery(ConfdQuery):
80 6daf26a0 Guido Trotter
  """An empty confd query.
81 6daf26a0 Guido Trotter

82 6daf26a0 Guido Trotter
  It will return success on an empty argument, and an error on any other argument.
83 6daf26a0 Guido Trotter

84 6daf26a0 Guido Trotter
  """
85 6daf26a0 Guido Trotter
  def Exec(self, query):
86 6daf26a0 Guido Trotter
    """EmptyQuery main execution
87 6daf26a0 Guido Trotter

88 6daf26a0 Guido Trotter
    """
89 6daf26a0 Guido Trotter
    node = query
90 6daf26a0 Guido Trotter
    if self.reader.GetMasterNode() == node:
91 6daf26a0 Guido Trotter
      status = constants.CONFD_REPL_STATUS_OK
92 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_MASTER
93 6daf26a0 Guido Trotter
      return status, answer
94 6daf26a0 Guido Trotter
    flags = self.reader.GetNodeStatusFlags(node)
95 6daf26a0 Guido Trotter
    if flags is None:
96 6daf26a0 Guido Trotter
      status = constants.CONFD_REPL_STATUS_ERROR
97 6daf26a0 Guido Trotter
      answer = constants.CONFD_ERROR_UNKNOWN_ENTRY
98 6daf26a0 Guido Trotter
      return status, answer
99 6daf26a0 Guido Trotter
100 6daf26a0 Guido Trotter
    master_candidate, drained, offline = flags
101 6daf26a0 Guido Trotter
    if master_candidate:
102 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_CANDIDATE
103 6daf26a0 Guido Trotter
    elif drained:
104 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_DRAINED
105 6daf26a0 Guido Trotter
    elif offline:
106 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_OFFLINE
107 6daf26a0 Guido Trotter
    else:
108 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_REGULAR
109 6daf26a0 Guido Trotter
110 6daf26a0 Guido Trotter
    return constants.CONFD_REPL_STATUS_OK, answer