1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 """Module for the LUXI protocol
32
33 This module implements the local unix socket protocol. You only need
34 this module and the opcodes module in the client program in order to
35 communicate with the master.
36
37 The module is also used by the master daemon.
38
39 """
40
41 from ganeti import constants
42 from ganeti import pathutils
43 from ganeti import objects
44 import ganeti.rpc.client as cl
45 from ganeti.rpc.errors import RequestError
46 from ganeti.rpc.transport import Transport
47
48 __all__ = [
49
50 "Client"
51 ]
52
53 REQ_SUBMIT_JOB = constants.LUXI_REQ_SUBMIT_JOB
54 REQ_SUBMIT_JOB_TO_DRAINED_QUEUE = constants.LUXI_REQ_SUBMIT_JOB_TO_DRAINED_QUEUE
55 REQ_SUBMIT_MANY_JOBS = constants.LUXI_REQ_SUBMIT_MANY_JOBS
56 REQ_PICKUP_JOB = constants.LUXI_REQ_PICKUP_JOB
57 REQ_WAIT_FOR_JOB_CHANGE = constants.LUXI_REQ_WAIT_FOR_JOB_CHANGE
58 REQ_CANCEL_JOB = constants.LUXI_REQ_CANCEL_JOB
59 REQ_ARCHIVE_JOB = constants.LUXI_REQ_ARCHIVE_JOB
60 REQ_CHANGE_JOB_PRIORITY = constants.LUXI_REQ_CHANGE_JOB_PRIORITY
61 REQ_AUTO_ARCHIVE_JOBS = constants.LUXI_REQ_AUTO_ARCHIVE_JOBS
62 REQ_QUERY = constants.LUXI_REQ_QUERY
63 REQ_QUERY_FIELDS = constants.LUXI_REQ_QUERY_FIELDS
64 REQ_QUERY_JOBS = constants.LUXI_REQ_QUERY_JOBS
65 REQ_QUERY_FILTERS = constants.LUXI_REQ_QUERY_FILTERS
66 REQ_REPLACE_FILTER = constants.LUXI_REQ_REPLACE_FILTER
67 REQ_DELETE_FILTER = constants.LUXI_REQ_DELETE_FILTER
68 REQ_QUERY_INSTANCES = constants.LUXI_REQ_QUERY_INSTANCES
69 REQ_QUERY_NODES = constants.LUXI_REQ_QUERY_NODES
70 REQ_QUERY_GROUPS = constants.LUXI_REQ_QUERY_GROUPS
71 REQ_QUERY_NETWORKS = constants.LUXI_REQ_QUERY_NETWORKS
72 REQ_QUERY_EXPORTS = constants.LUXI_REQ_QUERY_EXPORTS
73 REQ_QUERY_CONFIG_VALUES = constants.LUXI_REQ_QUERY_CONFIG_VALUES
74 REQ_QUERY_CLUSTER_INFO = constants.LUXI_REQ_QUERY_CLUSTER_INFO
75 REQ_QUERY_TAGS = constants.LUXI_REQ_QUERY_TAGS
76 REQ_SET_DRAIN_FLAG = constants.LUXI_REQ_SET_DRAIN_FLAG
77 REQ_SET_WATCHER_PAUSE = constants.LUXI_REQ_SET_WATCHER_PAUSE
78 REQ_ALL = constants.LUXI_REQ_ALL
79
80 DEF_RWTO = constants.LUXI_DEF_RWTO
81 WFJC_TIMEOUT = constants.LUXI_WFJC_TIMEOUT
82
83
84 -class Client(cl.AbstractClient):
85 """High-level client implementation.
86
87 This uses a backing Transport-like class on top of which it
88 implements data serialization/deserialization.
89
90 """
105
108
111
114
117
123
127
133
134 @staticmethod
136 try:
137 return int(job_id)
138 except ValueError:
139 raise RequestError("Invalid parameter passed to %s as job id: "
140 " expected integer, got value %s" %
141 (request_name, job_id))
142
146
150
154
158
162 """Waits for changes on a job.
163
164 @param job_id: Job ID
165 @type fields: list
166 @param fields: List of field names to be observed
167 @type prev_job_info: None or list
168 @param prev_job_info: Previously received job information
169 @type prev_log_serial: None or int/long
170 @param prev_log_serial: Highest log serial number previously received
171 @type timeout: int/float
172 @param timeout: Timeout in seconds (values larger than L{WFJC_TIMEOUT} will
173 be capped to that value)
174
175 """
176 assert timeout >= 0, "Timeout can not be negative"
177 return self.CallMethod(REQ_WAIT_FOR_JOB_CHANGE,
178 (job_id, fields, prev_job_info,
179 prev_log_serial,
180 min(WFJC_TIMEOUT, timeout)))
181
190
191 - def Query(self, what, fields, qfilter):
192 """Query for resources/items.
193
194 @param what: One of L{constants.QR_VIA_LUXI}
195 @type fields: List of strings
196 @param fields: List of requested fields
197 @type qfilter: None or list
198 @param qfilter: Query filter
199 @rtype: L{objects.QueryResponse}
200
201 """
202 result = self.CallMethod(REQ_QUERY, (what, fields, qfilter))
203 return objects.QueryResponse.FromDict(result)
204
206 """Query for available fields.
207
208 @param what: One of L{constants.QR_VIA_LUXI}
209 @type fields: None or list of strings
210 @param fields: List of requested fields
211 @rtype: L{objects.QueryFieldsResponse}
212
213 """
214 result = self.CallMethod(REQ_QUERY_FIELDS, (what, fields))
215 return objects.QueryFieldsResponse.FromDict(result)
216
219
222
223 - def ReplaceFilter(self, uuid, priority, predicates, action, reason):
226
229
232
233 - def QueryNodes(self, names, fields, use_locking):
235
238
241
244
247
250
253