def kozoTransport(transport, transportName, nodeName): global _transports if transport in _transports: return _transports[transport] transportFile = None paths = [os.path.dirname(os.path.abspath(__file__))] if 'KOZOTRANSPORTPATH' in os.environ: paths.extend(os.environ['KOZOTRANSPORTPATH'].split(':')) if kozoConfig('transportPath'): paths.extend(kozoConfig('transportPath').split(':')) for path in paths: if os.path.isdir(path) and os.path.isfile(path + os.sep + transport + '.py'): transportFile = path + os.sep + transport + '.py' break if transportFile is None: raise KozoError('Could not find transport:', transport, paths) importPaths = kozoConfig('importPath').split(':') if 'KOZOIMPORTPATH' in os.environ: importPaths.extend(os.environ['KOZOIMPORTPATH'].split(':')) try: transportData = _importFile( transportFile, extraPaths=filter(lambda p: p, importPaths)) except BaseException as e: raise KozoError('Error while trying to import transport', transportFile, e) if 'transportInfo' not in transportData.__dict__: raise KozoError('transportInfo not found in', transportFile) if type(transportData.transportInfo) is not type({}): raise KozoError('transportInfo is not a dictionary in', transportFile) for key in ('format', 'class', 'config'): if key not in transportData.transportInfo: raise KozoError(transportFile, '- Key not found in transportInfo:', key) if transportData.transportInfo['format'] != '1.0': raise KozoError(transport, 'has unsupported transport format', transportData.transportInfo['format']) transportClass = transportData.transportInfo['class'] transportDefaultConfig = {'type': transport} transportConfigRequired = [] for key in transportData.transportInfo['config']: if 'default' in transportData.transportInfo['config'][key]: transportDefaultConfig[key] = transportData.transportInfo[ 'config'][key]['default'] else: transportConfigRequired.append(key) transportClass._transportConfig = transportDefaultConfig transportClass._transportConfigRequired = transportConfigRequired _transports[transport] = transportClass return transportClass
def kozoRole(role, roleName, nodeName): global _roles if role in _roles: return _roles[role] roleFile = None paths = [os.path.dirname(os.path.abspath(__file__))] if 'KOZOROLEPATH' in os.environ: paths.extend(os.environ['KOZOROLEPATH'].split(':')) if kozoConfig('rolePath'): paths.extend(kozoConfig('rolePath').split(':')) for path in paths: if os.path.isdir(path) and os.path.isfile(path + os.sep + role + '.py'): roleFile = path + os.sep + role + '.py' break if roleFile is None: raise KozoError('Could not find role:', role, paths) importPaths = kozoConfig('importPath').split(':') if 'KOZOIMPORTPATH' in os.environ: importPaths.extend(os.environ['KOZOIMPORTPATH'].split(':')) try: roleData = _importFile(roleFile, extraPaths=filter(lambda p: p, importPaths)) except BaseException as e: raise KozoError('Error while trying to import role', roleFile, e) if 'roleInfo' not in roleData.__dict__: raise KozoError('roleInfo not found in', roleFile) if type(roleData.roleInfo) is not type({}): raise KozoError('roleInfo is not a dictionary in', roleFile) for key in ('format', 'class', 'config'): if key not in roleData.roleInfo: raise KozoError(roleFile, '- Key not found in roleInfo:', key) if roleData.roleInfo['format'] != '1.0': raise KozoError(role, 'has unsupported role format', roleData.roleInfo['format']) roleClass = roleData.roleInfo['class'] roleDefaultConfig = {'type': role} roleConfigRequired = [] for key in roleData.roleInfo['config']: if 'default' in roleData.roleInfo['config'][key]: roleDefaultConfig[key] = roleData.roleInfo['config'][key]['default'] else: roleConfigRequired.append(key) roleClass._roleConfig = roleDefaultConfig roleClass._roleConfigRequired = roleConfigRequired _roles[role] = roleClass return roleClass