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
|