Changes related to Review Board comments

This commit is contained in:
Mike Tutkowski 2013-07-18 20:10:58 -06:00
parent a235840856
commit b43a2a5fae
6 changed files with 88 additions and 10 deletions

View File

@ -26,6 +26,8 @@ public class DettachCommand extends Command implements StorageSubSystemCommand {
private String vmName; private String vmName;
private boolean _managed; private boolean _managed;
private String _iScsiName; private String _iScsiName;
private String _storageHost;
private int _storagePort;
public DettachCommand(DiskTO disk, String vmName) { public DettachCommand(DiskTO disk, String vmName) {
super(); super();
@ -69,4 +71,20 @@ public class DettachCommand extends Command implements StorageSubSystemCommand {
public String get_iScsiName() { public String get_iScsiName() {
return _iScsiName; return _iScsiName;
} }
public void setStorageHost(String storageHost) {
_storageHost = storageHost;
}
public String getStorageHost() {
return _storageHost;
}
public void setStoragePort(int storagePort) {
_storagePort = storagePort;
}
public int getStoragePort() {
return _storagePort;
}
} }

View File

@ -4069,13 +4069,44 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
} }
} }
public static String getDatastoreName(String str) {
return str.replace('/', '-');
}
// This methd can be used to determine if the datastore is active yet.
// When an iSCSI target is created on a host and that target already contains
// the metadata that represents a datastore, the datastore shows up within
// vCenter as existent, but not necessarily active.
// Call this method and pass in the datastore's name to wait, if necessary,
// for the datastore to become active.
private boolean datastoreFileExists(DatastoreMO dsMo, String volumeDatastorePath) {
for (int i = 0; i < 10; i++) {
try {
return dsMo.fileExists(volumeDatastorePath);
}
catch (Exception e) {
if (!e.getMessage().contains("is not accessible")) {
break;
}
}
try {
Thread.sleep(5000);
}
catch (Exception e) {
}
}
return false;
}
@Override @Override
public ManagedObjectReference handleDatastoreAndVmdkAttach(Command cmd, String iqn, String storageHost, int storagePort, public ManagedObjectReference handleDatastoreAndVmdkAttach(Command cmd, String iqn, String storageHost, int storagePort,
String initiatorUsername, String initiatorPassword, String targetUsername, String targetPassword) throws Exception { String initiatorUsername, String initiatorPassword, String targetUsername, String targetPassword) throws Exception {
VmwareContext context = getServiceContext(); VmwareContext context = getServiceContext();
VmwareHypervisorHost hyperHost = getHyperHost(context); VmwareHypervisorHost hyperHost = getHyperHost(context);
ManagedObjectReference morDs = createVmfsDatastore(hyperHost, iqn, ManagedObjectReference morDs = createVmfsDatastore(hyperHost, getDatastoreName(iqn),
storageHost, storagePort, iqn, storageHost, storagePort, iqn,
initiatorUsername, initiatorPassword, initiatorUsername, initiatorPassword,
targetUsername, targetPassword); targetUsername, targetPassword);
@ -4084,7 +4115,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
String volumeDatastorePath = String.format("[%s] %s.vmdk", dsMo.getName(), dsMo.getName()); String volumeDatastorePath = String.format("[%s] %s.vmdk", dsMo.getName(), dsMo.getName());
if (!dsMo.fileExists(volumeDatastorePath)) { if (!datastoreFileExists(dsMo, volumeDatastorePath)) {
String dummyVmName = getWorkerName(context, cmd, 0); String dummyVmName = getWorkerName(context, cmd, 0);
VirtualMachineMO vmMo = prepareVolumeHostDummyVm(hyperHost, dsMo, dummyVmName); VirtualMachineMO vmMo = prepareVolumeHostDummyVm(hyperHost, dsMo, dummyVmName);
@ -4096,6 +4127,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
vmMo.createDisk(volumeDatastorePath, getMBsFromBytes(dsMo.getSummary().getFreeSpace()), vmMo.createDisk(volumeDatastorePath, getMBsFromBytes(dsMo.getSummary().getFreeSpace()),
morDs, vmMo.getScsiDeviceControllerKey()); morDs, vmMo.getScsiDeviceControllerKey());
vmMo.detachDisk(volumeDatastorePath, false); vmMo.detachDisk(volumeDatastorePath, false);
vmMo.destroy();
} }
return morDs; return morDs;
@ -4106,7 +4138,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
VmwareContext context = getServiceContext(); VmwareContext context = getServiceContext();
VmwareHypervisorHost hyperHost = getHyperHost(context); VmwareHypervisorHost hyperHost = getHyperHost(context);
deleteVmfsDatastore(hyperHost, iqn, storageHost, storagePort, iqn); deleteVmfsDatastore(hyperHost, getDatastoreName(iqn), storageHost, storagePort, iqn);
} }
protected Answer execute(AttachVolumeCommand cmd) { protected Answer execute(AttachVolumeCommand cmd) {
@ -4240,6 +4272,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
hss.addInternetScsiStaticTargets(iScsiHbaDevice, lstTargets); hss.addInternetScsiStaticTargets(iScsiHbaDevice, lstTargets);
hss.rescanHba(iScsiHbaDevice); hss.rescanHba(iScsiHbaDevice);
hss.rescanVmfs();
} }
catch (Exception ex) { catch (Exception ex) {
synchronized (exceptions) { synchronized (exceptions) {
@ -4268,7 +4301,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
throw new Exception(exceptions.get(0).getMessage()); throw new Exception(exceptions.get(0).getMessage());
} }
ManagedObjectReference morDs = hostDatastoreSystem.findDatastore(iqn); ManagedObjectReference morDs = hostDatastoreSystem.findDatastoreByName(iqn);
if (morDs != null) { if (morDs != null) {
return morDs; return morDs;
@ -4348,6 +4381,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
hostStorageSystem.removeInternetScsiStaticTargets(iScsiHbaDevice, lstTargets); hostStorageSystem.removeInternetScsiStaticTargets(iScsiHbaDevice, lstTargets);
hostStorageSystem.rescanHba(iScsiHbaDevice); hostStorageSystem.rescanHba(iScsiHbaDevice);
hostStorageSystem.rescanVmfs();
} }
catch (Exception ex) { catch (Exception ex) {
exceptions.add(ex); exceptions.add(ex);

View File

@ -777,8 +777,8 @@ public class VmwareStorageProcessor implements StorageProcessor {
cmd.getChapTargetUsername(), cmd.getChapTargetPassword()); cmd.getChapTargetUsername(), cmd.getChapTargetPassword());
} }
private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName) { private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName, String iScsiName, String storageHost, int storagePort) {
return attachVolume(cmd, disk, isAttach, isManaged, vmName, null, null, 0, null, null, null, null); return attachVolume(cmd, disk, isAttach, isManaged, vmName, iScsiName, storageHost, storagePort, null, null, null, null);
} }
private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName, private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName,
@ -803,7 +803,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
initiatorUsername, initiatorPassword, targetUsername, targetPassword); initiatorUsername, initiatorPassword, targetUsername, targetPassword);
} }
else { else {
morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, primaryStore.getUuid()); morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, isManaged ? VmwareResource.getDatastoreName(iScsiName) : primaryStore.getUuid());
} }
if (morDs == null) { if (morDs == null) {
@ -813,7 +813,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
} }
DatastoreMO dsMo = new DatastoreMO(this.hostService.getServiceContext(null), morDs); DatastoreMO dsMo = new DatastoreMO(this.hostService.getServiceContext(null), morDs);
String datastoreVolumePath = String.format("[%s] %s.vmdk", dsMo.getName(), volumeTO.getPath()); String datastoreVolumePath = String.format("[%s] %s.vmdk", dsMo.getName(), isManaged ? dsMo.getName() : volumeTO.getPath());
disk.setVdiUuid(datastoreVolumePath); disk.setVdiUuid(datastoreVolumePath);
@ -944,7 +944,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
@Override @Override
public Answer dettachVolume(DettachCommand cmd) { public Answer dettachVolume(DettachCommand cmd) {
return this.attachVolume(cmd, cmd.getDisk(), false, cmd.isManaged(), cmd.getVmName()); return this.attachVolume(cmd, cmd.getDisk(), false, cmd.isManaged(), cmd.getVmName(), cmd.get_iScsiName(), cmd.getStorageHost(), cmd.getStoragePort());
} }
protected VirtualMachineMO prepareVolumeHostDummyVm(VmwareHypervisorHost hyperHost, DatastoreMO dsMo, String vmName) throws Exception { protected VirtualMachineMO prepareVolumeHostDummyVm(VmwareHypervisorHost hyperHost, DatastoreMO dsMo, String vmName) throws Exception {

View File

@ -1998,6 +1998,9 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
cmd.setManaged(volumePool.isManaged()); cmd.setManaged(volumePool.isManaged());
cmd.setStorageHost(volumePool.getHostAddress());
cmd.setStoragePort(volumePool.getPort());
cmd.set_iScsiName(volume.get_iScsiName()); cmd.set_iScsiName(volume.get_iScsiName());
try { try {

View File

@ -96,6 +96,25 @@ public class HostDatastoreSystemMO extends BaseMO {
return null; return null;
} }
public ManagedObjectReference findDatastoreByName(String datastoreName) throws Exception {
assert(datastoreName != null);
List<ManagedObjectReference> datastores = getDatastores();
if (datastores != null) {
for (ManagedObjectReference morDatastore : datastores) {
DatastoreInfo info = getDatastoreInfo(morDatastore);
if (info != null) {
if (info.getName().equals(datastoreName))
return morDatastore;
}
}
}
return null;
}
// TODO this is a hacking helper method, when we can pass down storage pool info along with volume // TODO this is a hacking helper method, when we can pass down storage pool info along with volume
// we should be able to find the datastore by name // we should be able to find the datastore by name
public ManagedObjectReference findDatastoreByExportPath(String exportPath) throws Exception { public ManagedObjectReference findDatastoreByExportPath(String exportPath) throws Exception {
@ -130,7 +149,7 @@ public class HostDatastoreSystemMO extends BaseMO {
public ManagedObjectReference createVmfsDatastore(String datastoreName, HostScsiDisk hostScsiDisk) throws Exception { public ManagedObjectReference createVmfsDatastore(String datastoreName, HostScsiDisk hostScsiDisk) throws Exception {
// just grab the first instance of VmfsDatastoreOption // just grab the first instance of VmfsDatastoreOption
VmfsDatastoreOption vmfsDatastoreOption = _context.getService().queryVmfsDatastoreCreateOptions(_mor, hostScsiDisk.getDevicePath(), 4).get(0); VmfsDatastoreOption vmfsDatastoreOption = _context.getService().queryVmfsDatastoreCreateOptions(_mor, hostScsiDisk.getDevicePath(), 5).get(0);
VmfsDatastoreCreateSpec vmfsDatastoreCreateSpec = (VmfsDatastoreCreateSpec)vmfsDatastoreOption.getSpec(); VmfsDatastoreCreateSpec vmfsDatastoreCreateSpec = (VmfsDatastoreCreateSpec)vmfsDatastoreOption.getSpec();

View File

@ -48,4 +48,8 @@ public class HostStorageSystemMO extends BaseMO {
public void rescanHba(String iScsiHbaDevice) throws Exception { public void rescanHba(String iScsiHbaDevice) throws Exception {
_context.getService().rescanHba(_mor, iScsiHbaDevice); _context.getService().rescanHba(_mor, iScsiHbaDevice);
} }
public void rescanVmfs() throws Exception {
_context.getService().rescanVmfs(_mor);
}
} }