def set_computer(self, computer): from aiida.backends.djsite.db.models import DbComputer if self._to_be_stored: self.dbnode.dbcomputer = DbComputer.get_dbcomputer(computer) else: raise ModificationNotAllowed( "Node with uuid={} was already stored".format(self.uuid))
def get_dbauthinfo(computer, aiidauser): """ Given a computer and a user, returns a DbAuthInfo object :param computer: a computer (can be a string, Computer or DbComputer instance) :param aiidauser: a user, can be a DbUser or a User instance :return: a DbAuthInfo instance :raise NotExistent: if the user is not configured to use computer :raise sqlalchemy.orm.exc.MultipleResultsFound: if the user is configured more than once to use the computer! Should never happen """ from aiida.common.exceptions import InternalError if settings.BACKEND == BACKEND_DJANGO: from aiida.backends.djsite.db.models import DbComputer, DbAuthInfo, DbUser from django.core.exceptions import (ObjectDoesNotExist, MultipleObjectsReturned) try: authinfo = DbAuthInfo.objects.get( # converts from name, Computer or DbComputer instance to # a DbComputer instance dbcomputer=DbComputer.get_dbcomputer(computer), aiidauser=aiidauser.id) except ObjectDoesNotExist: raise NotExistent( "The aiida user {} is not configured to use computer {}". format(aiidauser.email, computer.name)) except MultipleObjectsReturned: raise ConfigurationError( "The aiida user {} is configured more than once to use " "computer {}! Only one configuration is allowed".format( aiidauser.email, computer.name)) elif settings.BACKEND == BACKEND_SQLA: from aiida.backends.sqlalchemy.models.authinfo import DbAuthInfo from aiida.backends.sqlalchemy import get_scoped_session session = get_scoped_session() from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound try: authinfo = session.query(DbAuthInfo).filter_by( dbcomputer_id=computer.id, aiidauser_id=aiidauser.id, ).one() except NoResultFound: raise NotExistent( "The aiida user {} is not configured to use computer {}". format(aiidauser.email, computer.name)) except MultipleResultsFound: raise ConfigurationError( "The aiida user {} is configured more than once to use " "computer {}! Only one configuration is allowed".format( aiidauser.email, computer.name)) else: raise InternalError("unknown backend {}".format(settings.BACKEND)) return authinfo
def get_authinfo(computer, aiidauser): if settings.BACKEND == BACKEND_DJANGO: from aiida.backends.djsite.db.models import DbComputer, DbAuthInfo from django.core.exceptions import (ObjectDoesNotExist, MultipleObjectsReturned) try: authinfo = DbAuthInfo.objects.get( # converts from name, Computer or DbComputer instance to # a DbComputer instance dbcomputer=DbComputer.get_dbcomputer(computer), aiidauser=aiidauser) except ObjectDoesNotExist: raise AuthenticationError( "The aiida user {} is not configured to use computer {}". format(aiidauser.email, computer.name)) except MultipleObjectsReturned: raise ConfigurationError( "The aiida user {} is configured more than once to use " "computer {}! Only one configuration is allowed".format( aiidauser.email, computer.name)) elif settings.BACKEND == BACKEND_SQLA: from aiida.backends.sqlalchemy.models.authinfo import DbAuthInfo from aiida.backends.sqlalchemy import get_scoped_session session = get_scoped_session() from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound try: authinfo = session.query(DbAuthInfo).filter_by( dbcomputer_id=computer.id, aiidauser_id=aiidauser.id, ).one() except NoResultFound: raise AuthenticationError( "The aiida user {} is not configured to use computer {}". format(aiidauser.email, computer.name)) except MultipleResultsFound: raise ConfigurationError( "The aiida user {} is configured more than once to use " "computer {}! Only one configuration is allowed".format( aiidauser.email, computer.name)) else: raise Exception("unknown backend {}".format(settings.BACKEND)) return authinfo
def can_run_on(self, computer): """ Return True if this code can run on the given computer, False otherwise. Local codes can run on any machine; remote codes can run only on the machine on which they reside. TODO: add filters to mask the remote machines on which a local code can run. """ from aiida.backends.djsite.db.models import DbComputer if self.is_local(): return True else: dbcomputer = computer if isinstance(dbcomputer, Computer): dbcomputer = dbcomputer.dbcomputer if not isinstance(dbcomputer, DbComputer): raise ValueError( "computer must be either a Computer or DbComputer object") dbcomputer = DbComputer.get_dbcomputer(computer) return (dbcomputer.pk == self.get_remote_computer().dbcomputer.pk)
def get(cls, computer): from aiida.backends.djsite.db.models import DbComputer return cls(dbcomputer=DbComputer.get_dbcomputer(computer))
def _set_db_computer(self, computer): from aiida.backends.djsite.db.models import DbComputer self.dbnode.dbcomputer = DbComputer.get_dbcomputer(computer)