Example #1
0
class IRService(object):

    ############################################################
    # __init__
    ############################################################
    def __init__(self):
        super(IRService, self).__init__()

        # load config
        self._repoConf = IRServerConf()
        self._repoConf.loadRepoServerConfig()

        # self._authorizedUsers=self._repoConf.getAuthorizedUsers()  #to be removed
        self._backend = self._repoConf.getBackend()

        self._address = self._repoConf.getAddress()
        self._userAdmin = self._repoConf.getUserAdmin()
        self._configFile = self._repoConf.getConfigFile()
        self._imgStore = self._repoConf.getImgStore()
        self._addressS = self._repoConf.getAddressS()
        self._userAdminS = self._repoConf.getUserAdminS()
        self._configFileS = self._repoConf.getConfigFileS()
        # self._idp = self._repoConf.getIdp()

        print "\nReading Configuration file from " + self._repoConf.getServerConfig() + "\n"

        # Setup log.
        # When integrate ALL FG software, we may need to create this somewhere else and send the log object to all classes like this
        self._log = fgLog.fgLog(self._repoConf.getLogRepo(), self._repoConf.getLogLevelRepo(), "Img Repo Server", False)

        if self._backend == "mongodb":
            from IRDataAccessMongo import ImgStoreMongo
            from IRDataAccessMongo import ImgMetaStoreMongo
            from IRDataAccessMongo import IRUserStoreMongo

            self.metaStore = ImgMetaStoreMongo(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreMongo(self._address, self._userAdmin, self._configFile, self._imgStore, self._log)
            self.userStore = IRUserStoreMongo(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "mysql":
            from IRDataAccessMysql import ImgStoreMysql
            from IRDataAccessMysql import ImgMetaStoreMysql
            from IRDataAccessMysql import IRUserStoreMysql

            self.metaStore = ImgMetaStoreMysql(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreMysql(self._address, self._userAdmin, self._configFile, self._imgStore, self._log)
            self.userStore = IRUserStoreMysql(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "swiftmysql":
            from IRDataAccessSwiftMysql import ImgStoreSwiftMysql
            from IRDataAccessSwiftMysql import ImgMetaStoreSwiftMysql
            from IRDataAccessSwiftMysql import IRUserStoreSwiftMysql

            self.metaStore = ImgMetaStoreSwiftMysql(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreSwiftMysql(
                self._address,
                self._userAdmin,
                self._configFile,
                self._addressS,
                self._userAdminS,
                self._configFileS,
                self._imgStore,
                self._log,
            )
            self.userStore = IRUserStoreSwiftMysql(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "swiftmongo":
            from IRDataAccessSwiftMongo import ImgStoreSwiftMongo
            from IRDataAccessSwiftMongo import ImgMetaStoreSwiftMongo
            from IRDataAccessSwiftMongo import IRUserStoreSwiftMongo

            self.metaStore = ImgMetaStoreSwiftMongo(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreSwiftMongo(
                self._address,
                self._userAdmin,
                self._configFile,
                self._addressS,
                self._userAdminS,
                self._configFileS,
                self._imgStore,
                self._log,
            )
            self.userStore = IRUserStoreSwiftMongo(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "cumulusmysql":
            from IRDataAccessCumulusMysql import ImgStoreCumulusMysql
            from IRDataAccessCumulusMysql import ImgMetaStoreCumulusMysql
            from IRDataAccessCumulusMysql import IRUserStoreCumulusMysql

            self.metaStore = ImgMetaStoreCumulusMysql(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreCumulusMysql(
                self._address,
                self._userAdmin,
                self._configFile,
                self._addressS,
                self._userAdminS,
                self._configFileS,
                self._imgStore,
                self._log,
            )
            self.userStore = IRUserStoreCumulusMysql(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "cumulusmongo":
            from IRDataAccessCumulusMongo import ImgStoreCumulusMongo
            from IRDataAccessCumulusMongo import ImgMetaStoreCumulusMongo
            from IRDataAccessCumulusMongo import IRUserStoreCumulusMongo

            self.metaStore = ImgMetaStoreCumulusMongo(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreCumulusMongo(
                self._address,
                self._userAdmin,
                self._configFile,
                self._addressS,
                self._userAdminS,
                self._configFileS,
                self._imgStore,
                self._log,
            )
            self.userStore = IRUserStoreCumulusMongo(self._address, self._userAdmin, self._configFile, self._log)
        else:
            self.metaStore = ImgMetaStoreFS()
            self.imgStore = ImgStoreFS()
            self.userStore = IRUserStoreFS()

    def getRepoConf(self):
        return self._repoConf

    def genImgId(self):
        """
        return None if it could not get an imgId
        """
        return self.metaStore.genImgId()

    def getLog(self):
        return self._log

    def setLog(self, log):
        self._log = log

    def getAuthorizedUsers(self):
        return self._authorizedUsers

    def getBackend(self):
        return self._backend

    def getImgStore(self):
        return self._imgStore

    def auth(self, userId, userCred, provider):
        """
        return True, False, "NoActive", "NoUser"
        """
        cred = FGCredential(provider, userCred)
        status = FGAuth.auth(userId, cred)
        if status:
            userstatus = self.userStore.getUserStatus(userId)
            if userstatus == "Active":
                self.userStore.updateLastLogin(userId)
            else:
                status = userstatus

        return status

    ############################################################
    # getUserStatus
    ############################################################
    def getUserStatus(self, userId):
        """
        This is to verify the status of a user. 
        This method should be called by the auth method.
        return "Active", "NoActive" or "NoUser"
        """
        self._log.info("user:"******" command:getUserStatus args={userId:" + userId + "}")
        return self.userStore.getUserStatus(userId)

    ############################################################
    # uploadValidator
    ############################################################
    def uploadValidator(self, userId, size):
        self._log.info("user:"******" command:uploadValidator args={size:" + str(size) + "}")
        return self.userStore.uploadValidator(userId, size)

    ############################################################
    # userAdd
    ############################################################
    def userAdd(self, userId, username):
        self._log.info("user:"******" command:userAdd args={userIdtoAdd:" + username + "}")
        user = IRUser(username)
        return self.userStore.userAdd(userId, user)

    ############################################################
    # userDel
    ############################################################
    def userDel(self, userId, userIdtoDel):
        self._log.info("user:"******" command:userDel args={userIdtoDel:" + userIdtoDel + "}")
        return self.userStore.userDel(userId, userIdtoDel)

    ############################################################
    # userList
    ############################################################
    def userList(self, userId):
        self._log.info("user:"******" command:userlist")
        return self.userStore.queryStore(userId, None)

    ############################################################
    # setUserRole
    ############################################################
    def setUserRole(self, userId, userIdtoModify, role):
        self._log.info(
            "user:"******" command:setUserRole args={userIdtoModify:" + userIdtoModify + ", role:" + role + "}"
        )
        if role in IRUser.Role:
            return self.userStore.setRole(userId, userIdtoModify, role)
        else:
            self._log.error("Role " + role + " is not valid")
            print "Role not valid. Valid roles are " + str(IRUser.Role)
            return False

    ############################################################
    # setUserQuota
    ############################################################
    def setUserQuota(self, userId, userIdtoModify, quota):
        self._log.info(
            "user:"******" command:setUserQuota args={userIdtoModify:"
            + userIdtoModify
            + ", quota:"
            + str(quota)
            + "}"
        )
        return self.userStore.setQuota(userId, userIdtoModify, quota)

    ############################################################
    # setUserStatus
    ############################################################
    def setUserStatus(self, userId, userIdtoModify, status):
        self._log.info(
            "user:"******" command:setUserStatus args={userIdtoModify:"
            + userIdtoModify
            + ", status:"
            + status
            + "}"
        )
        if status in IRUser.Status:
            return self.userStore.setUserStatus(userId, userIdtoModify, status)
        else:
            self._log.error("Status " + status + " is not valid")
            print "Status not valid. Status available: " + str(IRUser.Status)
            return False

    def query(self, userId, queryString):
        self._log.info("user:"******" command:list args={queryString:" + queryString + "}")
        return self.metaStore.getItems(queryString)

    ############################################################
    # get
    ############################################################
    def get(self, userId, option, imgId):
        self._log.info("user:"******" command:get args={option:" + option + ", imgId:" + imgId + "}")

        if option == "img":
            return self.imgStore.getItem(imgId, userId, self.userStore.isAdmin(userId))
        elif option == "uri":
            return self.imgStore.getItemUri(imgId, userId, self.userStore.isAdmin(userId))

    ############################################################
    # put
    ############################################################
    def put(self, userId, imgId, imgFile, attributeString, size, extension):
        """
        Register the file in the database
        
        return imgId or 0 if something fails
        """

        status = False
        statusImg = False
        fileLocation = ""
        aMeta = None
        aImg = None

        if size > 0:
            if type(imgFile) == cherrypy._cpreqbody.Part:
                self._log.info(
                    "user:"******" command:put args={imgId:"
                    + imgId
                    + ", imgFile:"
                    + imgId
                    + ", metadata:"
                    + attributeString
                    + ", size:"
                    + str(size)
                    + ", extension:"
                    + extension
                    + "}"
                )
                aMeta = self._createImgMeta(userId, imgId, attributeString, False)
                aImg = ImgEntry(imgId, aMeta, self._imgStore + "/" + imgId, size, extension)
                # it sends the imgEntry and the requestInstance
                statusImg = self.imgStore.addItem(aImg, imgFile)

            else:
                self._log.info(
                    "user:"******" command:put args={imgId:"
                    + imgId
                    + ", imgFile:"
                    + imgFile
                    + ", metadata:"
                    + attributeString
                    + ", size:"
                    + str(size)
                    + ", extension:"
                    + extension
                    + "}"
                )
                fileLocation = self._imgStore + imgId
                if os.path.isfile(fileLocation):
                    # parse attribute string and construct image metadata
                    aMeta = self._createImgMeta(userId, imgId, attributeString, False)
                    # put image item in the image store
                    aImg = ImgEntry(imgId, aMeta, fileLocation, size, extension.strip())
                    # it sends the imgEntry and None
                    statusImg = self.imgStore.addItem(aImg, None)

            if statusImg:
                # put metadata into the image meta store

                # with MongoDB I put the metadata with the ImgEntry, so it skips meta add
                if re.search("mongo", self._backend) == None:
                    statusMeta = self.metaStore.addItem(aMeta)
                else:
                    statusMeta = True

                if statusMeta:
                    # Add size and #imgs to user
                    statusAcc = self.userStore.updateAccounting(userId, size, 1)

                    if statusAcc:
                        status = True

        else:
            self._log.error("File size must be higher than 0")

        if status:
            return aImg._imgId
        else:
            return 0

    ############################################################
    # updateItem
    ############################################################
    def updateItem(self, userId, imgId, attributeString):
        """
        Update Image Repository
        
        keywords:
        option: img - update only the Image file
                meta - update only the Metadata
                all - update Image file and Metadata
        """
        self._log.info(
            "user:"******" command:updateItem args={imgId:" + imgId + ",metadata:" + attributeString + "}"
        )
        success = False
        self._log.debug(str(attributeString))
        aMeta = self._createImgMeta(userId, imgId, attributeString, True)
        self._log.debug(str(aMeta))
        success = self.metaStore.updateItem(userId, imgId, aMeta)

        return success

    ############################################################
    # remove
    ############################################################
    def remove(self, userId, imgId):
        self._log.info("user:"******" command:remove args={imgId:" + imgId + "}")
        status = False
        owner = self.imgStore.getOwner(imgId)
        if owner != None:
            size = [0]  # Size is output parameter in the first call.
            status = self.imgStore.removeItem(userId, imgId, size, self.userStore.isAdmin(userId))
            if status:
                status = self.userStore.updateAccounting(owner, -(size[0]), -1)
        return status

    ############################################################
    # histImg
    ############################################################
    def histImg(self, userId, imgId):
        self._log.info("user:"******" command:histImg args={imgId:" + imgId + "}")
        output = self.imgStore.histImg(imgId)
        if output != None:
            output = re.sub(r"imgURI=,|size=0,|extension=", "", str(output))
        return output

    """
    ############################################################
    # printHistImg
    ############################################################
    def printHistImg(self, imgs):
        output = {}
        output ['head'] = "    Image_Id \t\t     Created_Date \t Last_Access \t    #Access \n"
        output ['head'] = string.expandtabs(output ['head'], 8)
        stradd = ""
        for i in range(len(output['head'])):
            stradd += "-"
        output ['head'] += stradd

        if(imgs != None):
            for key in imgs.keys():
                spaces = ""
                num = 24 - len(imgs[key]._imgId)
                if (num > 0):
                    for i in range(num):
                        spaces += " "

                output[key] = imgs[key]._imgId + spaces + "  " + str(imgs[key]._createdDate) + "  " + \
                        str(imgs[key]._lastAccess) + "    " + str(imgs[key]._accessCount) + "\n"

        return output
    """

    ############################################################
    # histUser
    ############################################################
    def histUser(self, userId, userIdtoSearch):
        self._log.info("user:"******" command:histImg args={userIdtoSearch:" + userIdtoSearch + "}")
        output = {}
        """
        output ['head'] = "User_Id  Used_Disk \t\t  Last_Login  \t\t #Owned_Images \n"
        output ['head'] = string.expandtabs(output ['head'], 8)
        stradd = ""
        for i in range(len(output['head'])):
            stradd += "-"
        output ['head'] += stradd
        """
        if userIdtoSearch == "None":
            userIdtoSearch = None

        users = self.userStore.queryStore(userId, userIdtoSearch)
        # .*? everything until
        if users != None:
            users = re.sub("cred=.*?, ", "", str(users))
        """
        if(users != None):
            for key in users.keys():
                spaces = ""
                num = 8 - len(users[key]._userId)
                if (num > 0):
                    for i in range(num):
                        spaces += " "


                output[key] = users[key]._userId + spaces + "   " + str(users[key]._fsUsed).split(".")[0] + " \t\t " + \
                        str(users[key]._lastLogin) + "   \t " + str(users[key]._ownedImgs).split(".")[0] + "\n"
        """
        return users

    ############################################################
    # _createImgMeta
    ############################################################
    def _createImgMeta(self, userId, imgId, attributeString, update):  ##We assume that values are check in client side
        """
        Create a ImgMeta object from a list of attributes
        
        keywords
        update: if True no default values are added
        """
        args = [""] * 10
        attributes = attributeString.split("&")
        for item in attributes:
            attribute = item.strip()
            # print attribute
            tmp = attribute.split("=")
            for i in range(len(tmp)):
                tmp[i] = tmp[i].strip()
            if len(tmp) == 2:
                key = string.lower(tmp[0])
                value = tmp[1]
                if key in ImgMeta.metaArgsIdx.keys():
                    if key == "vmtype":
                        value = string.lower(value)
                        if not (value in ImgMeta.VmType):
                            print "Wrong value for VmType, please use: " + str(ImgMeta.VmType)
                            break
                    elif key == "imgtype":
                        value = string.lower(value)
                        if not (value in ImgMeta.ImgType):
                            print "Wrong value for ImgType, please use: " + str(ImgMeta.ImgType)
                            break
                    elif key == "permission":
                        value = string.lower(value)
                        if not (value in ImgMeta.Permission):
                            print "Wrong value for Permission, please use: " + str(ImgMeta.Permission)
                            break
                    elif key == "imgstatus":
                        value = string.lower(value)
                        if not (value in ImgMeta.ImgStatus):
                            print "Wrong value for ImgStatus, please use: " + str(ImgMeta.ImgStatus)
                            break
                    args[ImgMeta.metaArgsIdx[key]] = value
        if not update:
            for x in range(len(args)):
                if args[x] == "":
                    args[x] = ImgMeta.argsDefault[x]
            # if x==4 or x==5 or x==8:
            #   args[x] = "'" + args[x] + "'"
            # print IRService.argsDefault[x], args[x]

        aMeta = ImgMeta(imgId, args[1], args[2], userId, args[4], args[5], args[6], args[7], args[8], args[9])
        # print aMeta
        return aMeta
Example #2
0
    def __init__(self):
        super(IRService, self).__init__()

        # load config
        self._repoConf = IRServerConf()
        self._repoConf.loadRepoServerConfig()

        # self._authorizedUsers=self._repoConf.getAuthorizedUsers()  #to be removed
        self._backend = self._repoConf.getBackend()

        self._address = self._repoConf.getAddress()
        self._userAdmin = self._repoConf.getUserAdmin()
        self._configFile = self._repoConf.getConfigFile()
        self._imgStore = self._repoConf.getImgStore()
        self._addressS = self._repoConf.getAddressS()
        self._userAdminS = self._repoConf.getUserAdminS()
        self._configFileS = self._repoConf.getConfigFileS()
        # self._idp = self._repoConf.getIdp()

        print "\nReading Configuration file from " + self._repoConf.getServerConfig() + "\n"

        # Setup log.
        # When integrate ALL FG software, we may need to create this somewhere else and send the log object to all classes like this
        self._log = fgLog.fgLog(self._repoConf.getLogRepo(), self._repoConf.getLogLevelRepo(), "Img Repo Server", False)

        if self._backend == "mongodb":
            from IRDataAccessMongo import ImgStoreMongo
            from IRDataAccessMongo import ImgMetaStoreMongo
            from IRDataAccessMongo import IRUserStoreMongo

            self.metaStore = ImgMetaStoreMongo(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreMongo(self._address, self._userAdmin, self._configFile, self._imgStore, self._log)
            self.userStore = IRUserStoreMongo(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "mysql":
            from IRDataAccessMysql import ImgStoreMysql
            from IRDataAccessMysql import ImgMetaStoreMysql
            from IRDataAccessMysql import IRUserStoreMysql

            self.metaStore = ImgMetaStoreMysql(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreMysql(self._address, self._userAdmin, self._configFile, self._imgStore, self._log)
            self.userStore = IRUserStoreMysql(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "swiftmysql":
            from IRDataAccessSwiftMysql import ImgStoreSwiftMysql
            from IRDataAccessSwiftMysql import ImgMetaStoreSwiftMysql
            from IRDataAccessSwiftMysql import IRUserStoreSwiftMysql

            self.metaStore = ImgMetaStoreSwiftMysql(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreSwiftMysql(
                self._address,
                self._userAdmin,
                self._configFile,
                self._addressS,
                self._userAdminS,
                self._configFileS,
                self._imgStore,
                self._log,
            )
            self.userStore = IRUserStoreSwiftMysql(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "swiftmongo":
            from IRDataAccessSwiftMongo import ImgStoreSwiftMongo
            from IRDataAccessSwiftMongo import ImgMetaStoreSwiftMongo
            from IRDataAccessSwiftMongo import IRUserStoreSwiftMongo

            self.metaStore = ImgMetaStoreSwiftMongo(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreSwiftMongo(
                self._address,
                self._userAdmin,
                self._configFile,
                self._addressS,
                self._userAdminS,
                self._configFileS,
                self._imgStore,
                self._log,
            )
            self.userStore = IRUserStoreSwiftMongo(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "cumulusmysql":
            from IRDataAccessCumulusMysql import ImgStoreCumulusMysql
            from IRDataAccessCumulusMysql import ImgMetaStoreCumulusMysql
            from IRDataAccessCumulusMysql import IRUserStoreCumulusMysql

            self.metaStore = ImgMetaStoreCumulusMysql(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreCumulusMysql(
                self._address,
                self._userAdmin,
                self._configFile,
                self._addressS,
                self._userAdminS,
                self._configFileS,
                self._imgStore,
                self._log,
            )
            self.userStore = IRUserStoreCumulusMysql(self._address, self._userAdmin, self._configFile, self._log)
        elif self._backend == "cumulusmongo":
            from IRDataAccessCumulusMongo import ImgStoreCumulusMongo
            from IRDataAccessCumulusMongo import ImgMetaStoreCumulusMongo
            from IRDataAccessCumulusMongo import IRUserStoreCumulusMongo

            self.metaStore = ImgMetaStoreCumulusMongo(self._address, self._userAdmin, self._configFile, self._log)
            self.imgStore = ImgStoreCumulusMongo(
                self._address,
                self._userAdmin,
                self._configFile,
                self._addressS,
                self._userAdminS,
                self._configFileS,
                self._imgStore,
                self._log,
            )
            self.userStore = IRUserStoreCumulusMongo(self._address, self._userAdmin, self._configFile, self._log)
        else:
            self.metaStore = ImgMetaStoreFS()
            self.imgStore = ImgStoreFS()
            self.userStore = IRUserStoreFS()
    #port = cherrypy.config.get("server.socket_port")
    #cherrypy.config.update('adminConfig.conf')
    #adminName = cherrypy.config.get("admin_name")
    #print("Admin name: %s" % adminName) 
#    adminName = cherrypy.config.get("Admin")['username']
#    adminName = configSectionMap("Admin")['username']
    cherrypy.log.error_log.propagate = False
    cherrypy.log.access_log.propagate = False


    #secure_server = _cpwsgi_server.CPWSGIServer()
    #secure_server.bind_addr = (ip, port)
    #secure_server.ssl_certificate = certificate
    #secure_server.ssl_private_key = privateKey

    #adapter = _cpserver.ServerAdapter(cherrypy.engine, secure_server, secure_server.bind_addr)
    #adapter.subscribe()
    
    repoConf = IRServerConf()
    repoConf.loadRepoServerConfig()    
    configFileName =repoConf.getRestConfFile() 
    if not os.path.isfile(configFileName):
        print "Configuration File "+configFileName+" not found"
        sys.exit(1)
    cherrypy.quickstart(AdminRestService(), "/", config = configFileName)


#else:
    # This branch is for the test suite; you can ignore it.
#    cherrypy.tree.mount(AdminRestService, config=configurationFile)