/*
* Copyright (c) 2012-2015 iWave Software LLC
* All Rights Reserved
*/
package com.emc.sa.service.vmware.block;
import static com.emc.sa.service.ServiceParams.DATASTORE_NAME;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.emc.sa.engine.ExecutionUtils;
import com.emc.sa.engine.bind.Param;
import com.emc.sa.engine.service.Service;
import com.emc.sa.service.vipr.block.BlockStorageUtils;
import com.emc.sa.service.vmware.VMwareHostService;
import com.emc.storageos.model.block.VolumeRestRep;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.vmware.vim25.mo.Datastore;
@Service("VMware-DeleteVmfsDatastoreAndVolume")
public class DeleteVmfsDatastoreAndVolumeService extends VMwareHostService {
@Param(DATASTORE_NAME)
protected List<String> datastoreNames;
private Map<Datastore, List<VolumeRestRep>> datastores;
@Override
public void precheck() throws Exception {
StringBuilder preCheckErrors = new StringBuilder();
super.precheck();
datastores = Maps.newHashMap();
acquireHostLock();
for (String datastoreName : datastoreNames) {
Datastore datastore = vmware.getDatastore(datacenter.getLabel(), datastoreName);
vmware.verifyDatastoreForRemoval(datastore);
List<VolumeRestRep> volumes = vmware.findVolumesBackingDatastore(host, hostId, datastore);
// If no volumes were found (or not all the volumes were found in our DB), indicate an error
if (volumes == null) {
preCheckErrors.append(
ExecutionUtils.getMessage("delete.vmfs.datastore.notsamewwn", datastoreName) + " ");
}
datastores.put(datastore, volumes);
}
if (preCheckErrors.length() > 0) {
throw new IllegalStateException(preCheckErrors.toString());
}
}
@Override
public void execute() throws Exception {
List<VolumeRestRep> volumes = Lists.newArrayList();
for (Map.Entry<Datastore, List<VolumeRestRep>> entry : datastores.entrySet()) {
Datastore datastore = entry.getKey();
volumes.addAll(entry.getValue());
vmware.deleteVmfsDatastore(volumes, hostId, datastore, true);
}
vmware.disconnect();
if (!volumes.isEmpty()) {
List<URI> volumeList = new ArrayList<URI>();
for (VolumeRestRep volume : volumes) {
volumeList.add(volume.getId());
}
BlockStorageUtils.removeVolumes(volumeList);
} else {
logInfo("delete.vmfs.datastore.volume.not.found");
}
this.connectAndInitializeHost();
vmware.refreshStorage(host, cluster);
if (hostId != null) {
ExecutionUtils.addAffectedResource(hostId.toString());
}
}
}