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_INSTANCES = constants.LUXI_REQ_QUERY_INSTANCES
66 REQ_QUERY_NODES = constants.LUXI_REQ_QUERY_NODES
67 REQ_QUERY_GROUPS = constants.LUXI_REQ_QUERY_GROUPS
68 REQ_QUERY_NETWORKS = constants.LUXI_REQ_QUERY_NETWORKS
69 REQ_QUERY_EXPORTS = constants.LUXI_REQ_QUERY_EXPORTS
70 REQ_QUERY_CONFIG_VALUES = constants.LUXI_REQ_QUERY_CONFIG_VALUES
71 REQ_QUERY_CLUSTER_INFO = constants.LUXI_REQ_QUERY_CLUSTER_INFO
72 REQ_QUERY_TAGS = constants.LUXI_REQ_QUERY_TAGS
73 REQ_SET_DRAIN_FLAG = constants.LUXI_REQ_SET_DRAIN_FLAG
74 REQ_SET_WATCHER_PAUSE = constants.LUXI_REQ_SET_WATCHER_PAUSE
75 REQ_ALL = constants.LUXI_REQ_ALL
76
77 DEF_RWTO = constants.LUXI_DEF_RWTO
78 WFJC_TIMEOUT = constants.LUXI_WFJC_TIMEOUT
79
80
81 -class Client(cl.AbstractClient):
82 """High-level client implementation.
83
84 This uses a backing Transport-like class on top of which it
85 implements data serialization/deserialization.
86
87 """
102
105
108
111
114
120
124
130
131 @staticmethod
133 try:
134 return int(job_id)
135 except ValueError:
136 raise RequestError("Invalid parameter passed to %s as job id: "
137 " expected integer, got value %s" %
138 (request_name, job_id))
139
143
147
151
155
159 """Waits for changes on a job.
160
161 @param job_id: Job ID
162 @type fields: list
163 @param fields: List of field names to be observed
164 @type prev_job_info: None or list
165 @param prev_job_info: Previously received job information
166 @type prev_log_serial: None or int/long
167 @param prev_log_serial: Highest log serial number previously received
168 @type timeout: int/float
169 @param timeout: Timeout in seconds (values larger than L{WFJC_TIMEOUT} will
170 be capped to that value)
171
172 """
173 assert timeout >= 0, "Timeout can not be negative"
174 return self.CallMethod(REQ_WAIT_FOR_JOB_CHANGE,
175 (job_id, fields, prev_job_info,
176 prev_log_serial,
177 min(WFJC_TIMEOUT, timeout)))
178
187
188 - def Query(self, what, fields, qfilter):
189 """Query for resources/items.
190
191 @param what: One of L{constants.QR_VIA_LUXI}
192 @type fields: List of strings
193 @param fields: List of requested fields
194 @type qfilter: None or list
195 @param qfilter: Query filter
196 @rtype: L{objects.QueryResponse}
197
198 """
199 result = self.CallMethod(REQ_QUERY, (what, fields, qfilter))
200 return objects.QueryResponse.FromDict(result)
201
203 """Query for available fields.
204
205 @param what: One of L{constants.QR_VIA_LUXI}
206 @type fields: None or list of strings
207 @param fields: List of requested fields
208 @rtype: L{objects.QueryFieldsResponse}
209
210 """
211 result = self.CallMethod(REQ_QUERY_FIELDS, (what, fields))
212 return objects.QueryFieldsResponse.FromDict(result)
213
216
219
220 - def QueryNodes(self, names, fields, use_locking):
222
225
228
231
234
237
240