/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.emc.sa.service.vipr.file;
import static com.emc.sa.service.ServiceParams.FILESYSTEMS;
import static com.emc.sa.service.ServiceParams.NAME;
import static com.emc.sa.service.vipr.ViPRExecutionUtils.addAffectedResource;
import static com.emc.sa.service.vipr.ViPRExecutionUtils.execute;
import java.util.ArrayList;
import java.util.List;
import com.emc.sa.engine.bind.Param;
import com.emc.sa.engine.service.Service;
import com.emc.sa.service.vipr.ViPRExecutionUtils;
import com.emc.sa.service.vipr.ViPRService;
import com.emc.sa.service.vipr.file.tasks.CreateFileSnapshot;
import com.emc.storageos.db.client.model.uimodels.RetainedReplica;
import com.emc.storageos.model.file.FileShareRestRep;
import com.emc.storageos.model.file.FileSnapshotRestRep;
import com.emc.vipr.client.Task;
@Service("CreateFileSnapshot")
public class CreateFileSnapshotService extends ViPRService {
@Param(FILESYSTEMS)
protected List<String> fileSystemIds;
@Param(NAME)
protected String name;
private List<FileShareRestRep> fileSystems;
@Override
public void precheck() {
fileSystems = FileStorageUtils.getFileSystems(uris(fileSystemIds));
}
@Override
public void execute() {
for (FileShareRestRep fs : fileSystems) {
String fileSystemId = fs.getId().toString();
checkAndPurgeObsoleteSnapshot(fileSystemId);
Task<FileSnapshotRestRep> task = ViPRExecutionUtils.execute(new CreateFileSnapshot(fileSystemId, name));
addAffectedResource(task);
// record file snapshots for retention
List< Task<FileSnapshotRestRep> > tasks = new ArrayList< Task<FileSnapshotRestRep> >();
tasks.add(task);
addRetainedReplicas(fs.getId(), tasks);
}
}
/**
* Check retention policy and delete obsolete full copies if necessary
*
* @param fileSystemId - file system id
*/
private void checkAndPurgeObsoleteSnapshot(String fileSystemId) {
if (!isRetentionRequired()) {
return;
}
List<RetainedReplica> replicas = findObsoleteReplica(fileSystemId);
for (RetainedReplica replica : replicas) {
for (String obsoleteCopyId : replica.getAssociatedReplicaIds()) {
info("Delete snapshot %s since it exceeds max number of copies allowed", obsoleteCopyId);
FileStorageUtils.deleteFileSnapshot(uri(obsoleteCopyId));
}
getModelClient().delete(replica);
}
}
}