Source code for aiida.manage.configuration.profile

# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved.                     #
# This file is part of the AiiDA code.                                    #
#                                                                         #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida_core #
# For further information on the license, see the LICENSE.txt file        #
# For further information please visit http://www.aiida.net               #
###########################################################################
"""AiiDA profile related code"""
from __future__ import division
from __future__ import print_function
from __future__ import absolute_import

import os

from aiida.common import extendeddicts

from .settings import DAEMON_DIR, DAEMON_LOG_DIR

__all__ = ('Profile',)

CIRCUS_PID_FILE_TEMPLATE = os.path.join(DAEMON_DIR, 'circus-{}.pid')
DAEMON_PID_FILE_TEMPLATE = os.path.join(DAEMON_DIR, 'aiida-{}.pid')
CIRCUS_LOG_FILE_TEMPLATE = os.path.join(DAEMON_LOG_DIR, 'circus-{}.log')
DAEMON_LOG_FILE_TEMPLATE = os.path.join(DAEMON_LOG_DIR, 'aiida-{}.log')
CIRCUS_PORT_FILE_TEMPLATE = os.path.join(DAEMON_DIR, 'circus-{}.port')
CIRCUS_SOCKET_FILE_TEMPATE = os.path.join(DAEMON_DIR, 'circus-{}.sockets')
CIRCUS_CONTROLLER_SOCKET_TEMPLATE = 'circus.c.sock'
CIRCUS_PUBSUB_SOCKET_TEMPLATE = 'circus.p.sock'
CIRCUS_STATS_SOCKET_TEMPLATE = 'circus.s.sock'


[docs]class Profile(object): # pylint: disable=useless-object-inheritance """ Convenience class that loads the current profile name and corresponding configuration and can subsequently provide profile specific information """ KEY_DEFAULT_USER = 'default_user_email' KEY_PROFILE_UUID = 'PROFILE_UUID' RMQ_PREFIX = 'aiida-{uuid}'
[docs] def __init__(self, name, dictionary): self._name = name self._dictionary = extendeddicts.AttributeDict(dictionary) # Currently, whether a profile is a test profile is solely determined by its name starting with 'test_' self._test_profile = bool(self.name.startswith('test_'))
[docs] @staticmethod def generate_uuid(): """ Return a UUID for a new profile :returns: the hexadecimal represenation of a uuid4 UUID """ from uuid import uuid4 return uuid4().hex
@property def dictionary(self): """ Get the profile configuration dictionary :return: the profile configuration :rtype: dict """ return self._dictionary @property def name(self): """ Get the profile name :return: the profile name :rtype: str """ return self._name @property def uuid(self): """ Get the UUID of this profile :return: the profile UUID """ return self.dictionary[self.KEY_PROFILE_UUID] @uuid.setter def uuid(self, uuid): """ Set the UUID of this profile :param uuid: the UUID to set """ self.dictionary[self.KEY_PROFILE_UUID] = uuid @property def rmq_prefix(self): """ Get the RMQ prefix :return: the rmq prefix string :rtype: str """ return self.RMQ_PREFIX.format(uuid=self.uuid) @property def is_test_profile(self): """ Is this a test profile :return: True if test profile, False otherwise :rtype: bool """ return self._test_profile @property def default_user_email(self): """ Return the email (that is used as the username) configured during the first verdi setup. :return: the currently configured user email address or None if not defined :rtype: str or None """ try: email = self.dictionary[self.KEY_DEFAULT_USER] except KeyError: email = None return email @property def filepaths(self): """ Get the filepaths used by this profile :return: a dictionary of filepaths :rtype: dict """ return { 'circus': { 'log': CIRCUS_LOG_FILE_TEMPLATE.format(self.name), 'pid': CIRCUS_PID_FILE_TEMPLATE.format(self.name), 'port': CIRCUS_PORT_FILE_TEMPLATE.format(self.name), 'socket': { 'file': CIRCUS_SOCKET_FILE_TEMPATE.format(self.name), 'controller': CIRCUS_CONTROLLER_SOCKET_TEMPLATE, 'pubsub': CIRCUS_PUBSUB_SOCKET_TEMPLATE, 'stats': CIRCUS_STATS_SOCKET_TEMPLATE, } }, 'daemon': { 'log': DAEMON_LOG_FILE_TEMPLATE.format(self.name), 'pid': DAEMON_PID_FILE_TEMPLATE.format(self.name), } }