Skip to content

Commit

Permalink
Added code to detect micro architecture
Browse files Browse the repository at this point in the history
- zlinux version detection
- add tests
resolves: adoptium#471
Signed-off-by: Anna Babu Palathingal <[email protected]>
  • Loading branch information
annaibm committed Mar 14, 2024
1 parent b5016d0 commit a032782
Show file tree
Hide file tree
Showing 4 changed files with 251 additions and 105 deletions.
71 changes: 70 additions & 1 deletion examples/platformRequirements/playlist.xml
Original file line number Diff line number Diff line change
Expand Up @@ -107,5 +107,74 @@
$(TEST_STATUS)</command>
<platformRequirements>^os.linux.ubuntu.20+</platformRequirements>
</test>
<test>
<testCaseName>test_not_microarch_supported</testCaseName>
<command>echo "test on none microarch.supported"; \
$(TEST_STATUS)</command>
<platformRequirements>^microarch.supported</platformRequirements>
</test>
<!-- Test for skylake microarchitecture -->
<test>
<testCaseName>test_microarch_skylake</testCaseName>
<command>echo "test microarch.skylake"; \
$(TEST_STATUS)</command>
<platformRequirementsList>
<platformRequirements>microarch.skylake</platformRequirements>
</platformRequirementsList>
</test>
<!-- Test for z15+ microarchitecture -->
<test>
<testCaseName>test_microarch_z15plus</testCaseName>
<command>echo "test microarch.z15+";
$(TEST_STATUS)</command>
<platformRequirementsList>
<platformRequirements>microarch.z15+</platformRequirements>
</platformRequirementsList>
</test>
<!-- Test for z15 microarchitecture -->
<test>
<testCaseName>test_microarch_z15</testCaseName>
<command>echo "test microarch.z15"; \
$(TEST_STATUS)</command>
<platformRequirementsList>
<platformRequirements>microarch.z15</platformRequirements>
</platformRequirementsList>
</test>
<!-- Test for z14+ microarchitecture -->
<test>
<testCaseName>test_microarch_z14plus</testCaseName>
<command>echo "test microarch.z14+"; \
$(TEST_STATUS)</command>
<platformRequirementsList>
<platformRequirements>microarch.z14+</platformRequirements>
</platformRequirementsList>
</test>
<!-- Test for z14 microarchitecture -->
<test>
<testCaseName>test_microarch_z14</testCaseName>
<command>echo "test microarch.z14"; \
$(TEST_STATUS)</command>
<platformRequirementsList>
<platformRequirements>microarch.z14</platformRequirements>
</platformRequirementsList>
</test>
<!-- Test for z13+ microarchitecture -->
<test>
<testCaseName>test_microarch_z13plus</testCaseName>
<command>echo "test microarch.z13+"; \
$(TEST_STATUS)</command>
<platformRequirementsList>
<platformRequirements>microarch.z13+</platformRequirements>
</platformRequirementsList>
</test>
<!-- Test for z13 microarchitecture -->
<test>
<testCaseName>test_microarch_z13</testCaseName>
<command>echo "test microarch.z13"; \
$(TEST_STATUS)</command>
<platformRequirementsList>
<platformRequirements>microarch.z13</platformRequirements>
</platformRequirementsList>
</test>

</playlist>
</playlist>
2 changes: 1 addition & 1 deletion makeGen.mk
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ autoconfig:
perl scripts$(D)configure.pl

autogen: autoconfig
${TEST_JDK_HOME}/bin/java -cp $(Q)$(TKG_JAR)$(P)$(JSON_SIMPLE)$(Q) org.testKitGen.MainRunner --mode=$(MODE) --spec=$(SPEC) --microArch=$(MICROARCH) --osLabel=$(Q)$(OS_LABEL)$(Q) --jdkVersion=$(JDK_VERSION) --impl=$(JDK_IMPL) --vendor=$(Q)$(JDK_VENDOR)$(Q) --buildList=${BUILD_LIST} --iterations=$(TKG_ITERATIONS) --aotIterations=$(AOT_ITERATIONS) --testFlag=$(TEST_FLAG) --testTarget=$(TESTTARGET) --testList=$(TESTLIST) --numOfMachines=$(NUM_MACHINES) --testTime=$(TEST_TIME) --TRSSURL=$(TRSS_URL) $(OPTS)
${TEST_JDK_HOME}/bin/java -cp $(Q)$(TKG_JAR)$(P)$(JSON_SIMPLE)$(Q) org.testKitGen.MainRunner --mode=$(MODE) --spec=$(SPEC) --microArch=$(Q)$(MICROARCH)$(Q) --osLabel=$(Q)$(OS_LABEL)$(Q) --jdkVersion=$(JDK_VERSION) --impl=$(JDK_IMPL) --vendor=$(Q)$(JDK_VENDOR)$(Q) --buildList=${BUILD_LIST} --iterations=$(TKG_ITERATIONS) --aotIterations=$(AOT_ITERATIONS) --testFlag=$(TEST_FLAG) --testTarget=$(TESTTARGET) --testList=$(TESTLIST) --numOfMachines=$(NUM_MACHINES) --testTime=$(TEST_TIME) --TRSSURL=$(TRSS_URL) $(OPTS)

