def initialize_disks(node_guid, disks): """ Initializes 1 or multiple disks :param node_guid: Guid of the node to which the disks belong :type node_guid: str :param disks: Disks to initialize (key: device_alias, value: amount of ASDs to deploy) :type disks: dict :return: Dict of all failures with as key the Diskname, and as value the error :rtype: dict """ node = AlbaNode(node_guid) try: available_disks = node.client.get_disks() except (requests.ConnectionError, requests.Timeout): AlbaNodeController._logger.exception('Could not connect to node {0} to validate disks'.format(node.guid)) raise failures = {} added_disks = [] for device_alias, amount in disks.iteritems(): device_id = device_alias.split('/')[-1] AlbaNodeController._logger.debug('Initializing disk {0} at node {1}'.format(device_alias, node.ip)) if device_id not in available_disks or available_disks[device_id]['available'] is False: AlbaNodeController._logger.exception('Disk {0} not available on node {1}'.format(device_alias, node.ip)) failures[device_alias] = 'Disk unavailable' else: add_disk_result = node.client.add_disk(disk_id=device_id) # Verify if an AlbaDisk with found aliases already exists (eg: When initialize individual and initialize all run at the same time) exists = False aliases = add_disk_result['aliases'] for alba_disk in node.disks: if set(alba_disk.aliases).intersection(set(aliases)): exists = True break if exists is True: continue disk = AlbaDisk() disk.aliases = aliases disk.alba_node = node disk.save() if add_disk_result['_success'] is False: failures[device_alias] = add_disk_result['_error'] disk.delete() else: device_id = disk.aliases[0].split('/')[-1] for _ in xrange(amount): add_asd_result = node.client.add_asd(disk_id=device_id) if add_asd_result['_success'] is False: failures[device_alias] = add_asd_result['_error'] added_disks.extend(add_disk_result['aliases']) if node.storagerouter is not None: DiskController.sync_with_reality(storagerouter_guid=node.storagerouter_guid) for disk in node.storagerouter.disks: if set(disk.aliases).intersection(set(added_disks)): partition = disk.partitions[0] if DiskPartition.ROLES.BACKEND not in partition.roles: partition.roles.append(DiskPartition.ROLES.BACKEND) partition.save() return failures
def build_service_structure(structure, previous_structure=None): """ Builds a service structure Example: structure = Helper.build_service_structure({ 'alba_backends': [1], 'alba_nodes': [1] }) """ if previous_structure is None: previous_structure = {} backend_types = previous_structure.get('backend_types', {}) service_types = previous_structure.get('service_types', {}) alba_backends = previous_structure.get('alba_backends', {}) alba_nodes = previous_structure.get('alba_nodes', {}) alba_disks = previous_structure.get('alba_disks', {}) alba_osds = previous_structure.get('alba_osds', {}) if 1 not in backend_types: backend_type = BackendType() backend_type.code = 'alba' backend_type.name = 'ALBA' backend_type.save() backend_types[1] = backend_type if 1 not in service_types: service_type = ServiceType() service_type.name = 'AlbaManager' service_type.save() service_types[1] = service_type for ab_id in structure.get('alba_backends', ()): if ab_id not in alba_backends: backend = Backend() backend.name = 'backend_{0}'.format(ab_id) backend.backend_type = backend_types[1] backend.save() alba_backend = AlbaBackend() alba_backend.backend = backend alba_backend.scaling = AlbaBackend.SCALINGS.LOCAL alba_backend.save() alba_backends[ab_id] = alba_backend service = Service() service.name = 'backend_{0}_abm'.format(ab_id) service.type = service_types[1] service.ports = [] service.save() abm_service = ABMService() abm_service.service = service abm_service.alba_backend = alba_backend abm_service.save() for an_id in structure.get('alba_nodes', []): if an_id not in alba_nodes: alba_node = AlbaNode() alba_node.ip = '10.1.0.{0}'.format(an_id) alba_node.port = 8500 alba_node.username = str(an_id) alba_node.password = str(an_id) alba_node.node_id = 'node_{0}'.format(an_id) alba_node.save() alba_nodes[an_id] = alba_node for ad_id, an_id in structure.get('alba_disks', ()): if ad_id not in alba_disks: alba_disk = AlbaDisk() alba_disk.aliases = ['/dev/alba_disk_{0}'.format(ad_id)] alba_disk.alba_node = alba_nodes[an_id] alba_disk.save() alba_disks[ad_id] = alba_disk for ao_id, ad_id, ab_id in structure.get('alba_osds', ()): if ao_id not in alba_osds: osd = AlbaOSD() osd.osd_id = 'alba_osd_{0}'.format(ao_id) osd.osd_type = AlbaOSD.OSD_TYPES.ASD osd.alba_backend = alba_backends[ab_id] osd.alba_disk = alba_disks[ad_id] osd.save() alba_osds[ao_id] = osd return {'backend_types': backend_types, 'service_types': service_types, 'alba_backends': alba_backends, 'alba_nodes': alba_nodes, 'alba_disks': alba_disks, 'alba_osds': alba_osds}