@Override public void deleteSingleVolumeMirror( StorageSystem storage, URI mirror, TaskCompleter taskCompleter) throws DeviceControllerException { _log.info("deleteSingleVolumeMirror operation START"); try { BlockMirror mirrorObj = _dbClient.queryObject(BlockMirror.class, mirror); if (storage.checkIfVmax3()) { _helper.removeVolumeFromParkingSLOStorageGroup(storage, mirrorObj.getNativeId(), false); _log.info( "Done invoking remove volume {} from parking SLO storage group", mirrorObj.getNativeId()); } CIMObjectPath mirrorPath = _cimPath.getBlockObjectPath(storage, mirrorObj); CIMObjectPath configSvcPath = _cimPath.getConfigSvcPath(storage); CIMArgument[] inArgs = _helper.getDeleteMirrorInputArguments(storage, mirrorPath); CIMArgument[] outArgs = new CIMArgument[5]; _helper.invokeMethod( storage, configSvcPath, SmisConstants.RETURN_TO_STORAGE_POOL, inArgs, outArgs); CIMObjectPath job = _cimPath.getCimObjectPathFromOutputArgs(outArgs, SmisConstants.JOB); if (job != null) { ControllerServiceImpl.enqueueJob( new QueueJob(new SmisBlockDeleteMirrorJob(job, storage.getId(), taskCompleter))); } } catch (Exception e) { _log.info("Problem making SMI-S call: ", e); ServiceError serviceError = DeviceControllerErrors.smis.unableToCallStorageProvider(e.getMessage()); taskCompleter.error(_dbClient, serviceError); } }
@Override public void fractureSingleVolumeMirror( StorageSystem storage, URI mirror, Boolean sync, TaskCompleter taskCompleter) throws DeviceControllerException { _log.info("fractureSingleVolumeMirror operation START"); CloseableIterator<CIMObjectPath> storageSyncRefs = null; try { BlockMirror mirrorObj = _dbClient.queryObject(BlockMirror.class, mirror); CIMObjectPath mirrorPath = _cimPath.getBlockObjectPath(storage, mirrorObj); // Get reference to the CIM_StorageSynchronized instance storageSyncRefs = _helper.getReference(storage, mirrorPath, SmisConstants.CIM_STORAGE_SYNCHRONIZED, null); boolean isVmax3 = storage.checkIfVmax3(); while (storageSyncRefs.hasNext()) { CIMObjectPath storageSync = storageSyncRefs.next(); CIMArgument[] inArgs = isVmax3 ? _helper.getFractureMirrorInputArgumentsWithCopyState(storageSync, sync) : _helper.getFractureMirrorInputArguments(storageSync, sync); CIMArgument[] outArgs = new CIMArgument[5]; // Invoke method to fracture the synchronization _helper.callModifyReplica(storage, inArgs, outArgs); taskCompleter.ready(_dbClient); } } catch (Exception e) { _log.info("Problem making SMI-S call", e); ServiceError serviceError = DeviceControllerException.errors.jobFailed(e); taskCompleter.error(_dbClient, serviceError); } finally { if (storageSyncRefs != null) { storageSyncRefs.close(); } } }
@Override public void resumeSingleVolumeMirror( StorageSystem storage, URI mirror, TaskCompleter taskCompleter) throws DeviceControllerException { _log.info("resumeSingleVolumeMirror operation START"); CloseableIterator<CIMObjectPath> storageSyncRefs = null; try { BlockMirror mirrorObj = _dbClient.queryObject(BlockMirror.class, mirror); CIMObjectPath mirrorPath = _cimPath.getBlockObjectPath(storage, mirrorObj); // Get reference to the CIM_StorageSynchronized instance storageSyncRefs = _helper.getReference(storage, mirrorPath, SmisConstants.CIM_STORAGE_SYNCHRONIZED, null); if (!storageSyncRefs.hasNext()) { _log.error("No synchronization instance found for {}", mirror); taskCompleter.error( _dbClient, DeviceControllerException.exceptions.resumeVolumeMirrorFailed(mirror)); return; } boolean isVmax3 = storage.checkIfVmax3(); while (storageSyncRefs.hasNext()) { CIMObjectPath storageSync = storageSyncRefs.next(); _log.debug(storageSync.toString()); /** * JIRA CTRL-11855 User created mirror and did pause operation using SMI 4.6.2. Then He * upgraded to SMI 8.0.3. While doing mirror resume getting exception from SMI because of * the existing mirrorObj.getSynchronizedInstance() contains * SystemName=\"SYMMETRIX+000195701573\"" This is wrong with 8.0.3 as * SystemName=\"SYMMETRIX-+-000195701573\"". To resolve this issue setting new value * collected from current smis provider here. */ mirrorObj.setSynchronizedInstance(storageSync.toString()); _dbClient.persistObject(mirrorObj); CIMArgument[] inArgs = isVmax3 ? _helper.getResumeSynchronizationInputArgumentsWithCopyState(storageSync) : _helper.getResumeSynchronizationInputArguments(storageSync); CIMArgument[] outArgs = new CIMArgument[5]; _helper.callModifyReplica(storage, inArgs, outArgs); CIMObjectPath job = _cimPath.getCimObjectPathFromOutputArgs(outArgs, SmisConstants.JOB); if (job != null) { ControllerServiceImpl.enqueueJob( new QueueJob(new SmisBlockResumeMirrorJob(job, storage.getId(), taskCompleter))); } else { CIMInstance syncObject = _helper.getInstance( storage, storageSync, false, false, new String[] {SmisConstants.CP_SYNC_STATE}); mirrorObj.setSyncState( CIMPropertyFactory.getPropertyValue(syncObject, SmisConstants.CP_SYNC_STATE)); _dbClient.persistObject(mirrorObj); taskCompleter.ready(_dbClient); } } } catch (Exception e) { _log.error("Failed to resume single volume mirror: {}", mirror); ServiceError serviceError = DeviceControllerException.errors.jobFailed(e); taskCompleter.error(_dbClient, serviceError); } finally { if (storageSyncRefs != null) { storageSyncRefs.close(); } } }