AUTOGEN_FILES = $(wildcard $(CURRENT_DIR)$(D)jvmTest.mk)
AUTOGEN_FILES += $(wildcard $(CURRENT_DIR)$(D)machineConfigure.mk)
Expand Down
255 changes: 155 additions & 100 deletions scripts/testTKG/test_platformRequirements.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,105 +16,160 @@
from utils import *

def run_test():
rt = True
printTestheader("platformRequirements")

buildList = "TKG/examples/platformRequirements"
command = "make _all"
print(f"\t{command}")
result = subprocess.run(f"{EXPORT_BUILDLIST}={buildList}; {CD_TKG}; {MAKE_CLEAN}; {MAKE_COMPILE}; {command}", stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True, check=False)

stdout = result.stdout.decode()
specStr = re.search(r"set SPEC to (.*)", stdout)

if specStr is not None:
spec = specStr.group(1)
else:
printError("Could not parse spec from output.")
return False

passed = set()
skipped = set()

if 'linux' in spec:
skipped.add('test_not_linux_arch_x86_0')
else:
if 'x86' in spec:
passed.add('test_not_linux_arch_x86_0')
else:
skipped.add('test_not_linux_arch_x86_0')

if 'x86' in spec:
passed.add('test_arch_x86_0')
skipped.add('test_arch_nonx86_0')
else:
passed.add('test_arch_nonx86_0')
skipped.add('test_arch_x86_0')

if '64' in spec:
passed.add('test_bits_64_0')
else:
skipped.add('test_bits_64_0')

if 'osx' in spec:
passed.add('test_os_osx_0')
else:
skipped.add('test_os_osx_0')

if 'osx_x86-64' in spec:
passed.add('test_osx_x86-64_0')
else:
skipped.add('test_osx_x86-64_0')

if 'x86' in spec or '390' in spec:
passed.add('test_arch_x86_390_0')
else:
skipped.add('test_arch_x86_390_0')

if 'osx_x86-64' in spec or ('win_x86' in spec and 'win_x86-64' not in spec) or 'aix_ppc-64' in spec:
passed.add('test_osx_x86-64_win_x86_aix_ppc-64_0')
else:
skipped.add('test_osx_x86-64_win_x86_aix_ppc-64_0')

os_label = re.search(r"set OS_LABEL to (.*)", stdout)
if os_label is not None:
os_label = os_label.group(1)
label_str = os_label.split(".")
# os_label example: ubuntu.22
try:
ver = int(label_str[1],10)
if label_str[0] == "ubuntu":
if ver >= 22:
passed.add('test_os_linux_ubuntu22_0')
if ver >= 20:
passed.add('test_os_linux_ubuntu20plus_0')
passed.add('test_os_linux_ubuntu20plus_rhel8plus_0')
if ver < 20:
passed.add('test_not_os_linux_ubuntu20plus_0')

if label_str[0] == "rhel":
if ver >= 8:
passed.add('test_os_linux_ubuntu20plus_rhel8plus_0')
except ValueError as ve:
print ("warning: os version value failed to convert to an integer")
passed.add('test_not_os_linux_ubuntu20plus_0')
else:
passed.add('test_not_os_linux_ubuntu20plus_0')

if 'test_os_linux_ubuntu20plus_0' not in passed:
skipped.add('test_os_linux_ubuntu20plus_0')

if 'test_os_linux_ubuntu22_0' not in passed:
skipped.add('test_os_linux_ubuntu22_0')

