Project

General

Profile

Revision 632

Merged TP2.0/0.9 branch into trunk.

View differences:

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
        print
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