Module that initialize singleton environ object for the node component
[Environ
][fedbiomed.common.environ] will be initialized after the object environ
is imported from fedbiomed.node.environ
Typical use:
from fedbiomed.node.environ import environ
print(environ['NODE_ID'])
Descriptions of the nodes Global Variables:
- NODE_ID : id of the node
- ID : equals to node id
- MESSAGES_QUEUE_DIR : Path for queues
- DEFAULT_TRAINING_PLANS_DIR : Path of directory for storing default training plans
- TRAINING_PLANS_DIR : Path of directory for storing registered training plans
- TRAINING_PLAN_APPROVAL : True if the node enables training plan approval
- ALLOW_DEFAULT_TRAINING_PLANS : True if the node enables default training plans for training plan approval
- HASHING_ALGORITHM : Hashing algorithm used for training plan approval
- SECURE_AGGREGATION : True if secure aggregation is allowed on the node
- FORCE_SECURE_AGGREGATION : True if secure aggregation is mandatory on the node
- EDITOR : Tool to use to edit training plan
- RESEARCHERS : List of researchers endpoint description
Attributes
environ module-attribute
environ = NodeEnviron(autoset=True)
Classes
NodeEnviron
NodeEnviron(root_dir=None, autoset=True)
Bases: Environ
Source code in fedbiomed/node/environ.py
def __init__(
self,
root_dir: str = None,
autoset: bool = True
):
"""Constructs NodeEnviron object """
super().__init__(root_dir=root_dir)
self._root_dir = root_dir
logger.setLevel("DEBUG")
self._values["COMPONENT_TYPE"] = ComponentType.NODE
if autoset:
self.set_environment()
Functions
info
info()
Print useful information at environment creation
Source code in fedbiomed/node/environ.py
def info(self):
"""Print useful information at environment creation"""
logger.info("type = " + str(self._values['COMPONENT_TYPE']))
logger.info("training_plan_approval = " + str(self._values['TRAINING_PLAN_APPROVAL']))
logger.info("allow_default_training_plans = " + str(self._values['ALLOW_DEFAULT_TRAINING_PLANS']))
set_environment
set_environment()
Initializes environment variables
Source code in fedbiomed/node/environ.py
def set_environment(self):
"""Initializes environment variables """
self._config = NodeConfig(self._root_dir)
# Sets common variable
super().set_environment()
node_id = self._config.get('default', 'id')
self._values['ID'] = node_id
self._values['NODE_ID'] = node_id
self._values['MESSAGES_QUEUE_DIR'] = os.path.join(self._values['VAR_DIR'],
f'queue_manager_{self._values["NODE_ID"]}')
self._values['DEFAULT_TRAINING_PLANS_DIR'] = os.path.join(self._values['ROOT_DIR'],
'envs', 'common', 'default_training_plans')
# default directory for saving training plans that are approved / waiting for approval / rejected
self._values['TRAINING_PLANS_DIR'] = os.path.join(self._values['VAR_DIR'],
f'training_plans_{self._values["NODE_ID"]}')
# FIXME: we may want to change that
# Catch exceptions
if not os.path.isdir(self._values['TRAINING_PLANS_DIR']):
# create training plan directory
os.mkdir(self._values['TRAINING_PLANS_DIR'])
allow_dtp = self._config.get('security', 'allow_default_training_plans')
self._values['ALLOW_DEFAULT_TRAINING_PLANS'] = os.getenv('ALLOW_DEFAULT_TRAINING_PLANS', allow_dtp) \
.lower() in ('true', '1', 't', True)
tp_approval = self._config.get('security', 'training_plan_approval')
self._values['TRAINING_PLAN_APPROVAL'] = os.getenv('ENABLE_TRAINING_PLAN_APPROVAL', tp_approval) \
.lower() in ('true', '1', 't', True)
hashing_algorithm = self._config.get('security', 'hashing_algorithm')
if hashing_algorithm in HashingAlgorithms.list():
self._values['HASHING_ALGORITHM'] = hashing_algorithm
else:
_msg = ErrorNumbers.FB600.value + ": unknown hashing algorithm: " + str(hashing_algorithm)
logger.critical(_msg)
raise FedbiomedEnvironError(_msg)
secure_aggregation = self._config.get('security', 'secure_aggregation')
self._values["SECURE_AGGREGATION"] = os.getenv('SECURE_AGGREGATION',
secure_aggregation).lower() in ('true', '1', 't', True)
force_secure_aggregation = self._config.get('security', 'force_secure_aggregation')
self._values["FORCE_SECURE_AGGREGATION"] = os.getenv(
'FORCE_SECURE_AGGREGATION',
force_secure_aggregation).lower() in ('true', '1', 't', True)
self._values['EDITOR'] = os.getenv('EDITOR')
# Parse each researcher ip and port
researcher_sections = [section for section in self._config.sections() if section.startswith("researcher")]
self._values['RESEARCHERS'] = os.getenv('NODE_RESEARCHERS')
if os.getenv('RESEARCHER_SERVER_HOST'):
# Environ variables currently permit to specify only 1 researcher
self._values["RESEARCHERS"] = [
{
'port': os.getenv('RESEARCHER_SERVER_PORT', '50051'), # use default port if not specified
'ip': os.getenv('RESEARCHER_SERVER_HOST'),
'certificate': None
}
]
else:
self._values["RESEARCHERS"] = []
for section in researcher_sections:
self._values["RESEARCHERS"].append({
'port': self._config.get(section, "port"),
'ip': self._config.get(section, "ip"),
'certificate': None
})