if 'test_os_linux_ubuntu20plus_rhel8plus_0' not in passed:
skipped.add('test_os_linux_ubuntu20plus_rhel8plus_0')

if 'test_not_os_linux_ubuntu20plus_0' not in passed:
skipped.add('test_not_os_linux_ubuntu20plus_0')

rt &= checkResult(result, passed, set(), set(), skipped)
return rt
rt = True
printTestheader("platformRequirements")

buildList = "TKG/examples/platformRequirements"
command = "make _all"
print(f"\t{command}")
result = subprocess.run(f"{EXPORT_BUILDLIST}={buildList}; {CD_TKG}; {MAKE_CLEAN}; {MAKE_COMPILE}; {command}", stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True, check=False)

stdout = result.stdout.decode()
specStr = re.search(r"set SPEC to (.*)", stdout)

if specStr is not None:
spec = specStr.group(1)
else:
printError("Could not parse spec from output.")
return False

passed = set()
skipped = set()

if 'linux' in spec:
skipped.add('test_not_linux_arch_x86_0')
else:
if 'x86' in spec:
passed.add('test_not_linux_arch_x86_0')
else:
skipped.add('test_not_linux_arch_x86_0')

if 'x86' in spec:
passed.add('test_arch_x86_0')
skipped.add('test_arch_nonx86_0')
else:
passed.add('test_arch_nonx86_0')
skipped.add('test_arch_x86_0')

if '64' in spec:
passed.add('test_bits_64_0')
else:
skipped.add('test_bits_64_0')

if 'osx' in spec:
passed.add('test_os_osx_0')
else:
skipped.add('test_os_osx_0')

if 'osx_x86-64' in spec:
passed.add('test_osx_x86-64_0')
else:
skipped.add('test_osx_x86-64_0')

if 'x86' in spec or '390' in spec:
passed.add('test_arch_x86_390_0')
else:
skipped.add('test_arch_x86_390_0')

if 'osx_x86-64' in spec or ('win_x86' in spec and 'win_x86-64' not in spec) or 'aix_ppc-64' in spec:
passed.add('test_osx_x86-64_win_x86_aix_ppc-64_0')
else:
skipped.add('test_osx_x86-64_win_x86_aix_ppc-64_0')

os_label = re.search(r"set OS_LABEL to (.*)", stdout)
print("os_label in : {}".format(os_label))
if os_label is not None:
os_label = os_label.group(1)
label_str = os_label.split(".")
# os_label example: ubuntu.22
try:
ver = int(label_str[1],10)
if label_str[0] == "ubuntu":
if ver >= 22:
passed.add('test_os_linux_ubuntu22_0')
if ver >= 20:
passed.add('test_os_linux_ubuntu20plus_0')
passed.add('test_os_linux_ubuntu20plus_rhel8plus_0')
if ver < 20:
passed.add('test_not_os_linux_ubuntu20plus_0')

if label_str[0] == "rhel":
if ver >= 8:
passed.add('test_os_linux_ubuntu20plus_rhel8plus_0')
except ValueError as ve:
print ("warning: os version value failed to convert to an integer")
passed.add('test_not_os_linux_ubuntu20plus_0')
else:
passed.add('test_not_os_linux_ubuntu20plus_0')

if 'test_os_linux_ubuntu20plus_0' not in passed:
skipped.add('test_os_linux_ubuntu20plus_0')

if 'test_os_linux_ubuntu22_0' not in passed:
skipped.add('test_os_linux_ubuntu22_0')

if 'test_os_linux_ubuntu20plus_rhel8plus_0' not in passed:
skipped.add('test_os_linux_ubuntu20plus_rhel8plus_0')

if 'test_not_os_linux_ubuntu20plus_0' not in passed:
skipped.add('test_not_os_linux_ubuntu20plus_0')

