Revision 632
Added by Borja Sotomayor almost 15 years ago
rpc_commands.py | ||
---|---|---|
16 | 16 |
# limitations under the License. # |
17 | 17 |
# -------------------------------------------------------------------------- # |
18 | 18 |
import haizea.common.defaults as defaults |
19 |
from haizea.resourcemanager.datastruct import Lease |
|
19 |
import haizea.common.constants as constants |
|
20 |
from haizea.core.leases import Lease, Capacity, Duration, Timestamp, DiskImageSoftwareEnvironment |
|
21 |
from haizea.common.utils import round_datetime |
|
20 | 22 |
from haizea.cli.optionparser import OptionParser, Option |
21 | 23 |
from haizea.cli import Command |
22 | 24 |
import xmlrpclib |
23 | 25 |
import sys |
24 |
from mx.DateTime import TimeDelta |
|
25 |
from mx.DateTime import ISO
|
|
26 |
from mx.DateTime import TimeDelta, ISO, now
|
|
27 |
import xml.etree.ElementTree as ET
|
|
26 | 28 |
|
27 | 29 |
class RPCCommand(Command): |
28 | 30 |
def __init__(self, argv): |
... | ... | |
41 | 43 |
""" |
42 | 44 |
|
43 | 45 |
name = "haizea-request-lease" |
46 |
|
|
47 |
START_NOW = "now" |
|
48 |
START_BESTEFFORT = "best_effort" |
|
49 |
DURATION_UNLIMITED = "unlimited" |
|
44 | 50 |
|
45 | 51 |
def __init__(self, argv): |
46 | 52 |
RPCCommand.__init__(self, argv) |
47 | 53 |
|
54 |
self.optparser.add_option(Option("-f", "--file", action="store", type="string", dest="file", |
|
55 |
help = """ |
|
56 |
File containing a lease description in XML. |
|
57 |
""")) |
|
48 | 58 |
self.optparser.add_option(Option("-t", "--start", action="store", type="string", dest="start", |
49 | 59 |
help = """ |
50 | 60 |
Starting time. Can be an ISO timestamp, "best_effort", or "now" |
... | ... | |
65 | 75 |
help = """ |
66 | 76 |
Specifies a non-preemptible lease. |
67 | 77 |
""")) |
68 |
self.optparser.add_option(Option("-c", "--cpu", action="store", type="float", dest="cpu",
|
|
78 |
self.optparser.add_option(Option("-c", "--cpu", action="store", type="int", dest="cpu",
|
|
69 | 79 |
help = """ |
70 |
Percentage of CPU (must be 0 < c <= 1.0)
|
|
80 |
Percentage of CPU (must be 0 < c <= 100)
|
|
71 | 81 |
""")) |
72 | 82 |
self.optparser.add_option(Option("-m", "--mem", action="store", type="int", dest="mem", |
73 | 83 |
help = """ |
... | ... | |
85 | 95 |
def run(self): |
86 | 96 |
self.parse_options() |
87 | 97 |
|
88 |
if self.opt.preemptible == None: |
|
89 |
preemptible = False |
|
98 |
if self.opt.file != None: |
|
99 |
lease_elem = ET.parse(self.opt.file).getroot() |
|
100 |
# If a relative starting time is used, replace for an |
|
101 |
# absolute starting time. |
|
102 |
exact = lease.find("start/exact") |
|
103 |
if exact != None: |
|
104 |
exact_time = exact.get("time") |
|
105 |
exact.set("time", str(self.__absolute_time(exact_time))) |
|
106 |
lease_xml_str = ET.tostring(lease_elem) |
|
90 | 107 |
else: |
91 |
preemptible = self.opt.preemptible |
|
108 |
if self.opt.preemptible == None: |
|
109 |
preemptible = False |
|
110 |
else: |
|
111 |
preemptible = self.opt.preemptible |
|
92 | 112 |
|
113 |
capacity = Capacity([constants.RES_CPU, constants.RES_MEM]) |
|
114 |
capacity.set_quantity(constants.RES_CPU, int(self.opt.cpu) * 100) |
|
115 |
capacity.set_quantity(constants.RES_MEM, int(self.opt.mem)) |
|
116 |
requested_resources = dict([(i+1, capacity) for i in range(self.opt.numnodes)]) |
|
117 |
if self.opt.duration == haizea_request_lease.DURATION_UNLIMITED: |
|
118 |
# This is an interim solution (make it run for a century). |
|
119 |
# TODO: Integrate concept of unlimited duration in the lease datastruct |
|
120 |
duration = DateTimeDelta(36500) |
|
121 |
else: |
|
122 |
duration = ISO.ParseTimeDelta(self.opt.duration) |
|
123 |
|
|
124 |
if self.opt.start == haizea_request_lease.START_NOW: |
|
125 |
lease = Lease(id = None, |
|
126 |
submit_time = None, |
|
127 |
requested_resources = requested_resources, |
|
128 |
start = Timestamp(Timestamp.NOW), |
|
129 |
duration = Duration(duration), |
|
130 |
deadline = None, |
|
131 |
preemptible=preemptible, |
|
132 |
software = DiskImageSoftwareEnvironment(self.opt.vmimage, self.opt.vmimagesize), |
|
133 |
state = None |
|
134 |
) |
|
135 |
elif self.opt.start == haizea_request_lease.START_BESTEFFORT: |
|
136 |
lease = Lease(id = None, |
|
137 |
submit_time = None, |
|
138 |
requested_resources = requested_resources, |
|
139 |
start = Timestamp(Timestamp.UNSPECIFIED), |
|
140 |
duration = Duration(duration), |
|
141 |
deadline = None, |
|
142 |
preemptible=preemptible, |
|
143 |
software = DiskImageSoftwareEnvironment(self.opt.vmimage, self.opt.vmimagesize), |
|
144 |
state = None |
|
145 |
) |
|
146 |
else: |
|
147 |
start = self.__absolute_time(self.opt.start) |
|
148 |
lease = Lease(id = None, |
|
149 |
submit_time = None, |
|
150 |
requested_resources = requested_resources, |
|
151 |
start = Timestamp(start), |
|
152 |
duration = Duration(duration), |
|
153 |
deadline = None, |
|
154 |
preemptible=preemptible, |
|
155 |
software = DiskImageSoftwareEnvironment(self.opt.vmimage, self.opt.vmimagesize), |
|
156 |
state = None |
|
157 |
) |
|
158 |
|
|
159 |
lease_xml_str = ET.tostring(lease.to_xml()) |
|
160 |
|
|
93 | 161 |
server = self.create_rpc_proxy(self.opt.server) |
94 | 162 |
|
95 | 163 |
try: |
96 |
lease_id = server.create_lease(self.opt.start, self.opt.duration, preemptible, self.opt.numnodes, |
|
97 |
self.opt.cpu, self.opt.mem, self.opt.vmimage, self.opt.vmimagesize) |
|
164 |
lease_id = server.create_lease(lease_xml_str) |
|
98 | 165 |
print "Lease submitted correctly." |
99 | 166 |
print "Lease ID: %i" % lease_id |
100 | 167 |
except xmlrpclib.Fault, err: |
... | ... | |
106 | 173 |
if self.opt.debug: |
107 | 174 |
raise |
108 | 175 |
|
176 |
def __absolute_time(self, time_str): |
|
177 |
if time_str[0] == "+": |
|
178 |
# Relative time |
|
179 |
time = round_datetime(now() + ISO.ParseTime(time_str[1:])) |
|
180 |
else: |
|
181 |
time = Parser.ParseDateTime(time_str) |
|
182 |
|
|
183 |
return time |
|
109 | 184 |
|
110 | 185 |
class haizea_cancel_lease(RPCCommand): |
111 | 186 |
""" |
... | ... | |
155 | 230 |
server = self.create_rpc_proxy(self.opt.server) |
156 | 231 |
|
157 | 232 |
fields = [("id","ID", 3), |
158 |
("type","Type", 4),
|
|
233 |
("type","Type", 12),
|
|
159 | 234 |
("state","State", 9), |
160 | 235 |
("start_req", "Starting time", 22), |
161 | 236 |
("duration_req", "Duration", 12), |
... | ... | |
163 | 238 |
|
164 | 239 |
try: |
165 | 240 |
leases = server.get_leases() |
166 |
console_table_printer(fields, leases) |
|
241 |
leases_fields = [] |
|
242 |
for lease_xml in leases: |
|
243 |
lease = Lease.from_xml_string(lease_xml) |
|
244 |
lease_fields = {} |
|
245 |
lease_fields["id"] = lease.id |
|
246 |
lease_fields["type"] = Lease.type_str[lease.get_type()] |
|
247 |
lease_fields["state"] = Lease.state_str[lease.get_state()] |
|
248 |
lease_fields["start_req"] = lease.start.requested |
|
249 |
lease_fields["duration_req"] = lease.duration.requested |
|
250 |
lease_fields["numnodes"] = len(lease.requested_resources) |
|
251 |
leases_fields.append(lease_fields) |
|
252 |
console_table_printer(fields, leases_fields) |
|
167 | 253 |
except xmlrpclib.Fault, err: |
168 | 254 |
print >> sys.stderr, "XMLRPC fault: %s" % err.faultString |
169 | 255 |
if self.opt.debug: |
... | ... | |
222 | 308 |
server = self.create_rpc_proxy(self.opt.server) |
223 | 309 |
|
224 | 310 |
fields = [("id","ID", 3), |
225 |
("type","Type", 4),
|
|
311 |
("type","Type", 12),
|
|
226 | 312 |
("state","State", 9), |
227 |
("start_sched", "Sched. Start time", 22),
|
|
313 |
("start_req", "Starting time", 22),
|
|
228 | 314 |
("duration_req", "Duration", 12), |
229 | 315 |
("numnodes", "Nodes", 3)] |
230 | 316 |
|
... | ... | |
233 | 319 |
if len(leases) == 0: |
234 | 320 |
print "Queue is empty." |
235 | 321 |
else: |
236 |
console_table_printer(fields, leases) |
|
322 |
leases_fields = [] |
|
323 |
for lease_xml in leases: |
|
324 |
lease = Lease.from_xml_string(lease_xml) |
|
325 |
lease_fields = {} |
|
326 |
lease_fields["id"] = lease.id |
|
327 |
lease_fields["type"] = Lease.type_str[lease.get_type()] |
|
328 |
lease_fields["state"] = Lease.state_str[lease.get_state()] |
|
329 |
lease_fields["start_req"] = lease.start.requested |
|
330 |
lease_fields["duration_req"] = lease.duration.requested |
|
331 |
lease_fields["numnodes"] = len(lease.requested_resources) |
|
332 |
leases_fields.append(lease_fields) |
|
333 |
console_table_printer(fields, leases_fields) |
|
237 | 334 |
except xmlrpclib.Fault, err: |
238 | 335 |
print >> sys.stderr, "XMLRPC fault: %s" % err.faultString |
239 | 336 |
if self.opt.debug: |
... | ... | |
253 | 350 |
print "\33[0m" |
254 | 351 |
for v in values: |
255 | 352 |
for (name,pname,width) in fields: |
256 |
value = pretty_print_rpcvalue(name, v[name]) |
|
257 | 353 |
width = max(len(name),width) |
258 |
print " %s" % str(value).ljust(width),
|
|
354 |
print " %s" % str(v[name]).ljust(width),
|
|
259 | 355 |
|
260 |
|
|
261 |
def pretty_print_rpcvalue(name, value): |
|
262 |
if name == "state": |
|
263 |
value = Lease.state_str[value] |
|
264 |
elif name == "duration_req": |
|
265 |
value = TimeDelta(seconds=value) |
|
266 |
elif name == "start_req": |
|
267 |
if value != None: |
|
268 |
value = ISO.ParseDateTime(value.value) |
|
269 |
|
|
270 |
return value |
Also available in: Unified diff
Merged TP2.0/0.9 branch into trunk.