Statistics
| Branch: | Tag: | Revision:

root / lib / confd / querylib.py @ 23824641

History | View | Annotate | Download (5.9 kB)

1 d73ef63f Michael Hanselmann
#
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 53bd7366 Guido Trotter
import logging
27 53bd7366 Guido Trotter
28 e16e4824 Guido Trotter
from ganeti import constants
29 e16e4824 Guido Trotter
30 d73ef63f Michael Hanselmann
31 7189e790 Guido Trotter
# constants for some common errors to return from a query
32 7189e790 Guido Trotter
QUERY_UNKNOWN_ENTRY_ERROR = (constants.CONFD_REPL_STATUS_ERROR,
33 7189e790 Guido Trotter
                             constants.CONFD_ERROR_UNKNOWN_ENTRY)
34 7189e790 Guido Trotter
QUERY_INTERNAL_ERROR = (constants.CONFD_REPL_STATUS_ERROR,
35 7189e790 Guido Trotter
                        constants.CONFD_ERROR_INTERNAL)
36 e16e4824 Guido Trotter
37 d73ef63f Michael Hanselmann
38 e16e4824 Guido Trotter
class ConfdQuery(object):
39 e16e4824 Guido Trotter
  """Confd Query base class.
40 e16e4824 Guido Trotter

41 e16e4824 Guido Trotter
  """
42 e16e4824 Guido Trotter
  def __init__(self, reader):
43 e16e4824 Guido Trotter
    """Constructor for Confd Query
44 e16e4824 Guido Trotter

45 e16e4824 Guido Trotter
    @type reader: L{ssconf.SimpleConfigReader}
46 e16e4824 Guido Trotter
    @param reader: ConfigReader to use to access the config
47 e16e4824 Guido Trotter

48 e16e4824 Guido Trotter
    """
49 e16e4824 Guido Trotter
    self.reader = reader
50 e16e4824 Guido Trotter
51 e16e4824 Guido Trotter
  def Exec(self, query):
52 e16e4824 Guido Trotter
    """Process a single UDP request from a client.
53 e16e4824 Guido Trotter

54 e16e4824 Guido Trotter
    Different queries should override this function, which by defaults returns
55 e16e4824 Guido Trotter
    a "non-implemented" answer.
56 e16e4824 Guido Trotter

57 e16e4824 Guido Trotter
    @type query: (undefined)
58 e16e4824 Guido Trotter
    @param query: ConfdRequest 'query' field
59 e16e4824 Guido Trotter
    @rtype: (integer, undefined)
60 e16e4824 Guido Trotter
    @return: status and answer to give to the client
61 e16e4824 Guido Trotter

62 e16e4824 Guido Trotter
    """
63 e16e4824 Guido Trotter
    status = constants.CONFD_REPL_STATUS_NOTIMPLEMENTED
64 e16e4824 Guido Trotter
    answer = 'not implemented'
65 e16e4824 Guido Trotter
    return status, answer
66 e16e4824 Guido Trotter
67 e16e4824 Guido Trotter
68 e16e4824 Guido Trotter
class PingQuery(ConfdQuery):
69 e16e4824 Guido Trotter
  """An empty confd query.
70 e16e4824 Guido Trotter

71 4d4a651d Michael Hanselmann
  It will return success on an empty argument, and an error on any other
72 4d4a651d Michael Hanselmann
  argument.
73 e16e4824 Guido Trotter

74 e16e4824 Guido Trotter
  """
75 e16e4824 Guido Trotter
  def Exec(self, query):
76 0bc8432b Guido Trotter
    """PingQuery main execution.
77 e16e4824 Guido Trotter

78 e16e4824 Guido Trotter
    """
79 e16e4824 Guido Trotter
    if query is None:
80 e16e4824 Guido Trotter
      status = constants.CONFD_REPL_STATUS_OK
81 e16e4824 Guido Trotter
      answer = 'ok'
82 e16e4824 Guido Trotter
    else:
83 e16e4824 Guido Trotter
      status = constants.CONFD_REPL_STATUS_ERROR
84 e16e4824 Guido Trotter
      answer = 'non-empty ping query'
85 e16e4824 Guido Trotter
86 e16e4824 Guido Trotter
    return status, answer
87 e16e4824 Guido Trotter
88 d73ef63f Michael Hanselmann
89 48166551 Guido Trotter
class ClusterMasterQuery(ConfdQuery):
90 48166551 Guido Trotter
  """Cluster master query.
91 48166551 Guido Trotter

92 48166551 Guido Trotter
  It accepts no arguments, and returns the current cluster master.
93 48166551 Guido Trotter

94 48166551 Guido Trotter
  """