micro_arch = re.search(r"set MICROARCH to (.*)", stdout)
print("micro_arch in platform req: {}".format(micro_arch))
if micro_arch is not None:
micro_arch = micro_arch.group(1)
label_str = micro_arch
print("Label_str:",label_str)
# micro_arch example: skylake
try:
ver = int(''.join(filter(str.isdigit, micro_arch.split()[-1])))
print("ver:",ver)
if label_str == "skylake":
passed.add('test_microarch_skylake_0')
if ver == 13:
passed.add('test_microarch_z13_0')
elif ver > 13:
passed.add('test_microarch_z13plus_0')
if ver == 14:
passed.add('test_microarch_z14_0')
elif ver > 14:
passed.add('test_microarch_z14plus_0')
if ver == 15:
passed.add('test_microarch_z15_0')
elif ver > 15:
passed.add('test_microarch_z15plus_0')
else:
skipped.add('test_not_microarch_supported_0')
except ValueError as ve:
print("warning: microarch version value failed to convert to an integer")
skipped.add('test_not_microarch_supported_0')
else:
passed.add('test_not_microarch_supported_0')

if 'test_microarch_z15_0' not in passed:
skipped.add('test_microarch_z15_0')

if 'test_microarch_z14_0' not in passed:
skipped.add('test_microarch_z14_0')

if 'test_microarch_z13_0' not in passed:
skipped.add('test_microarch_z13_0')

if 'test_microarch_z15plus_0' not in passed:
skipped.add('test_microarch_z15plus_0')

if 'test_microarch_z14plus_0' not in passed:
skipped.add('test_microarch_z14plus_0')

if 'test_microarch_z13plus_0' not in passed:
skipped.add('test_microarch_z13plus_0')

if 'test_microarch_skylake_0' not in passed:
skipped.add('test_microarch_skylake_0')


rt &= checkResult(result, passed, set(), set(), skipped)
return rt

if __name__ == "__main__":
run_test()
run_test()
28 changes: 25 additions & 3 deletions src/org/openj9/envInfo/MachineInfo.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ public class MachineInfo {
public static final String[] LINUX_OS_NAME_CMD = new String[] {"bash", "-c", "grep '^NAME' /etc/os-release | awk -F'=' ' gsub(/\"/,\"\") { print $2}'"};
public static final String[] LINUX_OS_VERSION_CMD = new String[] {"bash", "-c", "grep '^VERSION_ID' /etc/os-release | awk -F'=' ' gsub(/\"/,\"\") { print $2}'"};

public static final String[] MICRO_ARCH_CMD = new String[] {"bash", "-c", "cat /proc/cpuinfo | grep 'model name' | uniq"};
public static final String[] MICRO_ARCH_CMD = new String[] {"bash", "-c", "cat /proc/cpuinfo | grep -E 'machine|model name' | uniq"};

public static final String[] ULIMIT_CMD = new String[] {"bash", "-c", "ulimit -a"};

public static final String[] INSTALLED_MEM_CMD = new String[] {"bash", "-c", "grep MemTotal /proc/meminfo | awk '{print $2}"};
Expand Down Expand Up @@ -201,10 +202,31 @@ private void getSysInfo() {
putInfo(new Info("sysArch", SYS_ARCH_CMD, ce.execute(SYS_ARCH_CMD), null));
putInfo(new Info("procArch", PROC_ARCH_CMD, ce.execute(PROC_ARCH_CMD), null));
String microArchOutput = ce.execute(MICRO_ARCH_CMD);
String microArch = "";
// Check for specific machine versions and set the microArch accordingly
if (microArchOutput.toLowerCase().contains("skylake")) {
String microArch = "skylake";
microArch = "skylake";
} else if (microArchOutput.contains("8562")) {
microArch = "IBM z15";
} else if (microArchOutput.contains("8561")) {
microArch = "IBM z15";
} else if (microArchOutput.contains("3907")) {
microArch = "IBM z14";
} else if (microArchOutput.contains("3906")) {
microArch = "IBM z14";
} else if (microArchOutput.contains("2965")) {
microArch = "IBM z13";
} else if (microArchOutput.contains("2964")) {
microArch= "IBM z13";
}
else {
System.out.println("Unfamiliar microArch detected in TKG. It will not be added in TKG microArch!");
System.out.println("microArchOutput: " + microArchOutput);
}

if (!microArch.isEmpty()) {
putInfo(new Info("microArch", MICRO_ARCH_CMD, microArch, null));
}
}
putInfo(new Info("sysOS", SYS_OS_CMD, ce.execute(SYS_OS_CMD), null));
putInfo(new Info("ulimit", ULIMIT_CMD, ce.execute(ULIMIT_CMD), null));
putInfo(new Info("docker", CHECK_DOCKER_CMD, ce.execute(CHECK_DOCKER_CMD), null));
Expand Down

0 comments on commit a032782

Please sign in to comment.