Skip to content

Commit ddd311c

Browse files
authored
[XenServer/XCP-ng] Sync the 'platform' setting according to the 'cpu.corespersocket' setting (apache#5892)
* Update platform setting if cpu.corespersocket is set * Refactor conditions * Allow empty map but not null
1 parent 1b3e7f6 commit ddd311c

2 files changed

Lines changed: 47 additions & 2 deletions

File tree

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@ public String toString() {
226226
protected static final HashMap<VmPowerState, PowerState> s_powerStatesTable;
227227

228228
public static final String XS_TOOLS_ISO_AFTER_70 = "guest-tools.iso";
229+
protected static final String PLATFORM_CORES_PER_SOCKET_KEY = "cores-per-socket";
229230

230231
static {
231232
s_powerStatesTable = new HashMap<VmPowerState, PowerState>();
@@ -1899,13 +1900,25 @@ protected void fillHostInfo(final Connection conn, final StartupRoutingCommand c
18991900
}
19001901
}
19011902

1903+
protected void syncPlatformAndCoresPerSocketSettings(String coresPerSocket, Map<String, String> platform) {
1904+
if (org.apache.commons.lang3.StringUtils.isBlank(coresPerSocket) || platform == null) {
1905+
return;
1906+
}
1907+
if (platform.containsKey(PLATFORM_CORES_PER_SOCKET_KEY)) {
1908+
s_logger.debug("Updating the cores per socket value from: " + platform.get(PLATFORM_CORES_PER_SOCKET_KEY) + " to " + coresPerSocket);
1909+
}
1910+
platform.put(PLATFORM_CORES_PER_SOCKET_KEY, coresPerSocket);
1911+
}
1912+
19021913
protected void finalizeVmMetaData(final VM vm, final VM.Record vmr, final Connection conn, final VirtualMachineTO vmSpec) throws Exception {
19031914

19041915
final Map<String, String> details = vmSpec.getDetails();
19051916
if (details != null) {
19061917
final String platformstring = details.get(VmDetailConstants.PLATFORM);
1918+
final String coresPerSocket = details.get(VmDetailConstants.CPU_CORE_PER_SOCKET);
19071919
if (platformstring != null && !platformstring.isEmpty()) {
19081920
final Map<String, String> platform = StringUtils.stringToMap(platformstring);
1921+
syncPlatformAndCoresPerSocketSettings(coresPerSocket, platform);
19091922
vm.setPlatform(conn, platform);
19101923
} else {
19111924
final String timeoffset = details.get(VmDetailConstants.TIME_OFFSET);
@@ -1914,10 +1927,9 @@ protected void finalizeVmMetaData(final VM vm, final VM.Record vmr, final Connec
19141927
platform.put(VmDetailConstants.TIME_OFFSET, timeoffset);
19151928
vm.setPlatform(conn, platform);
19161929
}
1917-
final String coresPerSocket = details.get(VmDetailConstants.CPU_CORE_PER_SOCKET);
19181930
if (coresPerSocket != null) {
19191931
final Map<String, String> platform = vm.getPlatform(conn);
1920-
platform.put("cores-per-socket", coresPerSocket);
1932+
syncPlatformAndCoresPerSocketSettings(coresPerSocket, platform);
19211933
vm.setPlatform(conn, platform);
19221934
}
19231935
}

plugins/hypervisors/xenserver/src/test/java/com/cloud/hypervisor/xenserver/resource/CitrixResourceBaseTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Map;
2424
import java.util.Set;
2525

26+
import com.cloud.utils.StringUtils;
2627
import org.apache.xmlrpc.XmlRpcException;
2728
import org.junit.Assert;
2829
import org.junit.Before;
@@ -51,6 +52,8 @@
5152
import com.xensource.xenapi.SR;
5253
import com.xensource.xenapi.Types.XenAPIException;
5354

55+
import static com.cloud.hypervisor.xenserver.resource.CitrixResourceBase.PLATFORM_CORES_PER_SOCKET_KEY;
56+
5457
@RunWith(PowerMockRunner.class)
5558
@PrepareForTest({Host.class, Script.class, SR.class})
5659
public class CitrixResourceBaseTest {
@@ -72,6 +75,8 @@ protected String getPatchFilePath() {
7275

7376
private String hostUuidMock = "hostUuidMock";
7477

78+
private static final String platformString = "device-model:qemu-upstream-compat;vga:std;videoram:8;apic:true;viridian:false;timeoffset:0;pae:true;acpi:1;hpet:true;secureboot:false;nx:true";
79+
7580
@Before
7681
public void beforeTest() throws XenAPIException, XmlRpcException {
7782
citrixResourceBase._host.setUuid(hostUuidMock);
@@ -369,4 +374,32 @@ public void initializeLocalSrTest() throws XenAPIException, XmlRpcException {
369374

370375
Assert.assertEquals(1, startUpCommandsForLocalStorage.size());
371376
}
377+
378+
@Test
379+
public void syncPlatformAndCoresPerSocketSettingsEmptyCoresPerSocket() {
380+
String coresPerSocket = null;
381+
Map<String, String> platform = Mockito.mock(Map.class);
382+
citrixResourceBase.syncPlatformAndCoresPerSocketSettings(coresPerSocket, platform);
383+
Mockito.verify(platform, Mockito.never()).put(Mockito.any(), Mockito.any());
384+
Mockito.verify(platform, Mockito.never()).remove(Mockito.any());
385+
}
386+
387+
@Test
388+
public void syncPlatformAndCoresPerSocketSettingsEmptyCoresPerSocketOnPlatform() {
389+
String coresPerSocket = "2";
390+
Map<String, String> platform = StringUtils.stringToMap(platformString);
391+
citrixResourceBase.syncPlatformAndCoresPerSocketSettings(coresPerSocket, platform);
392+
Assert.assertTrue(platform.containsKey(PLATFORM_CORES_PER_SOCKET_KEY));
393+
Assert.assertEquals(coresPerSocket, platform.get(PLATFORM_CORES_PER_SOCKET_KEY));
394+
}
395+
396+
@Test
397+
public void syncPlatformAndCoresPerSocketSettingsUpdateCoresPerSocketOnPlatform() {
398+
String coresPerSocket = "2";
399+
String platformStr = platformString + "," + PLATFORM_CORES_PER_SOCKET_KEY + ":3";
400+
Map<String, String> platform = StringUtils.stringToMap(platformStr);
401+
citrixResourceBase.syncPlatformAndCoresPerSocketSettings(coresPerSocket, platform);
402+
Assert.assertTrue(platform.containsKey(PLATFORM_CORES_PER_SOCKET_KEY));
403+
Assert.assertEquals(coresPerSocket, platform.get(PLATFORM_CORES_PER_SOCKET_KEY));
404+
}
372405
}

0 commit comments

Comments
 (0)