95 48166551 Guido Trotter
  def Exec(self, query):
96 48166551 Guido Trotter
    """ClusterMasterQuery main execution
97 48166551 Guido Trotter

98 48166551 Guido Trotter
    """
99 48166551 Guido Trotter
    if query is None:
100 48166551 Guido Trotter
      status = constants.CONFD_REPL_STATUS_OK
101 48166551 Guido Trotter
      answer = self.reader.GetMasterNode()
102 48166551 Guido Trotter
    else:
103 48166551 Guido Trotter
      status = constants.CONFD_REPL_STATUS_ERROR
104 48166551 Guido Trotter
      answer = 'master query accepts no query argument'
105 48166551 Guido Trotter
106 48166551 Guido Trotter
    return status, answer
107 48166551 Guido Trotter
108 6daf26a0 Guido Trotter
109 6daf26a0 Guido Trotter
class NodeRoleQuery(ConfdQuery):
110 0bc8432b Guido Trotter
  """A query for the role of a node.
111 6daf26a0 Guido Trotter

112 0bc8432b Guido Trotter
  It will return one of CONFD_NODE_ROLE_*, or an error for non-existing nodes.
113 6daf26a0 Guido Trotter

114 6daf26a0 Guido Trotter
  """
115 6daf26a0 Guido Trotter
  def Exec(self, query):
116 6daf26a0 Guido Trotter
    """EmptyQuery main execution
117 6daf26a0 Guido Trotter

118 6daf26a0 Guido Trotter
    """
119 6daf26a0 Guido Trotter
    node = query
120 6daf26a0 Guido Trotter
    if self.reader.GetMasterNode() == node:
121 6daf26a0 Guido Trotter
      status = constants.CONFD_REPL_STATUS_OK
122 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_MASTER
123 6daf26a0 Guido Trotter
      return status, answer
124 6daf26a0 Guido Trotter
    flags = self.reader.GetNodeStatusFlags(node)
125 6daf26a0 Guido Trotter
    if flags is None:
126 7189e790 Guido Trotter
      return QUERY_UNKNOWN_ENTRY_ERROR
127 6daf26a0 Guido Trotter
128 6daf26a0 Guido Trotter
    master_candidate, drained, offline = flags
129 6daf26a0 Guido Trotter
    if master_candidate:
130 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_CANDIDATE
131 6daf26a0 Guido Trotter
    elif drained:
132 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_DRAINED
133 6daf26a0 Guido Trotter
    elif offline:
134 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_OFFLINE
135 6daf26a0 Guido Trotter
    else:
136 6daf26a0 Guido Trotter
      answer = constants.CONFD_NODE_ROLE_REGULAR
137 6daf26a0 Guido Trotter
138 6daf26a0 Guido Trotter
    return constants.CONFD_REPL_STATUS_OK, answer
139 6daf26a0 Guido Trotter
140 53bd7366 Guido Trotter
141 53bd7366 Guido Trotter
class InstanceIpToNodePrimaryIpQuery(ConfdQuery):
142 0bc8432b Guido Trotter
  """A query for the location of an instance's ip.
143 53bd7366 Guido Trotter

144 0bc8432b Guido Trotter
  It returns the primary ip of the node hosting the instance having the
145 0bc8432b Guido Trotter
  requested ip address, or an error if no such address is known.
146 53bd7366 Guido Trotter

147 53bd7366 Guido Trotter
  """
148 53bd7366 Guido Trotter
  def Exec(self, query):
149 0bc8432b Guido Trotter
    """InstanceIpToNodePrimaryIpQuery main execution.
150 53bd7366 Guido Trotter

151 53bd7366 Guido Trotter
    """
152 53bd7366 Guido Trotter
    instance_ip = query
153 53bd7366 Guido Trotter
    instance = self.reader.GetInstanceByIp(instance_ip)
154 53bd7366 Guido Trotter
    if instance is None:
155 53bd7366 Guido Trotter
      return QUERY_UNKNOWN_ENTRY_ERROR
156 53bd7366 Guido Trotter
157 53bd7366 Guido Trotter
    pnode = self.reader.GetInstancePrimaryNode(instance)
158 53bd7366 Guido Trotter
    if pnode is None:
159 53bd7366 Guido Trotter
      # this shouldn't happen
160 53bd7366 Guido Trotter
      logging.error("Internal configuration inconsistent (instance-to-pnode)")
161 53bd7366 Guido Trotter
      return QUERY_INTERNAL_ERROR
162 53bd7366 Guido Trotter
163 53bd7366 Guido Trotter
    pnode_primary_ip = self.reader.GetNodePrimaryIp(pnode)
164 53bd7366 Guido Trotter
    if pnode_primary_ip is None:
