def deleteRequest(requestName): """ _deleteRequest_ delete the request from the database by its RequestName """ factory = DBConnect.getConnection() finder = factory(classname="Request.FindByName") reqId = finder.execute(requestName) if reqId == None: raise HTTPError(404, 'Given requestName not found: %s' % requestName) factory = DBConnect.getConnection() deleteReq = factory(classname="Request.Delete") deleteReq.execute(reqId)
def getRequest(requestId, reverseTypes=None, reverseStatus=None): """ _getRequest_ retrieve a request based on the request id, return a ReqMgr.DataStructs.Request instance containing the information """ factory = DBConnect.getConnection() reqGet = factory(classname = "Request.Get") reqData = reqGet.execute(requestId) requestName = reqData['request_name'] if not reverseTypes or not reverseStatus: reverseTypes, reverseStatus = reverseLookups() getGroup = factory(classname = "Group.GetGroupFromAssoc") groupData = getGroup.execute(reqData['requestor_group_id']) getUser = factory(classname = "Requestor.GetUserFromAssoc") userData = getUser.execute(reqData['requestor_group_id']) request = Request() request["ReqMgrRequestID"] = reqData['request_id'] request["RequestName"] = requestName request["RequestType"] = reverseTypes[reqData['request_type']] request["RequestStatus"] = reverseStatus[reqData['request_status']] request["RequestPriority"] = reqData['request_priority'] request["ReqMgrRequestBasePriority"] = reqData['request_priority'] request["RequestWorkflow"] = reqData['workflow'] request["RequestSizeEvents"] = reqData['request_size_events'] request["RequestSizeFiles"] = reqData['request_size_files'] request["Group"] = groupData['group_name'] request["ReqMgrGroupID"] = groupData['group_id'] request["ReqMgrGroupBasePriority"] = \ groupData['group_base_priority'] request["Requestor"] = userData['requestor_hn_name'] request["ReqMgrRequestorID"] = userData['requestor_id'] request["ReqMgrRequestorBasePriority"] = \ userData['requestor_base_priority'] request["RequestPriority"] = \ request['RequestPriority'] + groupData['group_base_priority'] request["RequestPriority"] = \ request['RequestPriority'] + userData['requestor_base_priority'] updates = ChangeState.getProgress(requestName) request['percent_complete'], request['percent_success'] = percentages(updates) sqDeps = factory(classname = "Software.GetByAssoc") swVers = sqDeps.execute(requestId) request['SoftwareVersions'] = swVers.values() getDatasetsIn = factory(classname = "Datasets.GetInput") getDatasetsOut = factory(classname = "Datasets.GetOutput") datasetsIn = getDatasetsIn.execute(requestId) datasetsOut = getDatasetsOut.execute(requestId) request['InputDatasetTypes'] = datasetsIn request['InputDatasets'] = datasetsIn.keys() request['OutputDatasets'] = datasetsOut return request
def changeRequestIDStatus(requestId, newState, priority = None): """ _changeRequestIDStatus_ Basic API to change a request to a new state, also includes optional priority change for the request - *requestId* : id of the request to be modified - *newState* : name of the new status for the request - *priority* : optional integer priority """ factory = DBConnect.getConnection() statusMap = factory(classname = "ReqStatus.Map").execute() statusId = statusMap.get(newState, None) if statusId == None: msg = "Attempted to change request %s to unknown status value %s" % ( requestId, newState) raise RuntimeError, msg stateChanger = factory(classname = "Request.SetStatus") stateChanger.execute(requestId, statusId) if priority != None: priorityChange = factory(classname = "Request.Priority") priorityChange.execute(requestId, priority) return
def associateSoftware(requestName, softwareName): """ _associateSoftware_ associate software name to named request Software must be registered in the DB """ factory = DBConnect.getConnection() requestId = factory(classname="Request.ID") reqId = requestId.execute(requestName) if reqId == None: msg = "Unknown Request: %s\n" % requestName msg += "Cannot associate software to request" raise RuntimeError, msg softwareId = factory(classname="Software.ID") swId = softwareId.execute(softwareName) if swId == None or swId == []: msg = "Unknown Software name: %s\n" % softwareName msg += "Cannot associate software to request" raise RuntimeError, msg softwareAssoc = factory(classname="Software.Association") try: softwareAssoc.execute(reqId, swId[0]) except Exception, ex: msg = "Unable to associate software to request\n" msg += "request: %s software: %s " % (requestName, softwareName) raise RuntimeError, msg
def changeRequestIDStatus(requestId, newState, priority=None): """ _changeRequestIDStatus_ Basic API to change a request to a new state, also includes optional priority change for the request - *requestId* : id of the request to be modified - *newState* : name of the new status for the request - *priority* : optional integer priority """ factory = DBConnect.getConnection() statusMap = factory(classname="ReqStatus.Map").execute() statusId = statusMap.get(newState, None) if statusId == None: msg = "Attempted to change request %s to unknown status value %s" % ( requestId, newState) raise RuntimeError(msg) stateChanger = factory(classname="Request.SetStatus") stateChanger.execute(requestId, statusId) if priority != None: priorityChange = factory(classname="Request.Priority") priorityChange.execute(requestId, priority)
def addUserToGroup(userName, groupName): """ _addUserToGroup_ Add the named user to the named group """ factory = DBConnect.getConnection() getUserId = factory(classname="Requestor.ID") getGroupId = factory(classname="Group.ID") userId = getUserId.execute(userName) groupId = getGroupId.execute(groupName) if groupId == None: msg = "Failed to add user %s to group %s\n" % (userName, groupName) msg += "Group: %s is not registered in Request Manager" % groupName raise RuntimeError, msg if userId == None: msg = "Failed to add user %s to group %s\n" % (userName, groupName) msg += "User: %s is not registered in Request Manager" % userName raise RuntimeError, msg try: newAssoc = factory(classname="Requestor.NewAssociation") newAssoc.execute(userId, groupId) except SQLAlchemyIntegrityError as ex: if "Duplicate entry" in str(ex) or "unique constraint" in str(ex): raise cherrypy.HTTPError(400, "User/Group Already Linked in DB") raise return
def removeUserFromGroup(userName, groupName): """ _removeUserFromGroup_ Remove the named user from the named group """ factory = DBConnect.getConnection() getUserId = factory(classname="Requestor.ID") getGroupId = factory(classname="Group.ID") userId = getUserId.execute(userName) groupId = getGroupId.execute(groupName) if groupId == None: msg = "Failed to remove user %s from %s\n" % (userName, groupName) msg += "Group: %s is not registered in Request Manager" % groupName raise RuntimeError, msg if userId == None: msg = "Failed to remove user %s from %s\n" % (userName, groupName) msg += "User: %s is not registered in Request Manager" % userName raise RuntimeError, msg deleteAssoc = factory(classname="Requestor.DeleteAssociation") deleteAssoc.execute(userId, groupId) return
def updateSoftware(softwareNames, scramArch = None): """ _updateSoftware_ Add a software version to the database if it does not already exist. If a version exists that is not added, delete it. """ versionsToAdd = [] versionsToDel = [] factory = DBConnect.getConnection() currentVersions = listSoftware() if not scramArch in currentVersions.keys(): # Then the whole architecture is new. Add it. versionsToAdd = softwareNames else: scramVersions = currentVersions[scramArch] versionsToAdd = list(set(softwareNames) - set(scramVersions)) versionsToDel = list(set(scramVersions) - set(softwareNames)) if len(versionsToAdd) > 0: addSw = factory(classname = "Software.New") addSw.execute(softwareNames = versionsToAdd, scramArch = scramArch) if len(versionsToDel) > 0: for version in versionsToDel: removeSoftware(softwareName = version, scramArch = scramArch) return
def addUserToGroup(userName, groupName): """ _addUserToGroup_ Add the named user to the named group """ factory = DBConnect.getConnection() getUserId = factory(classname = "Requestor.ID") getGroupId = factory(classname = "Group.ID") userId = getUserId.execute(userName) groupId = getGroupId.execute(groupName) if groupId == None: msg = "Failed to add user %s to group %s\n" % (userName, groupName) msg += "Group: %s is not registered in Request Manager" % groupName raise RuntimeError, msg if userId == None: msg = "Failed to add user %s to group %s\n" % (userName, groupName) msg += "User: %s is not registered in Request Manager" % userName raise RuntimeError, msg try: newAssoc = factory(classname = "Requestor.NewAssociation") newAssoc.execute(userId, groupId) except SQLAlchemyIntegrityError as ex: if "Duplicate entry" in str(ex) or "unique constraint" in str(ex): raise cherrypy.HTTPError(400, "User/Group Already Linked in DB") raise return
def removeUserFromGroup(userName, groupName): """ _removeUserFromGroup_ Remove the named user from the named group """ factory = DBConnect.getConnection() getUserId = factory(classname = "Requestor.ID") getGroupId = factory(classname = "Group.ID") userId = getUserId.execute(userName) groupId = getGroupId.execute(groupName) if groupId == None: msg = "Failed to remove user %s from %s\n" % (userName, groupName) msg += "Group: %s is not registered in Request Manager" % groupName raise RuntimeError, msg if userId == None: msg = "Failed to remove user %s from %s\n" % (userName, groupName) msg += "User: %s is not registered in Request Manager" % userName raise RuntimeError, msg deleteAssoc = factory(classname = "Requestor.DeleteAssociation") deleteAssoc.execute(userId, groupId) return
def putMessage(requestName, message): factory = DBConnect.getConnection() reqId = getRequestID(factory, requestName) #return factory(classname = "Progress.Message").execute(reqId, message) message = message[:999] factory(classname="Progress.Message").execute(reqId, message) return
def addCampaign(campaignName): factory = DBConnect.getConnection() check = factory(classname="Campaign.ID") checkResults = check.execute(campaignName) if checkResults == None or checkResults == []: add = factory(classname="Campaign.New") add.execute(campaignName) return
def requestID(requestName): """ Finds the ReqMgr database ID for a request """ factory = DBConnect.getConnection() f = factory(classname="Request.FindByName") id = f.execute(requestName) if id == None: raise HTTPError(404, 'Given requestName not found') return id
def listTeams(): """ _listTeams_ Show which teams exist """ factory = DBConnect.getConnection() return factory(classname="Team.List").execute()
def getRequestsByCriteria(classname, criterion): factory = DBConnect.getConnection() query = factory(classname) requestIds = query.execute(criterion) reverseTypes, reverseStatus = reverseLookups() return [ getRequest(requestId[0], reverseTypes, reverseStatus) for requestId in requestIds ]
def groupsForUser(userName): """ Return a list of all the groups this user belongs to """ result = [] factory = DBConnect.getConnection() getUserId = factory(classname="Requestor.ID") userId = getUserId.execute(userName) getGroups = factory(classname="Requestor.GetAssociationNames") groups = getGroups.execute(userId) return groups
def listSoftware(): """ _listSoftware_ lists all software versions in the database """ factory = DBConnect.getConnection() listSw = factory(classname = "Software.List") return listSw.execute()
def listRequestsByCampaign(campaignName): factory = DBConnect.getConnection() campaignFind = factory(classname="Campaign.ID") campaignID = campaignFind.execute(campaignName) if campaignID == None or campaignID == []: raise HTTPError(404, "Cannot find campaign") reqFind = factory(classname="Request.FindByCampaign") result = reqFind.execute(campaignID) return result
def reverseLookups(): """ returns reverse lookups for Types and Status """ factory = DBConnect.getConnection() reqTypes = factory(classname='ReqTypes.Map').execute() reqStatus = factory(classname='ReqStatus.Map').execute() reverseTypes = {} [reverseTypes.__setitem__(v, k) for k, v in reqTypes.iteritems()] reverseStatus = {} [reverseStatus.__setitem__(v, k) for k, v in reqStatus.iteritems()] return reverseTypes, reverseStatus
def listGroups(): """ _listGroups_ return a list of known group names """ factory = DBConnect.getConnection() groupId = factory(classname="Group.List") result = groupId.execute() return result
def listRequestsByStatus(statusName): """ _listRequestsByStatus_ Get a dict of request id/name pairs in the status provided """ factory = DBConnect.getConnection() reqFind = factory(classname = "Request.FindByStatus") result = reqFind.execute(statusName) return result
def listRequestsByProdMgr(prodMgrName): """ _listRequestsByProdMgr_ List requests associated to a prodMgr """ factory = DBConnect.getConnection() reqFind = factory(classname = "Request.FindByProdMgr") result = reqFind.execute(prodMgrName) return result
def removeSoftware(softwareName, scramArch = None): """ _removeSoftware_ remove a software version from the database """ factory = DBConnect.getConnection() removeSw = factory(classname = "Software.Delete") removeSw.execute(softwareName, scramArch = scramArch) return
def getRequestAssignments(requestId): """ _getRequestAssignments_ Get the assignments to production teams for a request """ factory = DBConnect.getConnection() getAssign = factory(classname="Assignment.GetByRequest") result = getAssign.execute(requestId) return result
def getTeamID(teamName): """ _getTeamID_ Return the ID of the team if it exists, otherwise return None """ factory = DBConnect.getConnection() teamId = factory(classname="Team.ID") result = teamId.execute(teamName) return result
def setPriority(hnUsername, priority): """ _setPriority_ Sets user priority to the integer amount specified """ factory = DBConnect.getConnection() userPriority = factory(classname="Requestor.SetPriority") result = userPriority.execute(hnUsername, priority) return result
def associateCampaign(campaignName, requestID): factory = DBConnect.getConnection() campaignFind = factory(classname="Campaign.ID") campaignID = campaignFind.execute(campaignName) if campaignID == None or campaignID == []: add = factory(classname="Campaign.New") add.execute(campaignName) campaignID = campaignFind.execute(campaignName) add = factory(classname="Campaign.NewAssoc") result = add.execute(requestID, campaignID) return result
def addGroup(groupName, priority=1): """ _addGroup_ Add a physics group with the name provided """ factory = DBConnect.getConnection() groupAdd = factory(classname="Group.New") result = groupAdd.execute(groupName, priority) return result
def listRequests(): """ _listRequests_ Get a list of all request name/id pairs and status in the DB """ factory = DBConnect.getConnection() reqFind = factory(classname = "Request.Find") result = reqFind.execute() return result
def deleteGroup(groupName): """ _deleteGroup_ Delete the named group from the DB """ factory = DBConnect.getConnection() groupRemover = factory(classname="Group.Delete") result = groupRemover.execute(groupName) return result
def listUsers(): """ _listUsers_ return a list of known user names """ factory = DBConnect.getConnection() users = factory(classname="Requestor.List") result = users.execute() return result
def groupExists(groupName): """ _groupExists_ Return the ID of the group if it exists, otherwise return None """ factory = DBConnect.getConnection() groupId = factory(classname="Group.ID") result = groupId.execute(groupName) return result
def deleteRequest(requestName): """ _deleteRequest_ delete the request from the database by its RequestName """ reqId = requestID(requestName) factory = DBConnect.getConnection() deleteReq = factory(classname="Request.Delete") deleteReq.execute(reqId)
def userInfo(hnUserName): """ _userInfo_ return a dict of information about the user """ factory = DBConnect.getConnection() users = factory(classname="Requestor.GetUserInfo") result = users.execute(hnUserName) return result