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