Skip to content

Commit 5f23171

Browse files
committed
Merge remote-tracking branch 'origin/4.13' into 4.14
2 parents afce828 + 97f21c1 commit 5f23171

5 files changed

Lines changed: 53 additions & 55 deletions

File tree

engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,6 @@ public void orchestrateStart(final String vmUuid, final Map<VirtualMachineProfil
10771077
} catch (final AffinityConflictException e2) {
10781078
s_logger.warn("Unable to create deployment, affinity rules associted to the VM conflict", e2);
10791079
throw new CloudRuntimeException("Unable to create deployment, affinity rules associted to the VM conflict");
1080-
10811080
}
10821081

10831082
if (dest == null) {

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBase.java

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,12 @@ public String toString() {
206206
private final static int BASE_TO_CONVERT_BYTES_INTO_KILOBYTES = 1024;
207207
private final static String BASE_MOUNT_POINT_ON_REMOTE = "/var/cloud_mount/";
208208

209+
private final static int USER_DEVICE_START_ID = 3;
210+
211+
private final static String VM_NAME_ISO_SUFFIX = "-ISO";
212+
213+
private final static String VM_FILE_ISO_SUFFIX = ".iso";
214+
209215
private static final XenServerConnectionPool ConnPool = XenServerConnectionPool.getInstance();
210216
// static min values for guests on xenserver
211217
private static final long mem_128m = 134217728L;
@@ -1125,7 +1131,7 @@ String createTemplateFromSnapshot(final Connection conn, final String templatePa
11251131
throw new CloudRuntimeException(errMsg);
11261132
}
11271133

1128-
public VBD createVbd(final Connection conn, final DiskTO volume, final String vmName, final VM vm, final BootloaderType bootLoaderType, VDI vdi) throws XmlRpcException, XenAPIException {
1134+
public VBD createVbd(final Connection conn, final DiskTO volume, final String vmName, final VM vm, final BootloaderType bootLoaderType, VDI vdi, int isoCount) throws XmlRpcException, XenAPIException {
11291135
final Volume.Type type = volume.getType();
11301136

11311137
if (vdi == null) {
@@ -1161,7 +1167,7 @@ public VBD createVbd(final Connection conn, final DiskTO volume, final String vm
11611167
if (volume.getType() == Volume.Type.ISO) {
11621168
vbdr.mode = Types.VbdMode.RO;
11631169
vbdr.type = Types.VbdType.CD;
1164-
vbdr.userdevice = "3";
1170+
vbdr.userdevice = String.valueOf(USER_DEVICE_START_ID + isoCount);
11651171
} else {
11661172
vbdr.mode = Types.VbdMode.RW;
11671173
vbdr.type = Types.VbdType.DISK;
@@ -3880,7 +3886,7 @@ protected VDI mount(final Connection conn, final StoragePoolType poolType, final
38803886
return getVDIbyUuid(conn, volumePath);
38813887
}
38823888

3883-
protected VDI mount(final Connection conn, final String vmName, final DiskTO volume) throws XmlRpcException, XenAPIException {
3889+
public VDI mount(final Connection conn, final String vmName, final DiskTO volume) throws XmlRpcException, XenAPIException {
38843890
final DataTO data = volume.getData();
38853891
final Volume.Type type = volume.getType();
38863892
if (type == Volume.Type.ISO) {
@@ -3894,7 +3900,7 @@ protected VDI mount(final Connection conn, final String vmName, final DiskTO vol
38943900

38953901
// corer case, xenserver pv driver iso
38963902
final String templateName = iso.getName();
3897-
if (templateName.startsWith("xs-tools")) {
3903+
if (templateName != null && templateName.startsWith("xs-tools")) {
38983904
try {
38993905
final String actualTemplateName = getActualIsoTemplate(conn);
39003906
final Set<VDI> vdis = VDI.getByNameLabel(conn, actualTemplateName);
@@ -3923,7 +3929,7 @@ protected VDI mount(final Connection conn, final String vmName, final DiskTO vol
39233929
} catch (final URISyntaxException e) {
39243930
throw new CloudRuntimeException("Incorrect uri " + mountpoint, e);
39253931
}
3926-
final SR isoSr = createIsoSRbyURI(conn, uri, vmName, false);
3932+
final SR isoSr = createIsoSRbyURI(conn, uri, vmName, true);
39273933

39283934
final String isoname = isoPath.substring(index + 1);
39293935

@@ -4110,17 +4116,6 @@ public void prepareISO(final Connection conn, final String vmName, List<String[]
41104116
}
41114117
final VM vm = vms.iterator().next();
41124118

4113-
if (vmDataList != null) {
4114-
// create SR
4115-
SR sr = createLocalIsoSR(conn, _configDriveSRName + getHost().getIp());
4116-
4117-
// 1. create vm data files
4118-
createVmdataFiles(vmName, vmDataList, configDriveLabel);
4119-
4120-
// 2. copy config drive iso to host
4121-
copyConfigDriveIsoToHost(conn, sr, vmName);
4122-
}
4123-
41244119
final Set<VBD> vbds = vm.getVBDs(conn);
41254120
for (final VBD vbd : vbds) {
41264121
final VBD.Record vbdr = vbd.getRecord(conn);
@@ -5461,7 +5456,7 @@ public boolean attachConfigDriveIsoToVm(final Connection conn, final VM vm) thro
54615456
public SR createLocalIsoSR(final Connection conn, final String srName) throws XenAPIException, XmlRpcException {
54625457

54635458
// if config drive sr already exists then return
5464-
SR sr = getSRByNameLabelandHost(conn, _configDriveSRName + _host.getIp());
5459+
SR sr = getSRByNameLabelandHost(conn, srName);
54655460

54665461
if (sr != null) {
54675462
s_logger.debug("Config drive SR already exist, returing it");
@@ -5554,10 +5549,10 @@ public boolean attachConfigDriveToMigratedVm(Connection conn, String vmName, Str
55545549
s_logger.debug("Attaching config drive iso device for the VM " + vmName + " In host " + ipAddr);
55555550
Set<VM> vms = VM.getByNameLabel(conn, vmName);
55565551

5557-
SR sr = getSRByNameLabel(conn, _configDriveSRName + ipAddr);
5552+
SR sr = getSRByNameLabel(conn, vmName + VM_NAME_ISO_SUFFIX);
55585553
//Here you will find only two vdis with the <vmname>.iso.
55595554
//one is from source host and second from dest host
5560-
Set<VDI> vdis = VDI.getByNameLabel(conn, vmName + ".iso");
5555+
Set<VDI> vdis = VDI.getByNameLabel(conn, vmName + VM_FILE_ISO_SUFFIX);
55615556
if (vdis.isEmpty()) {
55625557
s_logger.debug("Could not find config drive ISO: " + vmName);
55635558
return false;

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixMigrateCommandWrapper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ public Answer execute(final MigrateCommand command, final CitrixResourceBase cit
9191

9292
// The iso can be attached to vm only once the vm is (present in the host) migrated.
9393
// Attach the config drive iso device to VM
94-
if (!citrixResourceBase.attachConfigDriveToMigratedVm(conn, vmName, dstHostIpAddr)) {
94+
VM vm = vms.iterator().next();
95+
if (!citrixResourceBase.attachConfigDriveIsoToVm(conn, vm)) {
9596
s_logger.debug("Config drive ISO attach failed after migration for vm "+vmName);
9697
}
9798

plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/wrapper/xenbase/CitrixStartCommandWrapper.java

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -98,34 +98,8 @@ public Answer execute(final StartCommand command, final CitrixResourceBase citri
9898
if (vmSpec.getType() != VirtualMachine.Type.User) {
9999
citrixResourceBase.createPatchVbd(conn, vmName, vm);
100100
}
101-
// put cdrom at the first place in the list
102-
List<DiskTO> disks = new ArrayList<DiskTO>(vmSpec.getDisks().length);
103-
int index = 0;
104-
for (final DiskTO disk : vmSpec.getDisks()) {
105-
if (Volume.Type.ISO.equals(disk.getType())) {
106-
disks.add(0, disk);
107-
} else {
108-
disks.add(index, disk);
109-
}
110-
index++;
111-
}
112-
113-
for (DiskTO disk : disks) {
114-
final VDI newVdi = citrixResourceBase.prepareManagedDisk(conn, disk, vmSpec.getId(), vmSpec.getName());
115-
116-
if (newVdi != null) {
117-
final Map<String, String> data = new HashMap<>();
118101

119-
final String path = newVdi.getUuid(conn);
120-
121-
data.put(StartAnswer.PATH, path);
122-
data.put(StartAnswer.IMAGE_FORMAT, Storage.ImageFormat.VHD.toString());
123-
124-
iqnToData.put(disk.getDetails().get(DiskTO.IQN), data);
125-
}
126-
127-
citrixResourceBase.createVbd(conn, disk, vmName, vm, vmSpec.getBootloader(), newVdi);
128-
}
102+
prepareDisks(vmSpec, citrixResourceBase, conn, iqnToData, vmName, vm);
129103

130104
for (final NicTO nic : vmSpec.getNics()) {
131105
citrixResourceBase.createVif(conn, vmName, vm, vmSpec, nic);
@@ -228,4 +202,35 @@ public Answer execute(final StartCommand command, final CitrixResourceBase citri
228202
}
229203
}
230204
}
205+
206+
private void prepareDisks(VirtualMachineTO vmSpec, CitrixResourceBase citrixResourceBase, Connection conn,
207+
Map<String, Map<String, String>> iqnToData, String vmName, VM vm) throws Exception {
208+
// put cdrom at the first place in the list
209+
List<DiskTO> disks = new ArrayList<DiskTO>(vmSpec.getDisks().length);
210+
int index = 0;
211+
for (final DiskTO disk : vmSpec.getDisks()) {
212+
if (Volume.Type.ISO.equals(disk.getType())) {
213+
disks.add(0, disk);
214+
} else {
215+
disks.add(index, disk);
216+
}
217+
index++;
218+
}
219+
int isoCount = 0;
220+
for (DiskTO disk : disks) {
221+
final VDI newVdi = citrixResourceBase.prepareManagedDisk(conn, disk, vmSpec.getId(), vmSpec.getName());
222+
if (newVdi != null) {
223+
final Map<String, String> data = new HashMap<>();
224+
final String path = newVdi.getUuid(conn);
225+
data.put(StartAnswer.PATH, path);
226+
data.put(StartAnswer.IMAGE_FORMAT, Storage.ImageFormat.VHD.toString());
227+
iqnToData.put(disk.getDetails().get(DiskTO.IQN), data);
228+
}
229+
citrixResourceBase.createVbd(conn, disk, vmName, vm, vmSpec.getBootloader(), newVdi, isoCount);
230+
231+
if (disk.getType() == Volume.Type.ISO) {
232+
isoCount++;
233+
}
234+
}
235+
}
231236
}

server/src/main/java/com/cloud/network/element/ConfigDriveNetworkElement.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,18 +305,16 @@ public boolean postStateTransitionEvent(StateMachine2.Transition<VirtualMachine.
305305

306306
@Override
307307
public boolean prepareMigration(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) {
308-
if (nic.isDefaultNic() && _networkModel.getUserDataUpdateProvider(network).getProvider().equals(Provider.ConfigDrive)) {
308+
if (_networkModel.getUserDataUpdateProvider(network).getProvider().equals(Provider.ConfigDrive)) {
309309
LOG.trace(String.format("[prepareMigration] for vm: %s", vm.getInstanceName()));
310-
final DataStore dataStore = findDataStore(vm, dest);
311-
312310
try {
313-
addConfigDriveDisk(vm, dataStore);
314-
} catch (ResourceUnavailableException e) {
311+
addPasswordAndUserdata(network, nic, vm, dest, context);
312+
} catch (InsufficientCapacityException | ResourceUnavailableException e) {
315313
LOG.error("Failed to add config disk drive due to: ", e);
314+
return false;
316315
}
317-
return false;
318316
}
319-
else return true;
317+
return true;
320318
}
321319

322320
@Override

0 commit comments

Comments
 (0)