def create_cloned_cg(client, cg_name, src_cg_name, pool_name, lun_sizes, lun_names, src_lun_names, specs_list): cg_snap_name = utils.construct_tmp_cg_snap_name(cg_name) return create_cg_from_cg_snapshot( client, cg_name, src_cg_name, cg_snap_name, None, pool_name, lun_sizes, lun_names, src_lun_names, specs_list, copy_snap=False)
def create_cloned_cg(client, cg_name, src_cg_name, pool_name, lun_sizes, lun_names, src_lun_names, specs_list): cg_snap_name = utils.construct_tmp_cg_snap_name(cg_name) return create_cg_from_cg_snapshot(client, cg_name, src_cg_name, cg_snap_name, None, pool_name, lun_sizes, lun_names, src_lun_names, specs_list, copy_snap=False)
def create_cg_from_cg_snapshot(client, cg_name, src_cg_name, cg_snap_name, src_cg_snap_name, pool_name, lun_sizes, lun_names, src_lun_names, specs_list, copy_snap=True): prepare_tasks = [] store_spec = {} if copy_snap: flow_name = 'create_cg_from_cg_snapshot' temp_cg_snap = utils.construct_tmp_cg_snap_name(cg_name) snap_name = temp_cg_snap store_spec.update({'snap_name': src_cg_snap_name, 'new_snap_name': snap_name}) prepare_tasks.append( CopySnapshotTask()) prepare_tasks.append( ModifySnapshotTask(rebind={'snap_name': 'new_snap_name'})) else: flow_name = 'create_cg_from_cg' snap_name = cg_snap_name store_spec.update({'cg_name': src_cg_name, 'cg_snap_name': snap_name}) prepare_tasks.append(CreateCGSnapshotTask()) work_flow = linear_flow.Flow(flow_name) work_flow.add(*prepare_tasks) new_src_id_template = 'new_src_id_%s' new_dst_id_template = 'new_dst_id_%s' new_dst_wwn_template = 'new_dst_wwn_%s' common_store_spec = { 'client': client, 'pool_name': pool_name, 'ignore_thresholds': True, 'new_cg_name': cg_name } store_spec.update(common_store_spec) # Create LUNs for CG for i, lun_name in enumerate(lun_names): sub_store_spec = { 'lun_name': utils.construct_tmp_lun_name(lun_name), 'lun_size': lun_sizes[i], 'provision': specs_list[i].provision, 'tier': specs_list[i].tier, 'base_lun_name': src_lun_names[i], 'smp_name': lun_name, 'snap_name': snap_name, 'async_migrate': True, } work_flow.add(CreateSMPTask(name="CreateSMPTask_%s" % i, inject=sub_store_spec, provides=new_src_id_template % i), AttachSnapTask(name="AttachSnapTask_%s" % i, inject=sub_store_spec), CreateLunTask(name="CreateLunTask_%s" % i, inject=sub_store_spec, provides=(new_dst_id_template % i, new_dst_wwn_template % i)), MigrateLunTask( name="MigrateLunTask_%s" % i, inject=sub_store_spec, rebind={'src_id': new_src_id_template % i, 'dst_id': new_dst_id_template % i})) # Wait all migration session finished work_flow.add(WaitMigrationsTask(new_src_id_template, new_dst_id_template, new_dst_wwn_template, len(lun_names)), CreateConsistencyGroupTask(new_src_id_template, len(lun_names))) engine = taskflow.engines.load(work_flow, store=store_spec) engine.run() # Fetch all created LUNs and add them into CG lun_id_list = [] for i, lun_name in enumerate(lun_names): lun_id = engine.storage.fetch(new_src_id_template % i) lun_id_list.append(lun_id) client.delete_cg_snapshot(snap_name) return lun_id_list
def create_cg_from_cg_snapshot(client, cg_name, src_cg_name, cg_snap_name, src_cg_snap_name, pool_name, lun_sizes, lun_names, src_lun_names, specs_list, copy_snap=True): prepare_tasks = [] store_spec = {} if copy_snap: flow_name = 'create_cg_from_cg_snapshot' temp_cg_snap = utils.construct_tmp_cg_snap_name(cg_name) snap_name = temp_cg_snap store_spec.update({ 'snap_name': src_cg_snap_name, 'new_snap_name': snap_name }) prepare_tasks.append(CopySnapshotTask()) prepare_tasks.append( ModifySnapshotTask(rebind={'snap_name': 'new_snap_name'})) else: flow_name = 'create_cg_from_cg' snap_name = cg_snap_name store_spec.update({'cg_name': src_cg_name, 'cg_snap_name': snap_name}) prepare_tasks.append(CreateCGSnapshotTask()) work_flow = linear_flow.Flow(flow_name) work_flow.add(*prepare_tasks) new_src_id_template = 'new_src_id_%s' new_dst_id_template = 'new_dst_id_%s' new_dst_wwn_template = 'new_dst_wwn_%s' common_store_spec = { 'client': client, 'pool_name': pool_name, 'ignore_thresholds': True, 'new_cg_name': cg_name } store_spec.update(common_store_spec) # Create LUNs for CG for i, lun_name in enumerate(lun_names): sub_store_spec = { 'lun_name': utils.construct_tmp_lun_name(lun_name), 'lun_size': lun_sizes[i], 'provision': specs_list[i].provision, 'tier': specs_list[i].tier, 'base_lun_name': src_lun_names[i], 'smp_name': lun_name, 'snap_name': snap_name, 'async_migrate': True, } work_flow.add( CreateSMPTask(name="CreateSMPTask_%s" % i, inject=sub_store_spec, provides=new_src_id_template % i), AttachSnapTask(name="AttachSnapTask_%s" % i, inject=sub_store_spec), CreateLunTask(name="CreateLunTask_%s" % i, inject=sub_store_spec, provides=(new_dst_id_template % i, new_dst_wwn_template % i)), MigrateLunTask(name="MigrateLunTask_%s" % i, inject=sub_store_spec, rebind={ 'src_id': new_src_id_template % i, 'dst_id': new_dst_id_template % i })) # Wait all migration session finished work_flow.add( WaitMigrationsTask(new_src_id_template, new_dst_id_template, new_dst_wwn_template, len(lun_names)), CreateConsistencyGroupTask(new_src_id_template, len(lun_names))) engine = taskflow.engines.load(work_flow, store=store_spec) engine.run() # Fetch all created LUNs and add them into CG lun_id_list = [] for i, lun_name in enumerate(lun_names): lun_id = engine.storage.fetch(new_src_id_template % i) lun_id_list.append(lun_id) client.delete_cg_snapshot(snap_name) return lun_id_list