165 53bd7366 Guido Trotter
      # this shouldn't happen
166 53bd7366 Guido Trotter
      logging.error("Internal configuration inconsistent (node-to-primary-ip)")
167 53bd7366 Guido Trotter
      return QUERY_INTERNAL_ERROR
168 53bd7366 Guido Trotter
169 53bd7366 Guido Trotter
    return constants.CONFD_REPL_STATUS_OK, pnode_primary_ip
170 efbb4fd2 Luca Bigliardi
171 efbb4fd2 Luca Bigliardi
172 efbb4fd2 Luca Bigliardi
class NodesPipsQuery(ConfdQuery):
173 efbb4fd2 Luca Bigliardi
  """A query for nodes primary IPs.
174 efbb4fd2 Luca Bigliardi

175 efbb4fd2 Luca Bigliardi
  It returns the list of nodes primary IPs.
176 efbb4fd2 Luca Bigliardi

177 efbb4fd2 Luca Bigliardi
  """
178 efbb4fd2 Luca Bigliardi
  def Exec(self, query):
179 efbb4fd2 Luca Bigliardi
    """NodesPipsQuery main execution.
180 efbb4fd2 Luca Bigliardi

181 efbb4fd2 Luca Bigliardi
    """
182 efbb4fd2 Luca Bigliardi
    if query is None:
183 efbb4fd2 Luca Bigliardi
      status = constants.CONFD_REPL_STATUS_OK
184 efbb4fd2 Luca Bigliardi
      answer = self.reader.GetNodesPrimaryIps()
185 efbb4fd2 Luca Bigliardi
    else:
186 efbb4fd2 Luca Bigliardi
      status = constants.CONFD_REPL_STATUS_ERROR
187 efbb4fd2 Luca Bigliardi
      answer = "non-empty node primary IPs query"
188 efbb4fd2 Luca Bigliardi
189 efbb4fd2 Luca Bigliardi
    return status, answer
190 efbb4fd2 Luca Bigliardi
191 efbb4fd2 Luca Bigliardi
192 efbb4fd2 Luca Bigliardi
class MasterCandidatesPipsQuery(ConfdQuery):
193 efbb4fd2 Luca Bigliardi
  """A query for master candidates primary IPs.
194 efbb4fd2 Luca Bigliardi

195 efbb4fd2 Luca Bigliardi
  It returns the list of master candidates primary IPs.
196 efbb4fd2 Luca Bigliardi

197 efbb4fd2 Luca Bigliardi
  """
198 efbb4fd2 Luca Bigliardi
  def Exec(self, query):
199 efbb4fd2 Luca Bigliardi
    """MasterCandidatesPipsQuery main execution.
200 efbb4fd2 Luca Bigliardi

201 efbb4fd2 Luca Bigliardi
    """
202 efbb4fd2 Luca Bigliardi
    if query is None:
203 efbb4fd2 Luca Bigliardi
      status = constants.CONFD_REPL_STATUS_OK
204 efbb4fd2 Luca Bigliardi
      answer = self.reader.GetMasterCandidatesPrimaryIps()
205 efbb4fd2 Luca Bigliardi
    else:
206 efbb4fd2 Luca Bigliardi
      status = constants.CONFD_REPL_STATUS_ERROR
207 efbb4fd2 Luca Bigliardi
      answer = "non-empty master candidates primary IPs query"
208 efbb4fd2 Luca Bigliardi
209 efbb4fd2 Luca Bigliardi
    return status, answer
210 efbb4fd2 Luca Bigliardi
211 d01ae714 Luca Bigliardi
212 d01ae714 Luca Bigliardi
class InstancesIpsQuery(ConfdQuery):
213 d01ae714 Luca Bigliardi
  """A query for instances IPs.
214 d01ae714 Luca Bigliardi

215 23824641 Luca Bigliardi
  It returns the list of IPs of NICs connected to the requested link or all the
216 23824641 Luca Bigliardi
  instances IPs if no link is submitted.
217 d01ae714 Luca Bigliardi

218 d01ae714 Luca Bigliardi
  """
219 d01ae714 Luca Bigliardi
  def Exec(self, query):
220 d01ae714 Luca Bigliardi
    """InstancesIpsQuery main execution.
221 d01ae714 Luca Bigliardi

222 d01ae714 Luca Bigliardi
    """
223 23824641 Luca Bigliardi
    link = query
224 23824641 Luca Bigliardi
    status = constants.CONFD_REPL_STATUS_OK
225 23824641 Luca Bigliardi
    answer = self.reader.GetInstancesIps(link)
226 d01ae714 Luca Bigliardi
227 d01ae714 Luca Bigliardi
    return status, answer