def claim_asds(alba_backend, nr_of_asds, disk_type=''): """ Claim disks :param alba_backend: ALBA Backend :param nr_of_asds: Amount of disks to claim :param disk_type: Type of disks :return: None """ def _wait_for_asd_count_with_status(_alba_backend, _nr_of_asds, status): counter = GeneralAlba.ALBA_TIMER / GeneralAlba.ALBA_TIMER_STEP asds_with_status = {} while counter > 0: GeneralAlba.logger.info('counter: {0}'.format(counter)) _alba_backend.invalidate_dynamics(['local_stack']) for node_id in _alba_backend.local_stack: for _disk in _alba_backend.local_stack[node_id].values(): for _osd_id, _asd in _disk['asds'].iteritems(): if _asd['status'] == status: asds_with_status[_osd_id] = _disk.get('guid') GeneralAlba.logger.info('looking for {0} asds with status {1}: {2}'.format(_nr_of_asds, status, asds_with_status)) if len(asds_with_status) >= _nr_of_asds: break counter -= 1 time.sleep(GeneralAlba.ALBA_TIMER_STEP) assert len(asds_with_status) >= _nr_of_asds,\ "Unable to find {0} asds, only found {1} asds with status: {2}.\n".format(_nr_of_asds, len(asds_with_status), status) return asds_with_status claimed_asds = [] alba_backend.invalidate_dynamics(['local_stack']) local_stack = alba_backend.local_stack for disks in local_stack.values(): for disk in disks.values(): for osd_id, asd in disk['asds'].iteritems(): if asd['status'] == 'claimed': claimed_asds.append(osd_id) nr_asds_to_claim = nr_of_asds - len(claimed_asds) if nr_asds_to_claim <= 0: return True # @TODO: Initialize disks should be parameterized to be parallel or sequential with parallel being the default GeneralAlba.initialise_disks(alba_backend, nr_asds_to_claim, disk_type) claimable_asds = _wait_for_asd_count_with_status(alba_backend, nr_asds_to_claim, 'available') GeneralAlba.logger.info('osds: {0}'.format(claimable_asds)) AlbaController.add_units(alba_backend.guid, claimable_asds) _wait_for_asd_count_with_status(alba_backend, nr_of_asds, 'claimed')