self.db = SlabDB(config)
self.cache=None
-
+
def sliver_status(self,slice_urn,slice_hrn):
# receive a status request for slice named urn/hrn urn:publicid:IDN+senslab+nturro_slice hrn senslab.nturro_slice
# shall return a structure as described in
if requested_attributes:
for attrib_dict in requested_attributes:
- if 'timeslot' in attrib_dict:
+ if 'timeslot' in attrib_dict and attrib_dict['timeslot'] is not None:
slice.update({'timeslot':attrib_dict['timeslot']})
print >>sys.stderr, "\r\n \r\n \t=============================== SLABDRIVER.PY create_sliver ..... slice %s " %(slice)
# ensure person records exists
self.BindObjectToPeer('slice', slice['slice_id'], peer, slice['peer_slice_id'])
return 1
-
+
+ def AddSlice(self, slice_record):
+ slab_slice = SliceSenslab( slice_hrn = slice_record['slice_hrn'], record_id_slice= slice_record['record_id_slice'] , record_id_user= slice_record['record_id_user'], peer_authority = slice_record['peer_authority'])
+ print>>sys.stderr, "\r\n \r\n \t\t\t =======SLABDRIVER.PY AddSlice slice_record %s slab_slice %s" %(slice_record,slab_slice)
+ slab_dbsession.add(slab_slice)
+ slab_dbsession.commit()
+ return
+
# first 2 args are None in case of resource discovery
def list_resources (self, slice_urn, slice_hrn, creds, options):
#cached_requested = options.get('cached', True)
print >>sys.stderr, "\r\n \r\n SLABDRIVER GetPeers auth = %s, peer_filter %s, return_field %s " %(auth , peer_filter, return_fields)
all_records = dbsession.query(RegRecord).filter(RegRecord.type.like('%authority%')).all()
for record in all_records:
- existing_records[record.hrn] = record
+ existing_records[(record.hrn,record.type)] = record
if record.type not in existing_hrns_by_types:
existing_hrns_by_types[record.type] = [record.hrn]
print >>sys.stderr, "\r\n \r\n SLABDRIVER GetPeers \t NOT IN existing_hrns_by_types %s " %( existing_hrns_by_types)
else:
print >>sys.stderr, "\r\n \r\n SLABDRIVER GetPeers \t INNN type %s hrn %s " %( record.type,record.hrn )
- existing_hrns_by_types.update({record.type:(existing_hrns_by_types[record.type].append(record.hrn))})
+ existing_hrns_by_types[record.type].append(record.hrn)
+ print >>sys.stderr, "\r\n \r\n SLABDRIVER GetPeers \t INNN existing_hrns_by_types %s " %( existing_hrns_by_types)
+ #existing_hrns_by_types.update({record.type:(existing_hrns_by_types[record.type].append(record.hrn))})
print >>sys.stderr, "\r\n \r\n SLABDRIVER GetPeers existing_hrns_by_types %s " %( existing_hrns_by_types)
records_list= []
- try:
- for hrn in existing_hrns_by_types['authority+sa']:
- records_list.append(existing_records[hrn])
- print >>sys.stderr, "\r\n \r\n SLABDRIVER GetPeers records_list %s " %(records_list)
+ try:
+ print >>sys.stderr, "\r\n \r\n SLABDRIVER GetPeers existing_hrns_by_types['authority+sa'] %s \t\t existing_records %s " %(existing_hrns_by_types['authority'],existing_records)
+ if peer_filter:
+ records_list.append(existing_records[(peer_filter,'authority')])
+ else :
+ for hrn in existing_hrns_by_types['authority']:
+ records_list.append(existing_records[(hrn,'authority')])
+
+ print >>sys.stderr, "\r\n \r\n SLABDRIVER GetPeers records_list %s " %(records_list)
except:
pass
-
+
+ return_records = records_list
if not peer_filter and not return_fields:
return records_list
- return_records = parse_filter(records_list,peer_filter, 'peers', return_fields)
-
+ #return_records = parse_filter(records_list,peer_filter, 'peers', return_fields)
+
+ print >>sys.stderr, "\r\n \r\n SLABDRIVER GetPeers return_records %s " %(return_records)
return return_records
return slab_record
- def AddSliceToNodes(self, slice_dict, added_nodes, slice_user=None):
+ def LaunchExperimentOnOAR(self, slice_dict, added_nodes, slice_user=None):
site_list = []
nodeid_list =[]
slice_name = slice_dict['name']
try:
slot = slice_dict['timeslot']
-
+ print>>sys.stderr, "\r\n \r\n \t\tLaunchExperimentOnOAR slot %s " %(slot)
except KeyError:
- slot = { 'time':None, 'duration':'00:10:00' }#10 min
- reqdict['resource']+= ",walltime=" + str(00) + ":" + str(12) + ":" + str(20) #+2 min 20
- reqdict['script_path'] = "/bin/sleep 620" #+20 sec
+ #Running on default parameters
+ #XP immediate , 10 mins
+ slot = {'date':None,'start_time':None, 'timezone':None,'duration':None }#10 min
+
reqdict['property'] ="network_address in ("
for node in added_nodes:
reqdict['property'] = reqdict['property'][0: len( reqdict['property'])-2] +")"
reqdict['resource'] ="network_address="+ str(len(nodeid_list))
-
- #In case of a scheduled experiment
- if slot['time']:
-
+ if slot['duration']:
walltime = slot['duration'].split(":")
# Fixing the walltime by adding a few delays. First put the walltime in seconds
# oarAdditionalDelay = 20; additional delay for /bin/sleep command to
desired_walltime = int(walltime[0])*3600 + int(walltime[1]) * 60 + int(walltime[2])
total_walltime = desired_walltime + 140 #+2 min 20
sleep_walltime = desired_walltime + 20 #+20 sec
- print>>sys.stderr, "\r\n \r\n \t\tAddSliceToNodes desired_walltime %s total_walltime %s sleep_walltime %s " %(desired_walltime,total_walltime,sleep_walltime)
+ print>>sys.stderr, "\r\n \r\n \t\tLaunchExperimentOnOAR desired_walltime %s total_walltime %s sleep_walltime %s " %(desired_walltime,total_walltime,sleep_walltime)
#Put the walltime back in str form
#First get the hours
walltime[0] = str(total_walltime / 3600)
total_walltime = total_walltime - 60 * int(walltime[1])
#Get the seconds
walltime[2] = str(total_walltime)
- print>>sys.stderr, "\r\n \r\n \t\tAddSliceToNodes walltime %s " %(walltime)
+ print>>sys.stderr, "\r\n \r\n \t\tLaunchExperimentOnOAR walltime %s " %(walltime)
reqdict['resource']+= ",walltime=" + str(walltime[0]) + ":" + str(walltime[1]) + ":" + str(walltime[2])
reqdict['script_path'] = "/bin/sleep " + str(sleep_walltime)
-
- #Get the reservation time
- parse_time = slot['time'].split(" ")
- #If timezone not specified, assume it is server timezone
- if len(parse_time) == 2:
- server_timestamp,server_tz = self.GetTimezone()
- from_zone=tz.gettz(server_tz)
- date = ' '.join(parse_time)
- else:
- date = ' '.join(parse_time[:-1])
- #Get zone of the user from the reservation time given in the rspec
- from_zone = tz.gettz(parse_time[2])
-
+ else:
+ reqdict['resource']+= ",walltime=" + str(00) + ":" + str(12) + ":" + str(20) #+2 min 20
+ reqdict['script_path'] = "/bin/sleep 620" #+20 sec
+ #In case of a scheduled experiment (not immediate)
+ #To run an XP immediately, don't specify date and time in RSpec
+ #They will be set to None.
+ if slot['date'] and slot['start_time']:
+ if slot['timezone'] is '' or slot['timezone'] is None:
+ #assume it is server timezone
+ server_timestamp,server_tz = self.GetTimezone()
+ from_zone=tz.gettz(server_tz)
+ print>>sys.stderr, "\r\n \r\n \t\tLaunchExperimentOnOAR timezone not specified server_tz %s from_zone %s" %(server_tz,from_zone)
+ else:
+ #Get zone of the user from the reservation time given in the rspec
+ from_zone = tz.gettz(slot['timezone'])
+
+ date = str(slot['date']) + " " + str(slot['start_time'])
user_datetime = datetime.datetime.strptime(date, self.time_format)
user_datetime = user_datetime.replace(tzinfo = from_zone)
#Readable time accpeted by OAR
reqdict['reservation']= utc_date.strftime(self.time_format)
- print>>sys.stderr, "\r\n \r\n \t\tAddSliceToNodes reqdict['reservation'] %s " %(reqdict['reservation'])
+ print>>sys.stderr, "\r\n \r\n \t\tLaunchExperimentOnOAR reqdict['reservation'] %s " %(reqdict['reservation'])
else:
# Immediate XP
utc_server= datetime.datetime.fromtimestamp(float(server_timestamp)+20,UTC_zone)
server_localtime=utc_server.astimezone(s_tz)
- print>>sys.stderr, "\r\n \r\n \t\tAddSliceToNodes server_timestamp %s server_tz %s slice_name %s added_nodes %s username %s reqdict %s " %(server_timestamp,server_tz,slice_name,added_nodes,slice_user, reqdict )
+ print>>sys.stderr, "\r\n \r\n \t\tLaunchExperimentOnOAR server_timestamp %s server_tz %s slice_name %s added_nodes %s username %s reqdict %s " %(server_timestamp,server_tz,slice_name,added_nodes,slice_user, reqdict )
readable_time = server_localtime.strftime(self.time_format)
print >>sys.stderr," \r\n \r\n \t\t\t\tAPRES ParseTimezone readable_time %s timestanp %s " %(readable_time ,server_timestamp)
# first step : start the OAR job and update the job
- print>>sys.stderr, "\r\n \r\n AddSliceToNodes reqdict %s \r\n site_list %s" %(reqdict,site_list)
+ print>>sys.stderr, "\r\n \r\n LaunchExperimentOnOAR reqdict %s \r\n site_list %s" %(reqdict,site_list)
answer = self.oar.POSTRequestToOARRestAPI('POST_job',reqdict,slice_user)
- print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid %s " %(answer)
+ print>>sys.stderr, "\r\n \r\n LaunchExperimentOnOAR jobid %s " %(answer)
try:
jobid = answer['id']
except KeyError:
print>>sys.stderr, "\r\n AddSliceTonode Impossible to create job %s " %( answer)
return
- print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid %s added_nodes %s slice_user %s" %(jobid,added_nodes,slice_user)
+ print>>sys.stderr, "\r\n \r\n LaunchExperimentOnOAR jobid %s added_nodes %s slice_user %s" %(jobid,added_nodes,slice_user)
self.db.update_job( slice_name, jobid ,added_nodes)
#ret=subprocess.check_output(["/usr/bin/java", "-jar", ", str(jobid), slice_user])
output = subprocess.Popen([javacmdline, "-jar", jarname, str(jobid), slice_user],stdout=subprocess.PIPE).communicate()[0]
- print>>sys.stderr, "\r\n \r\n AddSliceToNodes wrapper returns %s " %(output)
+ print>>sys.stderr, "\r\n \r\n LaunchExperimentOnOAR wrapper returns %s " %(output)
return
'person_ids':[recslice['record_id_user']]})
elif str(record['type']) == 'user':
- #print >>sys.stderr, "\r\n \t\t SLABDRIVER.PY fill_record_info USEEEEEEEEEERDESU!"
+ #Add the data about slice
+ print >>sys.stderr, "\r\n \t\t SLABDRIVER.PY fill_record_info USEEEEEEEEEERDESU!"
rec = self.GetSlices(slice_filter = record['record_id'], filter_type = 'record_id_user')
#Append record in records list, therfore fetches user and slice info again(one more loop)
#Will update PIs and researcher for the slice
-
+ user_slab = self.GetPersons(recuser.hrn)
+ print >>sys.stderr, "\r\n \t\t SLABDRIVER.PY fill_record_info user_slab %s !" %(user_slab)
rec.update({'type':'slice','hrn':rec['slice_hrn']})
records.append(rec)
#print >>sys.stderr, "\r\n \t\t SLABDRIVER.PY fill_record_info ADDING SLIC EINFO rec %s" %(rec)