def setReservationsSite(self):
        self.__db = Database()
        if self.__db.connect():
            sql = 'SELECT * FROM `site_reserved` WHERE `reservation_id` = "' + str(
                self.__reservationId) + '"'
            self.__db.execute(sql)
            data = self.__db.getCursor().fetchall()

            for d in data:
                siteId = d[1]
                s = Site(site_id=siteId)
                s.setStatus(d[2])
                s.setAdminDescription(d[3])

                #create site just for getting the amount of resource types
                self.__db.execute('SELECT * FROM `site` WHERE `site_id` = "' +
                                  str(siteId) + '";')
                site_data = self.__db.getCursor().fetchone()
                site = Site(site_data)
                r = site.getResources()

                for i in range(0, len(r)):
                    #d[4] = CPU, d[5] = Memory
                    r[i].setAmount(d[4 + i])

                s.setResources(r)

                self.__db.execute(
                    'SELECT `name` FROM `site` WHERE `site_id`="' +
                    str(siteId) + '"')
                s.setName(self.__db.getCursor().fetchone()[0])

                self.__sites.append(s)
示例#2
0
 def getSite(self,siteId = None, dateReq = NOW.strftime("%Y-%m-%d %H:00:00"), end = NOW.strftime("%Y-%m-%d %H:00:00"),db=None,locked=False):
     #to get site description specified by time              
     dateReq = str(dateReq)
     end = str(end)
     site = None
     dbStatus = False
     
     if siteId == None:
         return None
     
     if datetime.strptime(dateReq, "%Y-%m-%d %H:00:00") - datetime.strptime(end, "%Y-%m-%d %H:00:00") > timedelta(hours=0) :
         end = dateReq
     
     if db == None:
         db = Database()
         if db.connect():
             dbStatus = True
     else:
         dbStatus = True
             
     if dbStatus :
         try:
             if not locked :
                 db.lock({'site':'READ','schedule':'READ','reservation':'READ','site_reserved':'READ'})
             
             db.execute('SELECT * FROM `site` WHERE `site_id` = "'+str(siteId)+'";')
             data = db.getCursor().fetchone()
 
             site = Site(site=data,db=db)
             res = site.getResources()
 
             for i in range(0,len(res)):
                 res[i].setAvailableAmount(db=db,begin=dateReq,end=end)
          
             site.setRunningAmount(db=db,aTime=dateReq)
             db.unlock()
         finally:
             if not locked :
                 db.close()
             return site
 def cancel(self, sessionId, reservationId, reason):
     self.__db = Database() 
     
     if self.__db.connect():
         
         try:
             #check session id and get user id
             auth = AuthenticationManager()
             if auth.isSessionIdCorrect(sessionId):
                 self.__userId = auth.getUser().getUserId()               
                 
                 #---get start and end time of reservation---
                 sql = 'SELECT `start`, `end` FROM `reservation` WHERE `reservation_id` = "'+str(reservationId)+'";'
                 self.__db.execute(sql)
                 data = self.__db.getCursor().fetchone()    
                 begin = str(data[0])
                 end = str(data[1])
                 
                 #---get list of site in the reservation---
                 sql = 'SELECT * FROM `site_reserved` WHERE `reservation_id` = "'+str(reservationId)+'";'
                 self.__db.execute(sql)
                 data = self.__db.getCursor().fetchall()    
                 sites = []
                 
                 for d in data:
                     siteId = d[1]
                     
                     self.__db.execute('SELECT * FROM `site` WHERE `site_id` = "'+str(siteId)+'";')
                     site_data = self.__db.getCursor().fetchone()   
                     
                     site = Site(site_data) #create site just for getting the amount of resource types
                     r = site.getResources()
                         
                     for i in range(0,len(r)):
                         #d[4] = CPU, d[5] = Memory
                         r[i].setAmount(d[4+i])
                     
                     sites.append(site)
                 
                 
                 #---set new the reservation table data---
                 #reservation table
                 newEnd = NOW.strftime("%Y-%m-%d %H:00:00") 
                 sql = 'UPDATE `reservation` SET `end`="'+str(newEnd)+'" WHERE `reservation_id` = "'+str(reservationId)+'";'   
                 self.__db.execute(sql)                      
                     
                 #site_reserved table
                 sql = 'UPDATE `site_reserved` SET `status`="cancel" WHERE `reservation_id` = "'+str(reservationId)+'";'
                 self.__db.execute(sql)
                 
                 
                 #canceled_reservation table
                 sql = 'INSERT INTO `canceled_reservation` VALUES ( "'+str(reservationId)+'", "'+str(reason)+'", "'+str(end)+'");'             
                 self.__db.execute(sql)
                 
                 
                 #schedule table 
                 self.__db.lock({'schedule':'WRITE'})
                 diff = datetime.strptime(begin, "%Y-%m-%d %H:00:00")-NOW
                 if diff < timedelta(hours=0):
                     #running reservation
                     tmpBegin = NOW.strftime("%Y-%m-%d %H:00:00")                                                                    
                 else:
                     #havn't start yet
                     tmpBegin = begin
                     
                 beginToEnd = datetime.strptime(end, "%Y-%m-%d %H:00:00")-datetime.strptime(tmpBegin, "%Y-%m-%d %H:00:00")
                     
                 while beginToEnd>=timedelta(hours=1):
                     tmpEnd = (datetime.strptime(tmpBegin, "%Y-%m-%d %H:00:00")+timedelta(hours=1)).strftime("%Y-%m-%d %H:00:00")
                         
                     for i in range(0,len(sites)):
                         
                         siteId = sites[i].getSiteId()
                         r = sites[i].getResources()
                         sql = 'SELECT * FROM `schedule` WHERE `site_id` = "'+str(siteId)+'" and `start` = "'+str(tmpBegin)+'";'
                         self.__db.execute(sql)
                         data = self.__db.getCursor().fetchone()
                         
                         usedAmount = []
                         for k in range(0,len(r)):
                             #CPU = data[3], Memory = data[4]
                             usedAmount.append(data[k+3])
                         
                         tableDesc = self.__db.getCursor().description
                         
                         sql = 'UPDATE `schedule` SET'
                         
                         for j in range(0,len(r)):
                             #note : data[3] is CPU
                             sql += ' `'+str(tableDesc[3+j][0]) + '` = "' + str(int(usedAmount[j])-int(r[j].getAmount()))+'",'
                          
                         sql = sql[:-1]
                         sql += ' WHERE `site_id` = "'+str(siteId)+'" AND `start` = "'+str(tmpBegin)+'";'
          
                         self.__db.execute(sql)
                      
                     tmpBegin = tmpEnd
                     beginToEnd = datetime.strptime(end, "%Y-%m-%d %H:00:00")-datetime.strptime(tmpBegin, "%Y-%m-%d %H:00:00")
  
                 
                 self.__db.commit()
                 return True
            
         except:
             self.__db.rollback()
             return False
         finally:
             self.__db.close()
         
     return False
    def canCreateReservation(self, sessionId, begin, end, sitesId, resources, imgType, step=1):
        self.__db = Database()        
        self.__sessionId = sessionId
        self.__begin = begin
        self.__end = end
        self.__sitesId = sitesId 
        self.__resources = resources
        self.__imgType = imgType
        
        if self.__db.connect():
            
            #check session id and get user id
            auth = AuthenticationManager()
            if auth.isSessionIdCorrect(self.__sessionId):
                self.__userId = auth.getUser().getUserId()
                
                #check available resources in sites
                siteStatus = [False]*len(sitesId)
                
                #get data of this site
                if step == 1:
                    self.__db.lock({ 'site' : 'READ', 'schedule':'READ' })
                else:
                    self.__db.lock({ 'site' : 'READ', 'schedule':'WRITE', 'site_reserved' : 'WRITE', 'reservation':'WRITE' })
                
                for i in range(0,len(sitesId)):
                    #sitesId = list of all site user selected.
                    self.__db.execute('SELECT * FROM `site` WHERE `site_id` = "'+str(sitesId[i])+'";')
                    data = self.__db.getCursor().fetchone()
                    site = Site(site=data,db=self.__db)        
                    
                    #-> check image type
                    self.__imgTypeError = True
                    for img in site.getImageType():
                        if str(self.__imgType) in img.get('name'):
                            self.__imgTypeError = False
                            
                    if self.__imgTypeError :
                        return False
                        
                    #-> check available resources in site from begin to end
                    res = site.getResources()
                    resStatus = [False]*len(res)
                    
                    for j in range(0,len(res)):
                        res[j].setAvailableAmount(db=self.__db,begin=begin,end=end)
                        if int(res[j].getAvailableAmount()) >= int(resources[i][j]):
                            resStatus[j] = True
                        else:
                            self.__addSiteError(i)
                            self.__addResourceError(j)                   
                            
                    if not False in resStatus:
                        #resources of this site are available enough
                        siteStatus[i] = True 
                 
                if step == 1:
                     self.__db.unlock()
                     self.__db.close()

                if not False in siteStatus:
                #all conditions are okay, this reservation can be created
                    return True
                             
        return False