Merge release branch 4.18 to main

* 4.18:
  server: remove registered userdata when cleanup an account (#7777)
  server: Use max secondary storage defined on the account during upload  (#7441)
  test: upgrade kubernetes versions to 1.25.0/1.26.0 (#7685)
  kvm: Added VNI Devices as normal bridge slave devs (#7836)
  noVNC: fix JP keyboard on vmware7+ which uses websocket URL (#7694)
This commit is contained in:
Daan Hoogland 2023-08-10 14:50:46 +02:00
commit 7b64236469
20 changed files with 1398 additions and 38 deletions

View File

@ -117,6 +117,15 @@ public interface ResourceLimitService {
*/ */
public long findDefaultResourceLimitForDomain(ResourceType resourceType); public long findDefaultResourceLimitForDomain(ResourceType resourceType);
/**
* Finds the resource limit for a specified account, domain and type.
*
* @param domain
* @param type
* @return resource limit
*/
public long findCorrectResourceLimitForAccountAndDomain(Account account, Domain domain, ResourceType type);
/** /**
* Increments the resource count * Increments the resource count
* *

View File

@ -25,4 +25,6 @@ public interface UserDataDao extends GenericDao<UserDataVO, Long> {
public UserDataVO findByName(long accountId, long domainId, String name); public UserDataVO findByName(long accountId, long domainId, String name);
int removeByAccountId(long accountId);
} }

View File

@ -63,4 +63,11 @@ public class UserDataDaoImpl extends GenericDaoBase<UserDataVO, Long> implements
return findOneBy(sc); return findOneBy(sc);
} }
@Override
public int removeByAccountId(long accountId) {
SearchCriteria<UserDataVO> sc = userdataSearch.create();
sc.setParameters("accountId", accountId);
return remove(sc);
}
} }

View File

@ -1713,7 +1713,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
"^enx", "^enx",
"^dummy", "^dummy",
"^lo", "^lo",
"^p\\d+p\\d+" "^p\\d+p\\d+",
"^vni"
}; };
/** /**

View File

@ -547,6 +547,18 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
return resourceLimit; return resourceLimit;
} }
@Override
public long findCorrectResourceLimitForAccountAndDomain(Account account, Domain domain, ResourceType type) {
long maxSecondaryStorageForAccount = findCorrectResourceLimitForAccount(account, type);
long maxSecondaryStorageForDomain = findCorrectResourceLimitForDomain(domain, type);
if (maxSecondaryStorageForDomain == Resource.RESOURCE_UNLIMITED || maxSecondaryStorageForAccount == Resource.RESOURCE_UNLIMITED) {
return Math.max(maxSecondaryStorageForDomain, maxSecondaryStorageForAccount);
}
return Math.min(maxSecondaryStorageForDomain, maxSecondaryStorageForAccount);
}
@Override @Override
@DB @DB
public void checkResourceLimit(final Account account, final ResourceType type, long... count) throws ResourceAllocationException { public void checkResourceLimit(final Account account, final ResourceType type, long... count) throws ResourceAllocationException {

View File

@ -34,6 +34,7 @@ import java.util.concurrent.ExecutionException;
import javax.inject.Inject; import javax.inject.Inject;
import com.cloud.domain.dao.DomainDao;
import org.apache.cloudstack.api.ApiConstants.IoDriverPolicy; import org.apache.cloudstack.api.ApiConstants.IoDriverPolicy;
import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.InternalIdentity; import org.apache.cloudstack.api.InternalIdentity;
@ -331,6 +332,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
@Inject @Inject
protected SnapshotHelper snapshotHelper; protected SnapshotHelper snapshotHelper;
@Inject
protected DomainDao domainDao;
@Inject @Inject
protected ProjectManager projectManager; protected ProjectManager projectManager;
@Inject @Inject
@ -486,13 +490,13 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
//using the existing max upload size configuration //using the existing max upload size configuration
command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"), 3600)); command.setProcessTimeout(NumbersUtil.parseLong(_configDao.getValue("vmware.package.ova.timeout"), 3600));
command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key())); command.setMaxUploadSize(_configDao.getValue(Config.MaxUploadVolumeSize.key()));
command.setAccountId(vol.getAccountId());
Account account = _accountDao.findById(vol.getAccountId()); long accountId = vol.getAccountId();
if (account.getType().equals(Account.Type.PROJECT)) { Account account = _accountDao.findById(accountId);
command.setDefaultMaxSecondaryStorageInGB(ResourceLimitService.MaxProjectSecondaryStorage.value()); Domain domain = domainDao.findById(account.getDomainId());
} else {
command.setDefaultMaxSecondaryStorageInGB(ResourceLimitService.MaxAccountSecondaryStorage.value()); command.setDefaultMaxSecondaryStorageInGB(_resourceLimitMgr.findCorrectResourceLimitForAccountAndDomain(account, domain, ResourceType.secondary_storage));
} command.setAccountId(accountId);
Gson gson = new GsonBuilder().create(); Gson gson = new GsonBuilder().create();
String metadata = EncryptionUtil.encodeData(gson.toJson(command), key); String metadata = EncryptionUtil.encodeData(gson.toJson(command), key);
response.setMetadata(metadata); response.setMetadata(metadata);

View File

@ -28,6 +28,7 @@ import java.util.stream.Collectors;
import javax.inject.Inject; import javax.inject.Inject;
import com.cloud.domain.Domain;
import org.apache.cloudstack.agent.directdownload.CheckUrlAnswer; import org.apache.cloudstack.agent.directdownload.CheckUrlAnswer;
import org.apache.cloudstack.agent.directdownload.CheckUrlCommand; import org.apache.cloudstack.agent.directdownload.CheckUrlCommand;
import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.annotation.AnnotationService;
@ -93,7 +94,6 @@ import com.cloud.storage.dao.VMTemplateZoneDao;
import com.cloud.storage.download.DownloadMonitor; import com.cloud.storage.download.DownloadMonitor;
import com.cloud.template.VirtualMachineTemplate.State; import com.cloud.template.VirtualMachineTemplate.State;
import com.cloud.user.Account; import com.cloud.user.Account;
import com.cloud.user.ResourceLimitService;
import com.cloud.utils.Pair; import com.cloud.utils.Pair;
import com.cloud.utils.UriUtils; import com.cloud.utils.UriUtils;
import com.cloud.utils.db.DB; import com.cloud.utils.db.DB;
@ -402,13 +402,13 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase {
templateOnStore.getDataStore().getRole().toString()); templateOnStore.getDataStore().getRole().toString());
//using the existing max template size configuration //using the existing max template size configuration
payload.setMaxUploadSize(_configDao.getValue(Config.MaxTemplateAndIsoSize.key())); payload.setMaxUploadSize(_configDao.getValue(Config.MaxTemplateAndIsoSize.key()));
payload.setAccountId(template.getAccountId());
Account account = _accountDao.findById(template.getAccountId()); Long accountId = template.getAccountId();
if (account.getType().equals(Account.Type.PROJECT)) { Account account = _accountDao.findById(accountId);
payload.setDefaultMaxSecondaryStorageInGB(ResourceLimitService.MaxProjectSecondaryStorage.value()); Domain domain = _domainDao.findById(account.getDomainId());
} else {
payload.setDefaultMaxSecondaryStorageInGB(ResourceLimitService.MaxAccountSecondaryStorage.value()); payload.setDefaultMaxSecondaryStorageInGB(_resourceLimitMgr.findCorrectResourceLimitForAccountAndDomain(account, domain, ResourceType.secondary_storage));
} payload.setAccountId(accountId);
payload.setRemoteEndPoint(ep.getPublicAddr()); payload.setRemoteEndPoint(ep.getPublicAddr());
payload.setRequiresHvm(template.requiresHvm()); payload.setRequiresHvm(template.requiresHvm());
payload.setDescription(template.getDisplayText()); payload.setDescription(template.getDisplayText());

View File

@ -162,6 +162,7 @@ import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.SSHKeyPairDao; import com.cloud.user.dao.SSHKeyPairDao;
import com.cloud.user.dao.UserAccountDao; import com.cloud.user.dao.UserAccountDao;
import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserDao;
import com.cloud.user.dao.UserDataDao;
import com.cloud.utils.ConstantTimeComparator; import com.cloud.utils.ConstantTimeComparator;
import com.cloud.utils.NumbersUtil; import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair; import com.cloud.utils.Pair;
@ -292,6 +293,8 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
private GlobalLoadBalancerRuleDao _gslbRuleDao; private GlobalLoadBalancerRuleDao _gslbRuleDao;
@Inject @Inject
private SSHKeyPairDao _sshKeyPairDao; private SSHKeyPairDao _sshKeyPairDao;
@Inject
private UserDataDao userDataDao;
private List<QuerySelector> _querySelectors; private List<QuerySelector> _querySelectors;
@ -1089,6 +1092,10 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
for (SSHKeyPairVO keypair : sshkeypairs) { for (SSHKeyPairVO keypair : sshkeypairs) {
_sshKeyPairDao.remove(keypair.getId()); _sshKeyPairDao.remove(keypair.getId());
} }
// Delete registered UserData
userDataDao.removeByAccountId(accountId);
return true; return true;
} catch (Exception ex) { } catch (Exception ex) {
s_logger.warn("Failed to cleanup account " + account + " due to ", ex); s_logger.warn("Failed to cleanup account " + account + " due to ", ex);

View File

@ -385,7 +385,7 @@ public class ConsoleAccessManagerImpl extends ManagerBase implements ConsoleAcce
String token = encryptor.encryptObject(ConsoleProxyClientParam.class, param); String token = encryptor.encryptObject(ConsoleProxyClientParam.class, param);
int vncPort = consoleProxyManager.getVncPort(); int vncPort = consoleProxyManager.getVncPort();
String url = generateConsoleAccessUrl(rootUrl, param, token, vncPort, vm); String url = generateConsoleAccessUrl(rootUrl, param, token, vncPort, vm, hostVo, details);
s_logger.debug("Adding allowed session: " + sessionUuid); s_logger.debug("Adding allowed session: " + sessionUuid);
persistConsoleSession(sessionUuid, vm.getId(), hostVo.getId()); persistConsoleSession(sessionUuid, vm.getId(), hostVo.getId());
@ -413,7 +413,7 @@ public class ConsoleAccessManagerImpl extends ManagerBase implements ConsoleAcce
} }
private String generateConsoleAccessUrl(String rootUrl, ConsoleProxyClientParam param, String token, int vncPort, private String generateConsoleAccessUrl(String rootUrl, ConsoleProxyClientParam param, String token, int vncPort,
VirtualMachine vm) { VirtualMachine vm, HostVO hostVo, UserVmDetailVO details) {
StringBuilder sb = new StringBuilder(rootUrl); StringBuilder sb = new StringBuilder(rootUrl);
if (param.getHypervHost() != null || !ConsoleProxyManager.NoVncConsoleDefault.value()) { if (param.getHypervHost() != null || !ConsoleProxyManager.NoVncConsoleDefault.value()) {
sb.append("/ajax?token=" + token); sb.append("/ajax?token=" + token);
@ -422,6 +422,9 @@ public class ConsoleAccessManagerImpl extends ManagerBase implements ConsoleAcce
.append("?autoconnect=true") .append("?autoconnect=true")
.append("&port=" + vncPort) .append("&port=" + vncPort)
.append("&token=" + token); .append("&token=" + token);
if (requiresVncOverWebSocketConnection(vm, hostVo) && details != null && details.getValue() != null) {
sb.append("&language=" + details.getValue());
}
} }
if (StringUtils.isNotBlank(param.getExtraSecurityToken())) { if (StringUtils.isNotBlank(param.getExtraSecurityToken())) {

View File

@ -164,6 +164,7 @@ public class AccountManagerImplTest extends AccountManagetImplTestBase {
sshkeyList.add(sshkey); sshkeyList.add(sshkey);
Mockito.when(_sshKeyPairDao.listKeyPairs(Mockito.anyLong(), Mockito.anyLong())).thenReturn(sshkeyList); Mockito.when(_sshKeyPairDao.listKeyPairs(Mockito.anyLong(), Mockito.anyLong())).thenReturn(sshkeyList);
Mockito.when(_sshKeyPairDao.remove(Mockito.anyLong())).thenReturn(true); Mockito.when(_sshKeyPairDao.remove(Mockito.anyLong())).thenReturn(true);
Mockito.when(userDataDao.removeByAccountId(Mockito.anyLong())).thenReturn(222);
Assert.assertTrue(accountManagerImpl.deleteUserAccount(42l)); Assert.assertTrue(accountManagerImpl.deleteUserAccount(42l));
// assert that this was a clean delete // assert that this was a clean delete

View File

@ -73,6 +73,7 @@ import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.SSHKeyPairDao; import com.cloud.user.dao.SSHKeyPairDao;
import com.cloud.user.dao.UserAccountDao; import com.cloud.user.dao.UserAccountDao;
import com.cloud.user.dao.UserDao; import com.cloud.user.dao.UserDao;
import com.cloud.user.dao.UserDataDao;
import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.InstanceGroupDao; import com.cloud.vm.dao.InstanceGroupDao;
@ -193,6 +194,8 @@ public class AccountManagetImplTestBase {
OrchestrationService _orchSrvc; OrchestrationService _orchSrvc;
@Mock @Mock
SSHKeyPairDao _sshKeyPairDao; SSHKeyPairDao _sshKeyPairDao;
@Mock
UserDataDao userDataDao;
@Spy @Spy
@InjectMocks @InjectMocks

View File

@ -93,6 +93,11 @@ public class MockResourceLimitManagerImpl extends ManagerBase implements Resourc
return 0; return 0;
} }
@Override
public long findCorrectResourceLimitForAccountAndDomain(Account account, Domain domain, ResourceType type) {
return 0;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see com.cloud.user.ResourceLimitService#incrementResourceCount(long, com.cloud.configuration.Resource.ResourceType, java.lang.Long[]) * @see com.cloud.user.ResourceLimitService#incrementResourceCount(long, com.cloud.configuration.Resource.ResourceType, java.lang.Long[])
*/ */

View File

@ -1077,6 +1077,7 @@ const UI = {
UI.rfb = new RFB(document.getElementById('noVNC_container'), url, UI.rfb = new RFB(document.getElementById('noVNC_container'), url,
{ shared: UI.getSetting('shared'), { shared: UI.getSetting('shared'),
repeaterID: UI.getSetting('repeaterID'), repeaterID: UI.getSetting('repeaterID'),
language: WebUtil.getConfigVar('language'),
credentials: { password: password } }); credentials: { password: password } });
UI.rfb.addEventListener("connect", UI.connectFinished); UI.rfb.addEventListener("connect", UI.connectFinished);
UI.rfb.addEventListener("disconnect", UI.disconnectFinished); UI.rfb.addEventListener("disconnect", UI.disconnectFinished);

View File

@ -37,6 +37,7 @@ import TightDecoder from "./decoders/tight.js";
import TightPNGDecoder from "./decoders/tightpng.js"; import TightPNGDecoder from "./decoders/tightpng.js";
import ZRLEDecoder from "./decoders/zrle.js"; import ZRLEDecoder from "./decoders/zrle.js";
import JPEGDecoder from "./decoders/jpeg.js"; import JPEGDecoder from "./decoders/jpeg.js";
import SCANCODES_JP from "../keymaps/keymap-ja-atset1.js"
// How many seconds to wait for a disconnect to finish // How many seconds to wait for a disconnect to finish
const DISCONNECT_TIMEOUT = 3; const DISCONNECT_TIMEOUT = 3;
@ -118,8 +119,15 @@ export default class RFB extends EventTargetMixin {
this._rfbCredentials = options.credentials || {}; this._rfbCredentials = options.credentials || {};
this._shared = 'shared' in options ? !!options.shared : true; this._shared = 'shared' in options ? !!options.shared : true;
this._repeaterID = options.repeaterID || ''; this._repeaterID = options.repeaterID || '';
this._language = options.language || '';
this._wsProtocols = ['binary']; this._wsProtocols = ['binary'];
// Keymaps
this._scancodes = {};
if (this._language === "jp") {
this._scancodes = SCANCODES_JP;
}
// Internal state // Internal state
this._rfbConnectionState = ''; this._rfbConnectionState = '';
this._rfbInitState = ''; this._rfbInitState = '';
@ -181,6 +189,10 @@ export default class RFB extends EventTargetMixin {
encoding: null, encoding: null,
}; };
// Keys
this._shiftPressed = false;
this._shiftKey = KeyTable.XK_Shift_L;
// Mouse state // Mouse state
this._mousePos = {}; this._mousePos = {};
this._mouseButtonMask = 0; this._mouseButtonMask = 0;
@ -506,6 +518,11 @@ export default class RFB extends EventTargetMixin {
const scancode = XtScancode[code]; const scancode = XtScancode[code];
if (keysym === KeyTable.XK_Shift_L || keysym === KeyTable.XK_Shift_R) {
this._shiftPressed = down;
this._shiftKey = down ? keysym : KeyTable.XK_Shift_L;
}
if (this._qemuExtKeyEventSupported && scancode) { if (this._qemuExtKeyEventSupported && scancode) {
// 0 is NoSymbol // 0 is NoSymbol
keysym = keysym || 0; keysym = keysym || 0;
@ -513,6 +530,31 @@ export default class RFB extends EventTargetMixin {
Log.Info("Sending key (" + (down ? "down" : "up") + "): keysym " + keysym + ", scancode " + scancode); Log.Info("Sending key (" + (down ? "down" : "up") + "): keysym " + keysym + ", scancode " + scancode);
RFB.messages.QEMUExtendedKeyEvent(this._sock, keysym, down, scancode); RFB.messages.QEMUExtendedKeyEvent(this._sock, keysym, down, scancode);
} else if (Object.keys(this._scancodes).length > 0) {
let vscancode = this._scancodes[keysym]
if (vscancode) {
let shifted = vscancode.includes("shift");
let vscancode_int = parseInt(vscancode);
let isLetter = (keysym >= 65 && keysym <=90) || (keysym >=97 && keysym <=122);
if (shifted && ! this._shiftPressed && ! isLetter) {
RFB.messages.keyEvent(this._sock, this._shiftKey, 1);
}
if (! shifted && this._shiftPressed && ! isLetter) {
RFB.messages.keyEvent(this._sock, this._shiftKey, 0);
}
RFB.messages.VMwareExtendedKeyEvent(this._sock, keysym, down, vscancode_int);
if (shifted && ! this._shiftPressed && ! isLetter) {
RFB.messages.keyEvent(this._sock, this._shiftKey, 0);
}
if (! shifted && this._shiftPressed && ! isLetter) {
RFB.messages.keyEvent(this._sock, this._shiftKey, 1);
}
} else {
if (this._language === "jp" && keysym === 65328) {
keysym = 65509; // Caps lock
}
RFB.messages.keyEvent(this._sock, keysym, down ? 1 : 0);
}
} else { } else {
if (!keysym) { if (!keysym) {
return; return;
@ -3031,6 +3073,26 @@ RFB.messages = {
sock.flush(); sock.flush();
}, },
VMwareExtendedKeyEvent(sock, keysym, down, keycode) {
const buff = sock._sQ;
const offset = sock._sQlen;
buff[offset] = 127; // msgVMWClientMessage
buff[offset + 1] = 0; // msgVMWKeyEvent
buff[offset + 2] = 0;
buff[offset + 3] = 8;
buff[offset + 4] = (keycode >> 8);
buff[offset + 5] = keycode;
buff[offset + 6] = down;
buff[offset + 7] = 0;
sock._sQlen += 8;
sock.flush();
},
pointerEvent(sock, x, y, mask) { pointerEvent(sock, x, y, mask) {
const buff = sock._sQ; const buff = sock._sQ;
const offset = sock._sQlen; const offset = sock._sQlen;

View File

@ -0,0 +1,127 @@
#!/usr/bin/env python
# This script
# (1) loads keysym name and keycode mappings from noVNC/core/input/keysym.js and
# (2) loads keysyn name to atset1 code mappings from keymap files which can be downloadeded from https://github.com/qemu/qemu/blob/master/pc-bios/keymaps
# (3) generates the mappings of keycode and atset1 code
#
# Note: please add language specific mappings if needed.
import os
import sys
keycode_to_x11name = {}
x11name_to_atset1 = {}
layout = ""
result_mappings = {}
js_config = []
def generate_x11name_to_atset1_map(keymap_file):
# keymap files can be downloadeded from
# https://github.com/qemu/qemu/blob/master/pc-bios/keymaps
global layout
try:
for c in open(keymap_file):
if len(c.strip()) == 0:
continue
if c.startswith("# quirks section start"):
# Stop at the quirks section
break
if c.startswith("#"):
if "layout" in c and ":" in c:
layout = c.split(":")[1].strip()
continue
if "map " in c:
continue
values = c.strip().split(" ")
if len(values) >= 2:
keyname = 'XK_' + values[0]
keycode = ' '.join(values[1:]).strip()
if keyname not in x11name_to_atset1:
x11name_to_atset1[keyname] = keycode
else:
print("Duplicated atset1 code for x11name '%s': '%s' and '%s'" % (
keyname, x11name_to_atset1[keyname], keycode))
except IOError:
print(
"File '%s' does not exist. \nkeymaps can be downloaded from https://github.com/qemu/qemu/tree/master/pc-bios/keymaps" % keymap_file)
sys.exit(2)
def generate_keycode_to_x11name():
for k in open("../core/input/keysym.js"):
k = k.strip()
if k.startswith("/") or k.startswith("*"):
continue
values = k.split(":")
if len(values) >= 2:
keyname = values[0]
keycode = values[1].strip().split(",")[0].lower()
keycode_int = int(keycode, 16)
if str(keycode_int) not in keycode_to_x11name:
keycode_to_x11name[str(keycode_int)] = keyname
def translate(keysym):
x11name = keycode_to_x11name[str(keysym)]
if x11name not in x11name_to_atset1:
print("Cannot find atset1 code for keysym (%s) / x11name (%s) in keymaps" % (keysym, x11name))
return "", ""
atset1 = x11name_to_atset1[x11name]
values = atset1.split(" ")
rest = ""
if len(values) >= 2:
atset1 = values[0]
rest = " ".join(values[1:])
return str(int(atset1, 16)), rest
def add_language_specific_mappings():
if layout == "jp":
add_specific_mapping("124", "125", "shift") # bar
def add_specific_mapping(keycode, atset1, rest):
result_mappings[keycode] = "%s %s" % (str(atset1).ljust(10), rest)
def generate_js_file(keymap_file):
generated_filename = keymap_file + "-atset1.js"
handle = open(generated_filename, "w")
js_config.append("/* This file is auto-generated by generate-language-keymaps.py\n")
js_config.append(" * command : %s\n" % (" ".join(sys.argv)))
js_config.append(" * layout : %s\n" % layout)
js_config.append(" */\n")
js_config.append("export default {\n")
for keycode in dict(sorted(result_mappings.items(), key=lambda item: int(item[0]))):
js_config.append("%10s : \"%s\",\n" % ("\"" + str(keycode) + "\"", result_mappings[keycode].strip()))
js_config.append("}")
for line in js_config:
handle.write(line)
handle.close()
print("Created file %s" % generated_filename)
def main(argv):
if len(argv) < 1:
print("Usage: %s <keymap file>" % (sys.argv[0]))
sys.exit(1)
keymap_file = argv[0]
generate_keycode_to_x11name()
generate_x11name_to_atset1_map(keymap_file)
# insert language-specific mappings at beginning
add_language_specific_mappings()
for keycode in keycode_to_x11name:
atset1, rest = translate(keycode)
if atset1 and keycode not in result_mappings and int(keycode) < 65000:
result_mappings[keycode] = "%s %s" % (str(atset1).ljust(10), rest)
generate_js_file(keymap_file)
if __name__ == "__main__":
main(sys.argv[1:])

View File

@ -0,0 +1,995 @@
#
# generated by qemu-keymap
# model : jp106
# layout : jp
# variant : -
# options : -
# name: "Japanese"
# modifiers
# 0: Shift
# 1: Lock
# 2: Control
# 3: Mod1
# 4: Mod2
# 5: Mod3
# 6: Mod4
# 7: Mod5
# 8: NumLock
# 9: Alt
# 10: LevelThree
# 11: LAlt
# 12: RAlt
# 13: RControl
# 14: LControl
# 15: ScrollLock
# 16: LevelFive
# 17: AltGr
# 18: Meta
# 19: Super
# 20: Hyper
# evdev 1 (0x1), QKeyCode "esc", number 0x1
Escape 0x01
# evdev 2 (0x2), QKeyCode "1", number 0x2
1 0x02
exclam 0x02 shift
# evdev 3 (0x3), QKeyCode "2", number 0x3
2 0x03
quotedbl 0x03 shift
# evdev 4 (0x4), QKeyCode "3", number 0x4
3 0x04
numbersign 0x04 shift
# evdev 5 (0x5), QKeyCode "4", number 0x5
4 0x05
dollar 0x05 shift
# evdev 6 (0x6), QKeyCode "5", number 0x6
5 0x06
percent 0x06 shift
# evdev 7 (0x7), QKeyCode "6", number 0x7
6 0x07
ampersand 0x07 shift
# evdev 8 (0x8), QKeyCode "7", number 0x8
7 0x08
apostrophe 0x08 shift
# evdev 9 (0x9), QKeyCode "8", number 0x9
8 0x09
parenleft 0x09 shift
# evdev 10 (0xa), QKeyCode "9", number 0xa
9 0x0a
parenright 0x0a shift
# evdev 11 (0xb), QKeyCode "0", number 0xb
0 0x0b
asciitilde 0x0b shift
# evdev 12 (0xc), QKeyCode "minus", number 0xc
minus 0x0c
equal 0x0c shift
# evdev 13 (0xd), QKeyCode "equal", number 0xd
asciicircum 0x0d
asciitilde 0x0d shift
# evdev 14 (0xe), QKeyCode "backspace", number 0xe
BackSpace 0x0e
# evdev 15 (0xf), QKeyCode "tab", number 0xf
Tab 0x0f
ISO_Left_Tab 0x0f shift
# evdev 16 (0x10), QKeyCode "q", number 0x10
q 0x10
Q 0x10 shift
# evdev 17 (0x11), QKeyCode "w", number 0x11
w 0x11
W 0x11 shift
# evdev 18 (0x12), QKeyCode "e", number 0x12
e 0x12
E 0x12 shift
# evdev 19 (0x13), QKeyCode "r", number 0x13
r 0x13
R 0x13 shift
# evdev 20 (0x14), QKeyCode "t", number 0x14
t 0x14
T 0x14 shift
# evdev 21 (0x15), QKeyCode "y", number 0x15
y 0x15
Y 0x15 shift
# evdev 22 (0x16), QKeyCode "u", number 0x16
u 0x16
U 0x16 shift
# evdev 23 (0x17), QKeyCode "i", number 0x17
i 0x17
I 0x17 shift
# evdev 24 (0x18), QKeyCode "o", number 0x18
o 0x18
O 0x18 shift
# evdev 25 (0x19), QKeyCode "p", number 0x19
p 0x19
P 0x19 shift
# evdev 26 (0x1a), QKeyCode "bracket_left", number 0x1a
at 0x1a
grave 0x1a shift
# evdev 27 (0x1b), QKeyCode "bracket_right", number 0x1b
bracketleft 0x1b
braceleft 0x1b shift
# evdev 28 (0x1c), QKeyCode "ret", number 0x1c
Return 0x1c
# evdev 29 (0x1d), QKeyCode "ctrl", number 0x1d
Control_L 0x1d
# evdev 30 (0x1e), QKeyCode "a", number 0x1e
a 0x1e
A 0x1e shift
# evdev 31 (0x1f), QKeyCode "s", number 0x1f
s 0x1f
S 0x1f shift
# evdev 32 (0x20), QKeyCode "d", number 0x20
d 0x20
D 0x20 shift
# evdev 33 (0x21), QKeyCode "f", number 0x21
f 0x21
F 0x21 shift
# evdev 34 (0x22), QKeyCode "g", number 0x22
g 0x22
G 0x22 shift
# evdev 35 (0x23), QKeyCode "h", number 0x23
h 0x23
H 0x23 shift
# evdev 36 (0x24), QKeyCode "j", number 0x24
j 0x24
J 0x24 shift
# evdev 37 (0x25), QKeyCode "k", number 0x25
k 0x25
K 0x25 shift
# evdev 38 (0x26), QKeyCode "l", number 0x26
l 0x26
L 0x26 shift
# evdev 39 (0x27), QKeyCode "semicolon", number 0x27
semicolon 0x27
plus 0x27 shift
# evdev 40 (0x28), QKeyCode "apostrophe", number 0x28
colon 0x28
asterisk 0x28 shift
# evdev 41 (0x29), QKeyCode "grave_accent", number 0x29
Zenkaku_Hankaku 0x29
# evdev 42 (0x2a), QKeyCode "shift", number 0x2a
Shift_L 0x2a
# evdev 43 (0x2b), QKeyCode "backslash", number 0x2b
bracketright 0x2b
braceright 0x2b shift
# evdev 44 (0x2c), QKeyCode "z", number 0x2c
z 0x2c
Z 0x2c shift
# evdev 45 (0x2d), QKeyCode "x", number 0x2d
x 0x2d
X 0x2d shift
# evdev 46 (0x2e), QKeyCode "c", number 0x2e
c 0x2e
C 0x2e shift
# evdev 47 (0x2f), QKeyCode "v", number 0x2f
v 0x2f
V 0x2f shift
# evdev 48 (0x30), QKeyCode "b", number 0x30
b 0x30
B 0x30 shift
# evdev 49 (0x31), QKeyCode "n", number 0x31
n 0x31
N 0x31 shift
# evdev 50 (0x32), QKeyCode "m", number 0x32
m 0x32
M 0x32 shift
# evdev 51 (0x33), QKeyCode "comma", number 0x33
comma 0x33
less 0x33 shift
# evdev 52 (0x34), QKeyCode "dot", number 0x34
period 0x34
greater 0x34 shift
# evdev 53 (0x35), QKeyCode "slash", number 0x35
slash 0x35
question 0x35 shift
# evdev 54 (0x36), QKeyCode "shift_r", number 0x36
Shift_R 0x36
# evdev 55 (0x37), QKeyCode "kp_multiply", number 0x37
KP_Multiply 0x37
# evdev 56 (0x38), QKeyCode "alt", number 0x38
Alt_L 0x38
Meta_L 0x38 shift
# evdev 57 (0x39), QKeyCode "spc", number 0x39
space 0x39
# evdev 58 (0x3a), QKeyCode "caps_lock", number 0x3a
Eisu_toggle 0x3a
Caps_Lock 0x3a shift
# evdev 59 (0x3b), QKeyCode "f1", number 0x3b
F1 0x3b
# evdev 60 (0x3c), QKeyCode "f2", number 0x3c
F2 0x3c
# evdev 61 (0x3d), QKeyCode "f3", number 0x3d
F3 0x3d
# evdev 62 (0x3e), QKeyCode "f4", number 0x3e
F4 0x3e
# evdev 63 (0x3f), QKeyCode "f5", number 0x3f
F5 0x3f
# evdev 64 (0x40), QKeyCode "f6", number 0x40
F6 0x40
# evdev 65 (0x41), QKeyCode "f7", number 0x41
F7 0x41
# evdev 66 (0x42), QKeyCode "f8", number 0x42
F8 0x42
# evdev 67 (0x43), QKeyCode "f9", number 0x43
F9 0x43
# evdev 68 (0x44), QKeyCode "f10", number 0x44
F10 0x44
# evdev 69 (0x45), QKeyCode "num_lock", number 0x45
Num_Lock 0x45
# evdev 70 (0x46), QKeyCode "scroll_lock", number 0x46
Scroll_Lock 0x46
# evdev 71 (0x47), QKeyCode "kp_7", number 0x47
KP_Home 0x47
KP_7 0x47 numlock
# evdev 72 (0x48), QKeyCode "kp_8", number 0x48
KP_Up 0x48
KP_8 0x48 numlock
# evdev 73 (0x49), QKeyCode "kp_9", number 0x49
KP_Prior 0x49
KP_9 0x49 numlock
# evdev 74 (0x4a), QKeyCode "kp_subtract", number 0x4a
KP_Subtract 0x4a
# evdev 75 (0x4b), QKeyCode "kp_4", number 0x4b
KP_Left 0x4b
KP_4 0x4b numlock
# evdev 76 (0x4c), QKeyCode "kp_5", number 0x4c
KP_Begin 0x4c
KP_5 0x4c numlock
# evdev 77 (0x4d), QKeyCode "kp_6", number 0x4d
KP_Right 0x4d
KP_6 0x4d numlock
# evdev 78 (0x4e), QKeyCode "kp_add", number 0x4e
KP_Add 0x4e
# evdev 79 (0x4f), QKeyCode "kp_1", number 0x4f
KP_End 0x4f
KP_1 0x4f numlock
# evdev 80 (0x50), QKeyCode "kp_2", number 0x50
KP_Down 0x50
KP_2 0x50 numlock
# evdev 81 (0x51), QKeyCode "kp_3", number 0x51
KP_Next 0x51
KP_3 0x51 numlock
# evdev 82 (0x52), QKeyCode "kp_0", number 0x52
KP_Insert 0x52
KP_0 0x52 numlock
# evdev 83 (0x53), QKeyCode "kp_decimal", number 0x53
KP_Delete 0x53
KP_Decimal 0x53 numlock
# evdev 84 (0x54): no evdev -> QKeyCode mapping (xkb keysym ISO_Level3_Shift)
# evdev 85 (0x55): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 86 (0x56), QKeyCode "less", number 0x56
less 0x56
greater 0x56 shift
bar 0x56 altgr
brokenbar 0x56 shift altgr
# evdev 87 (0x57), QKeyCode "f11", number 0x57
F11 0x57
# evdev 88 (0x58), QKeyCode "f12", number 0x58
F12 0x58
# evdev 89 (0x59), QKeyCode "ro", number 0x73
backslash 0x73
underscore 0x73 shift
# evdev 90 (0x5a): no evdev -> QKeyCode mapping (xkb keysym Katakana)
# evdev 91 (0x5b), QKeyCode "hiragana", number 0x77
Hiragana 0x77
# evdev 92 (0x5c), QKeyCode "henkan", number 0x79
Henkan_Mode 0x79
# evdev 93 (0x5d), QKeyCode "katakanahiragana", number 0x70
Hiragana_Katakana 0x70
# evdev 94 (0x5e), QKeyCode "muhenkan", number 0x7b
Muhenkan 0x7b
# evdev 95 (0x5f): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 96 (0x60), QKeyCode "kp_enter", number 0x9c
KP_Enter 0x9c
# evdev 97 (0x61), QKeyCode "ctrl_r", number 0x9d
Control_R 0x9d
# evdev 98 (0x62), QKeyCode "kp_divide", number 0xb5
KP_Divide 0xb5
# evdev 99 (0x63), QKeyCode "sysrq", number 0x54
Print 0x54
# evdev 100 (0x64), QKeyCode "alt_r", number 0xb8
Alt_R 0xb8
Meta_R 0xb8 shift
# evdev 101 (0x65), QKeyCode "lf", number 0x5b
Linefeed 0x5b
# evdev 102 (0x66), QKeyCode "home", number 0xc7
Home 0xc7
# evdev 103 (0x67), QKeyCode "up", number 0xc8
Up 0xc8
# evdev 104 (0x68), QKeyCode "pgup", number 0xc9
Prior 0xc9
# evdev 105 (0x69), QKeyCode "left", number 0xcb
Left 0xcb
# evdev 106 (0x6a), QKeyCode "right", number 0xcd
Right 0xcd
# evdev 107 (0x6b), QKeyCode "end", number 0xcf
End 0xcf
# evdev 108 (0x6c), QKeyCode "down", number 0xd0
Down 0xd0
# evdev 109 (0x6d), QKeyCode "pgdn", number 0xd1
Next 0xd1
# evdev 110 (0x6e), QKeyCode "insert", number 0xd2
Insert 0xd2
# evdev 111 (0x6f), QKeyCode "delete", number 0xd3
Delete 0xd3
# evdev 112 (0x70): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 113 (0x71), QKeyCode "audiomute", number 0xa0
XF86AudioMute 0xa0
# evdev 114 (0x72), QKeyCode "volumedown", number 0xae
XF86AudioLowerVolume 0xae
# evdev 115 (0x73), QKeyCode "volumeup", number 0xb0
XF86AudioRaiseVolume 0xb0
# evdev 116 (0x74), QKeyCode "power", number 0xde
XF86PowerOff 0xde
# evdev 117 (0x75), QKeyCode "kp_equals", number 0x59
KP_Equal 0x59
# evdev 118 (0x76): no evdev -> QKeyCode mapping (xkb keysym plusminus)
# evdev 119 (0x77), QKeyCode "pause", number 0xc6
Pause 0xc6
# evdev 120 (0x78): no evdev -> QKeyCode mapping (xkb keysym XF86LaunchA)
# evdev 121 (0x79), QKeyCode "kp_comma", number 0x7e
KP_Decimal 0x7e
# evdev 122 (0x7a): no evdev -> QKeyCode mapping (xkb keysym Hangul)
# evdev 123 (0x7b): no evdev -> QKeyCode mapping (xkb keysym Hangul_Hanja)
# evdev 124 (0x7c), QKeyCode "yen", number 0x7d
backslash 0x7d
bar 0x7d shift
# evdev 125 (0x7d), QKeyCode "meta_l", number 0xdb
Super_L 0xdb
# evdev 126 (0x7e), QKeyCode "meta_r", number 0xdc
Super_R 0xdc
# evdev 127 (0x7f), QKeyCode "compose", number 0xdd
Menu 0xdd
# evdev 128 (0x80), QKeyCode "stop", number 0xe8
Cancel 0xe8
# evdev 129 (0x81), QKeyCode "again", number 0x85
Redo 0x85
# evdev 130 (0x82), QKeyCode "props", number 0x86
SunProps 0x86
# evdev 131 (0x83), QKeyCode "undo", number 0x87
Undo 0x87
# evdev 132 (0x84), QKeyCode "front", number 0x8c
SunFront 0x8c
# evdev 133 (0x85), QKeyCode "copy", number 0xf8
XF86Copy 0xf8
# evdev 134 (0x86), QKeyCode "open", number 0x64
XF86Open 0x64
# evdev 135 (0x87), QKeyCode "paste", number 0x65
XF86Paste 0x65
# evdev 136 (0x88), QKeyCode "find", number 0xc1
Find 0xc1
# evdev 137 (0x89), QKeyCode "cut", number 0xbc
XF86Cut 0xbc
# evdev 138 (0x8a), QKeyCode "help", number 0xf5
Help 0xf5
# evdev 139 (0x8b), QKeyCode "menu", number 0x9e
XF86MenuKB 0x9e
# evdev 140 (0x8c), QKeyCode "calculator", number 0xa1
XF86Calculator 0xa1
# evdev 141 (0x8d): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 142 (0x8e), QKeyCode "sleep", number 0xdf
XF86Sleep 0xdf
# evdev 143 (0x8f), QKeyCode "wake", number 0xe3
XF86WakeUp 0xe3
# evdev 144 (0x90): no evdev -> QKeyCode mapping (xkb keysym XF86Explorer)
# evdev 145 (0x91): no evdev -> QKeyCode mapping (xkb keysym XF86Send)
# evdev 146 (0x92): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 147 (0x93): no evdev -> QKeyCode mapping (xkb keysym XF86Xfer)
# evdev 148 (0x94): no evdev -> QKeyCode mapping (xkb keysym XF86Launch1)
# evdev 149 (0x95): no evdev -> QKeyCode mapping (xkb keysym XF86Launch2)
# evdev 150 (0x96): no evdev -> QKeyCode mapping (xkb keysym XF86WWW)
# evdev 151 (0x97): no evdev -> QKeyCode mapping (xkb keysym XF86DOS)
# evdev 152 (0x98): no evdev -> QKeyCode mapping (xkb keysym XF86ScreenSaver)
# evdev 153 (0x99): no evdev -> QKeyCode mapping (xkb keysym XF86RotateWindows)
# evdev 154 (0x9a): no evdev -> QKeyCode mapping (xkb keysym XF86TaskPane)
# evdev 155 (0x9b), QKeyCode "mail", number 0xec
XF86Mail 0xec
# evdev 156 (0x9c), QKeyCode "ac_bookmarks", number 0xe6
XF86Favorites 0xe6
# evdev 157 (0x9d), QKeyCode "computer", number 0xeb
XF86MyComputer 0xeb
# evdev 158 (0x9e), QKeyCode "ac_back", number 0xea
XF86Back 0xea
# evdev 159 (0x9f), QKeyCode "ac_forward", number 0xe9
XF86Forward 0xe9
# evdev 160 (0xa0): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 161 (0xa1): no evdev -> QKeyCode mapping (xkb keysym XF86Eject)
# evdev 162 (0xa2): no evdev -> QKeyCode mapping (xkb keysym XF86Eject)
# evdev 163 (0xa3), QKeyCode "audionext", number 0x99
XF86AudioNext 0x99
# evdev 164 (0xa4), QKeyCode "audioplay", number 0xa2
XF86AudioPlay 0xa2
XF86AudioPause 0xa2 shift
# evdev 165 (0xa5), QKeyCode "audioprev", number 0x90
XF86AudioPrev 0x90
# evdev 166 (0xa6), QKeyCode "audiostop", number 0xa4
XF86AudioStop 0xa4
XF86Eject 0xa4 shift
# evdev 167 (0xa7): no evdev -> QKeyCode mapping (xkb keysym XF86AudioRecord)
# evdev 168 (0xa8): no evdev -> QKeyCode mapping (xkb keysym XF86AudioRewind)
# evdev 169 (0xa9): no evdev -> QKeyCode mapping (xkb keysym XF86Phone)
# evdev 170 (0xaa): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 171 (0xab): no evdev -> QKeyCode mapping (xkb keysym XF86Tools)
# evdev 172 (0xac), QKeyCode "ac_home", number 0xb2
XF86HomePage 0xb2
# evdev 173 (0xad), QKeyCode "ac_refresh", number 0xe7
XF86Reload 0xe7
# evdev 174 (0xae): no evdev -> QKeyCode mapping (xkb keysym XF86Close)
# evdev 175 (0xaf): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 176 (0xb0): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 177 (0xb1): no evdev -> QKeyCode mapping (xkb keysym XF86ScrollUp)
# evdev 178 (0xb2): no evdev -> QKeyCode mapping (xkb keysym XF86ScrollDown)
# evdev 179 (0xb3): no evdev -> QKeyCode mapping (xkb keysym parenleft)
# evdev 180 (0xb4): no evdev -> QKeyCode mapping (xkb keysym parenright)
# evdev 181 (0xb5): no evdev -> QKeyCode mapping (xkb keysym XF86New)
# evdev 182 (0xb6): no evdev -> QKeyCode mapping (xkb keysym Redo)
# evdev 183 (0xb7): no evdev -> QKeyCode mapping (xkb keysym XF86Tools)
# evdev 184 (0xb8): no evdev -> QKeyCode mapping (xkb keysym XF86Launch5)
# evdev 185 (0xb9): no evdev -> QKeyCode mapping (xkb keysym XF86Launch6)
# evdev 186 (0xba): no evdev -> QKeyCode mapping (xkb keysym XF86Launch7)
# evdev 187 (0xbb): no evdev -> QKeyCode mapping (xkb keysym XF86Launch8)
# evdev 188 (0xbc): no evdev -> QKeyCode mapping (xkb keysym XF86Launch9)
# evdev 189 (0xbd): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 190 (0xbe): no evdev -> QKeyCode mapping (xkb keysym XF86AudioMicMute)
# evdev 191 (0xbf): no evdev -> QKeyCode mapping (xkb keysym XF86TouchpadToggle)
# evdev 192 (0xc0): no evdev -> QKeyCode mapping (xkb keysym XF86TouchpadOn)
# evdev 193 (0xc1): no evdev -> QKeyCode mapping (xkb keysym XF86TouchpadOff)
# evdev 194 (0xc2): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 195 (0xc3): no evdev -> QKeyCode mapping (xkb keysym Mode_switch)
# evdev 196 (0xc4): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 197 (0xc5): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 198 (0xc6): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 199 (0xc7): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 200 (0xc8): no evdev -> QKeyCode mapping (xkb keysym XF86AudioPlay)
# evdev 201 (0xc9): no evdev -> QKeyCode mapping (xkb keysym XF86AudioPause)
# evdev 202 (0xca): no evdev -> QKeyCode mapping (xkb keysym XF86Launch3)
# evdev 203 (0xcb): no evdev -> QKeyCode mapping (xkb keysym XF86Launch4)
# evdev 204 (0xcc): no evdev -> QKeyCode mapping (xkb keysym XF86LaunchB)
# evdev 205 (0xcd): no evdev -> QKeyCode mapping (xkb keysym XF86Suspend)
# evdev 206 (0xce): no evdev -> QKeyCode mapping (xkb keysym XF86Close)
# evdev 207 (0xcf): no evdev -> QKeyCode mapping (xkb keysym XF86AudioPlay)
# evdev 208 (0xd0): no evdev -> QKeyCode mapping (xkb keysym XF86AudioForward)
# evdev 209 (0xd1): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 210 (0xd2): no evdev -> QKeyCode mapping (xkb keysym Print)
# evdev 211 (0xd3): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 212 (0xd4): no evdev -> QKeyCode mapping (xkb keysym XF86WebCam)
# evdev 213 (0xd5): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 214 (0xd6): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 215 (0xd7): no evdev -> QKeyCode mapping (xkb keysym XF86Mail)
# evdev 216 (0xd8): no evdev -> QKeyCode mapping (xkb keysym XF86Messenger)
# evdev 217 (0xd9): no evdev -> QKeyCode mapping (xkb keysym XF86Search)
# evdev 218 (0xda): no evdev -> QKeyCode mapping (xkb keysym XF86Go)
# evdev 219 (0xdb): no evdev -> QKeyCode mapping (xkb keysym XF86Finance)
# evdev 220 (0xdc): no evdev -> QKeyCode mapping (xkb keysym XF86Game)
# evdev 221 (0xdd): no evdev -> QKeyCode mapping (xkb keysym XF86Shop)
# evdev 222 (0xde): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 223 (0xdf): no evdev -> QKeyCode mapping (xkb keysym Cancel)
# evdev 224 (0xe0): no evdev -> QKeyCode mapping (xkb keysym XF86MonBrightnessDown)
# evdev 225 (0xe1): no evdev -> QKeyCode mapping (xkb keysym XF86MonBrightnessUp)
# evdev 226 (0xe2), QKeyCode "mediaselect", number 0xed
XF86AudioMedia 0xed
# evdev 227 (0xe3): no evdev -> QKeyCode mapping (xkb keysym XF86Display)
# evdev 228 (0xe4): no evdev -> QKeyCode mapping (xkb keysym XF86KbdLightOnOff)
# evdev 229 (0xe5): no evdev -> QKeyCode mapping (xkb keysym XF86KbdBrightnessDown)
# evdev 230 (0xe6): no evdev -> QKeyCode mapping (xkb keysym XF86KbdBrightnessUp)
# evdev 231 (0xe7): no evdev -> QKeyCode mapping (xkb keysym XF86Send)
# evdev 232 (0xe8): no evdev -> QKeyCode mapping (xkb keysym XF86Reply)
# evdev 233 (0xe9): no evdev -> QKeyCode mapping (xkb keysym XF86MailForward)
# evdev 234 (0xea): no evdev -> QKeyCode mapping (xkb keysym XF86Save)
# evdev 235 (0xeb): no evdev -> QKeyCode mapping (xkb keysym XF86Documents)
# evdev 236 (0xec): no evdev -> QKeyCode mapping (xkb keysym XF86Battery)
# evdev 237 (0xed): no evdev -> QKeyCode mapping (xkb keysym XF86Bluetooth)
# evdev 238 (0xee): no evdev -> QKeyCode mapping (xkb keysym XF86WLAN)
# evdev 239 (0xef): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 240 (0xf0): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 241 (0xf1): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 242 (0xf2): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 243 (0xf3): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 244 (0xf4): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 245 (0xf5): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 246 (0xf6): no evdev -> QKeyCode mapping (xkb keysym XF86WWAN)
# evdev 247 (0xf7): no evdev -> QKeyCode mapping (xkb keysym XF86RFKill)
# evdev 248 (0xf8): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 249 (0xf9): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 250 (0xfa): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 251 (0xfb): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 252 (0xfc): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 253 (0xfd): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 254 (0xfe): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 255 (0xff): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 256 (0x100): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 257 (0x101): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 258 (0x102): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 259 (0x103): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 260 (0x104): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 261 (0x105): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 262 (0x106): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 263 (0x107): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 264 (0x108): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 265 (0x109): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 266 (0x10a): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 267 (0x10b): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 268 (0x10c): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 269 (0x10d): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 270 (0x10e): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 271 (0x10f): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 272 (0x110): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 273 (0x111): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 274 (0x112): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 275 (0x113): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 276 (0x114): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 277 (0x115): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 278 (0x116): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 279 (0x117): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 280 (0x118): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 281 (0x119): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 282 (0x11a): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 283 (0x11b): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 284 (0x11c): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 285 (0x11d): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 286 (0x11e): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 287 (0x11f): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 288 (0x120): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 289 (0x121): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 290 (0x122): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 291 (0x123): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 292 (0x124): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 293 (0x125): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 294 (0x126): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 295 (0x127): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 296 (0x128): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 297 (0x129): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 298 (0x12a): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 299 (0x12b): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 300 (0x12c): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 301 (0x12d): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 302 (0x12e): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 303 (0x12f): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 304 (0x130): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 305 (0x131): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 306 (0x132): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 307 (0x133): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 308 (0x134): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 309 (0x135): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 310 (0x136): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 311 (0x137): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 312 (0x138): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 313 (0x139): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 314 (0x13a): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 315 (0x13b): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 316 (0x13c): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 317 (0x13d): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 318 (0x13e): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 319 (0x13f): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 320 (0x140): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 321 (0x141): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 322 (0x142): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 323 (0x143): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 324 (0x144): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 325 (0x145): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 326 (0x146): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 327 (0x147): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 328 (0x148): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 329 (0x149): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 330 (0x14a): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 331 (0x14b): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 332 (0x14c): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 333 (0x14d): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 334 (0x14e): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 335 (0x14f): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 336 (0x150): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 337 (0x151): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 338 (0x152): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 339 (0x153): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 340 (0x154): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 341 (0x155): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 342 (0x156): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 343 (0x157): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 344 (0x158): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 345 (0x159): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 346 (0x15a): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 347 (0x15b): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 348 (0x15c): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 349 (0x15d): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 350 (0x15e): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 351 (0x15f): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 352 (0x160): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 353 (0x161): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 354 (0x162): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 355 (0x163): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 356 (0x164): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 357 (0x165): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 358 (0x166): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 359 (0x167): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 360 (0x168): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 361 (0x169): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 362 (0x16a): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 363 (0x16b): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 364 (0x16c): no evdev -> QKeyCode mapping (xkb keysym XF86Favorites)
# evdev 365 (0x16d): no evdev -> QKeyCode mapping (xkb keysym NoSymbol)
# evdev 366 (0x16e): no evdev -> QKeyCode mapping (xkb keysym XF86Keyboard)
#
# quirks section start
#
# Sometimes multiple keysyms map to the same keycodes.
# The keycode -> keysym lookup finds only one of the
# keysyms. So append them here.
#
Print 0x54
Sys_Req 0x54
Execute 0x54
KP_Decimal 0x53 numlock
KP_Separator 0x53 numlock
Alt_R 0xb8
ISO_Level3_Shift 0xb8
Mode_switch 0xb8
# quirks section end

View File

@ -0,0 +1,102 @@
/* This file is auto-generated by generate-language-keymaps.py
* command : ./generate-language-keymaps.py keymap-ja
* layout : jp
*/
export default {
"32" : "57",
"33" : "2 shift",
"34" : "3 shift",
"35" : "4 shift",
"36" : "5 shift",
"37" : "6 shift",
"38" : "7 shift",
"39" : "8 shift",
"40" : "9 shift",
"41" : "10 shift",
"42" : "40 shift",
"43" : "39 shift",
"44" : "51",
"45" : "12",
"46" : "52",
"47" : "53",
"48" : "11",
"49" : "2",
"50" : "3",
"51" : "4",
"52" : "5",
"53" : "6",
"54" : "7",
"55" : "8",
"56" : "9",
"57" : "10",
"58" : "40",
"59" : "39",
"60" : "51 shift",
"61" : "12 shift",
"62" : "52 shift",
"63" : "53 shift",
"64" : "26",
"65" : "30 shift",
"66" : "48 shift",
"67" : "46 shift",
"68" : "32 shift",
"69" : "18 shift",
"70" : "33 shift",
"71" : "34 shift",
"72" : "35 shift",
"73" : "23 shift",
"74" : "36 shift",
"75" : "37 shift",
"76" : "38 shift",
"77" : "50 shift",
"78" : "49 shift",
"79" : "24 shift",
"80" : "25 shift",
"81" : "16 shift",
"82" : "19 shift",
"83" : "31 shift",
"84" : "20 shift",
"85" : "22 shift",
"86" : "47 shift",
"87" : "17 shift",
"88" : "45 shift",
"89" : "21 shift",
"90" : "44 shift",
"91" : "27",
"92" : "115",
"93" : "43",
"94" : "13",
"95" : "115 shift",
"96" : "26 shift",
"97" : "30",
"98" : "48",
"99" : "46",
"100" : "32",
"101" : "18",
"102" : "33",
"103" : "34",
"104" : "35",
"105" : "23",
"106" : "36",
"107" : "37",
"108" : "38",
"109" : "50",
"110" : "49",
"111" : "24",
"112" : "25",
"113" : "16",
"114" : "19",
"115" : "31",
"116" : "20",
"117" : "22",
"118" : "47",
"119" : "17",
"120" : "45",
"121" : "21",
"122" : "44",
"123" : "27 shift",
"124" : "125 shift",
"125" : "43 shift",
"126" : "11 shift",
"166" : "86 shift altgr",
}

View File

@ -92,6 +92,9 @@ class TestKubernetesCluster(cloudstackTestCase):
cls.vpcAllowAllAclDetailsMap = {} cls.vpcAllowAllAclDetailsMap = {}
cls.initial_configuration_cks_enabled = None cls.initial_configuration_cks_enabled = None
cls.k8s_version_from = cls.services["cks_kubernetes_version_upgrade_from"]
cls.k8s_version_to = cls.services["cks_kubernetes_version_upgrade_to"]
if cls.hypervisorNotSupported == False: if cls.hypervisorNotSupported == False:
cls.endpoint_url = Configurations.list(cls.apiclient, name="endpoint.url")[0].value cls.endpoint_url = Configurations.list(cls.apiclient, name="endpoint.url")[0].value
if "localhost" in cls.endpoint_url: if "localhost" in cls.endpoint_url:
@ -110,20 +113,20 @@ class TestKubernetesCluster(cloudstackTestCase):
if cls.setup_failed == False: if cls.setup_failed == False:
try: try:
cls.kubernetes_version_1_23_3 = cls.addKubernetesSupportedVersion(cls.services["cks_kubernetes_versions"]["1.23.3"]) cls.kubernetes_version_v1 = cls.addKubernetesSupportedVersion(cls.services["cks_kubernetes_versions"][cls.k8s_version_from])
cls.kubernetes_version_ids.append(cls.kubernetes_version_1_23_3.id) cls.kubernetes_version_ids.append(cls.kubernetes_version_v1.id)
except Exception as e: except Exception as e:
cls.setup_failed = True cls.setup_failed = True
cls.debug("Failed to get Kubernetes version ISO in ready state, version=%s, url=%s, %s" % cls.debug("Failed to get Kubernetes version ISO in ready state, version=%s, url=%s, %s" %
(cls.services["cks_kubernetes_versions"]["1.23.3"]["semanticversion"], cls.services["cks_kubernetes_versions"]["1.23.3"]["url"], e)) (cls.services["cks_kubernetes_versions"][cls.k8s_version_from]["semanticversion"], cls.services["cks_kubernetes_versions"][cls.k8s_version_from]["url"], e))
if cls.setup_failed == False: if cls.setup_failed == False:
try: try:
cls.kubernetes_version_1_24_0 = cls.addKubernetesSupportedVersion(cls.services["cks_kubernetes_versions"]["1.24.0"]) cls.kubernetes_version_v2 = cls.addKubernetesSupportedVersion(cls.services["cks_kubernetes_versions"][cls.k8s_version_to])
cls.kubernetes_version_ids.append(cls.kubernetes_version_1_24_0.id) cls.kubernetes_version_ids.append(cls.kubernetes_version_v2.id)
except Exception as e: except Exception as e:
cls.setup_failed = True cls.setup_failed = True
cls.debug("Failed to get Kubernetes version ISO in ready state, version=%s, url=%s, %s" % cls.debug("Failed to get Kubernetes version ISO in ready state, version=%s, url=%s, %s" %
(cls.services["cks_kubernetes_versions"]["1.24.0"]["semanticversion"], cls.services["cks_kubernetes_versions"]["1.24.0"]["url"], e)) (cls.services["cks_kubernetes_versions"][cls.k8s_version_to]["semanticversion"], cls.services["cks_kubernetes_versions"][cls.k8s_version_to]["url"], e))
if cls.setup_failed == False: if cls.setup_failed == False:
cks_offering_data = cls.services["cks_service_offering"] cks_offering_data = cls.services["cks_service_offering"]
@ -371,20 +374,20 @@ class TestKubernetesCluster(cloudstackTestCase):
if self.setup_failed == True: if self.setup_failed == True:
self.fail("Setup incomplete") self.fail("Setup incomplete")
global k8s_cluster global k8s_cluster
k8s_cluster = self.getValidKubernetesCluster(version=self.kubernetes_version_1_24_0) k8s_cluster = self.getValidKubernetesCluster(version=self.kubernetes_version_v2)
self.debug("Downgrading Kubernetes cluster with ID: %s to a lower version. This should fail!" % k8s_cluster.id) self.debug("Downgrading Kubernetes cluster with ID: %s to a lower version. This should fail!" % k8s_cluster.id)
try: try:
k8s_cluster = self.upgradeKubernetesCluster(k8s_cluster.id, self.kubernetes_version_1_23_3.id) k8s_cluster = self.upgradeKubernetesCluster(k8s_cluster.id, self.kubernetes_version_v1.id)
self.debug("Invalid CKS Kubernetes HA cluster deployed with ID: %s. Deleting it and failing test." % self.kubernetes_version_1_23_3.id) self.debug("Invalid CKS Kubernetes HA cluster deployed with ID: %s. Deleting it and failing test." % self.kubernetes_version_v1.id)
self.deleteKubernetesClusterAndVerify(k8s_cluster.id, False, True) self.deleteKubernetesClusterAndVerify(k8s_cluster.id, False, True)
self.fail("Kubernetes cluster downgrade to a lower Kubernetes supported version. Must be an error.") self.fail("Kubernetes cluster downgrade to a lower Kubernetes supported version. Must be an error.")
except Exception as e: except Exception as e:
self.debug("Upgrading Kubernetes cluster with invalid Kubernetes supported version check successful, API failure: %s" % e) self.debug("Upgrading Kubernetes cluster with invalid Kubernetes supported version check successful, API failure: %s" % e)
self.deleteKubernetesClusterAndVerify(k8s_cluster.id, False, True) self.deleteKubernetesClusterAndVerify(k8s_cluster.id, False, True)
self.verifyKubernetesClusterUpgrade(k8s_cluster, self.kubernetes_version_1_24_0.id) self.verifyKubernetesClusterUpgrade(k8s_cluster, self.kubernetes_version_v2.id)
return return
@attr(tags=["advanced", "smoke"], required_hardware="true") @attr(tags=["advanced", "smoke"], required_hardware="true")
@ -398,17 +401,17 @@ class TestKubernetesCluster(cloudstackTestCase):
if self.setup_failed == True: if self.setup_failed == True:
self.fail("Setup incomplete") self.fail("Setup incomplete")
global k8s_cluster global k8s_cluster
k8s_cluster = self.getValidKubernetesCluster(version=self.kubernetes_version_1_23_3) k8s_cluster = self.getValidKubernetesCluster(version=self.kubernetes_version_v1)
time.sleep(self.services["sleep"]) time.sleep(self.services["sleep"])
self.debug("Upgrading Kubernetes cluster with ID: %s" % k8s_cluster.id) self.debug("Upgrading Kubernetes cluster with ID: %s" % k8s_cluster.id)
try: try:
k8s_cluster = self.upgradeKubernetesCluster(k8s_cluster.id, self.kubernetes_version_1_24_0.id) k8s_cluster = self.upgradeKubernetesCluster(k8s_cluster.id, self.kubernetes_version_v2.id)
except Exception as e: except Exception as e:
self.deleteKubernetesClusterAndVerify(k8s_cluster.id, False, True) self.deleteKubernetesClusterAndVerify(k8s_cluster.id, False, True)
self.fail("Failed to upgrade Kubernetes cluster due to: %s" % e) self.fail("Failed to upgrade Kubernetes cluster due to: %s" % e)
self.verifyKubernetesClusterUpgrade(k8s_cluster, self.kubernetes_version_1_24_0.id) self.verifyKubernetesClusterUpgrade(k8s_cluster, self.kubernetes_version_v2.id)
return return
@attr(tags=["advanced", "smoke"], required_hardware="true") @attr(tags=["advanced", "smoke"], required_hardware="true")
@ -456,7 +459,7 @@ class TestKubernetesCluster(cloudstackTestCase):
if self.setup_failed == True: if self.setup_failed == True:
self.fail("Setup incomplete") self.fail("Setup incomplete")
global k8s_cluster global k8s_cluster
k8s_cluster = self.getValidKubernetesCluster(version=self.kubernetes_version_1_24_0) k8s_cluster = self.getValidKubernetesCluster(version=self.kubernetes_version_v2)
self.debug("Autoscaling Kubernetes cluster with ID: %s" % k8s_cluster.id) self.debug("Autoscaling Kubernetes cluster with ID: %s" % k8s_cluster.id)
try: try:
@ -556,17 +559,17 @@ class TestKubernetesCluster(cloudstackTestCase):
if self.default_network: if self.default_network:
self.skipTest("HA cluster on shared network requires external ip address, skipping it") self.skipTest("HA cluster on shared network requires external ip address, skipping it")
global k8s_cluster global k8s_cluster
k8s_cluster = self.getValidKubernetesCluster(1, 2, version=self.kubernetes_version_1_23_3) k8s_cluster = self.getValidKubernetesCluster(1, 2, version=self.kubernetes_version_v1)
time.sleep(self.services["sleep"]) time.sleep(self.services["sleep"])
self.debug("Upgrading HA Kubernetes cluster with ID: %s" % k8s_cluster.id) self.debug("Upgrading HA Kubernetes cluster with ID: %s" % k8s_cluster.id)
try: try:
k8s_cluster = self.upgradeKubernetesCluster(k8s_cluster.id, self.kubernetes_version_1_24_0.id) k8s_cluster = self.upgradeKubernetesCluster(k8s_cluster.id, self.kubernetes_version_v2.id)
except Exception as e: except Exception as e:
self.deleteKubernetesClusterAndVerify(k8s_cluster.id, False, True) self.deleteKubernetesClusterAndVerify(k8s_cluster.id, False, True)
self.fail("Failed to upgrade Kubernetes HA cluster due to: %s" % e) self.fail("Failed to upgrade Kubernetes HA cluster due to: %s" % e)
self.verifyKubernetesClusterUpgrade(k8s_cluster, self.kubernetes_version_1_24_0.id) self.verifyKubernetesClusterUpgrade(k8s_cluster, self.kubernetes_version_v2.id)
self.debug("Kubernetes cluster with ID: %s successfully upgraded" % k8s_cluster.id) self.debug("Kubernetes cluster with ID: %s successfully upgraded" % k8s_cluster.id)
return return
@ -772,7 +775,7 @@ class TestKubernetesCluster(cloudstackTestCase):
# Does a cluster already exist ? # Does a cluster already exist ?
if cluster == None or cluster.id == None: if cluster == None or cluster.id == None:
if not version: if not version:
version = self.kubernetes_version_1_24_0 version = self.kubernetes_version_v2
self.debug("No existing cluster available, k8s_cluster: %s" % cluster) self.debug("No existing cluster available, k8s_cluster: %s" % cluster)
return self.createNewKubernetesCluster(version, size, control_nodes) return self.createNewKubernetesCluster(version, size, control_nodes)
@ -782,7 +785,7 @@ class TestKubernetesCluster(cloudstackTestCase):
# Check the version only if specified # Check the version only if specified
valid = valid and cluster.kubernetesversionid == version.id valid = valid and cluster.kubernetesversionid == version.id
else: else:
version = self.kubernetes_version_1_24_0 version = self.kubernetes_version_v2
if valid: if valid:
cluster_id = cluster.id cluster_id = cluster.id

View File

@ -45,7 +45,8 @@ class TestKubernetesSupportedVersion(cloudstackTestCase):
cls.services = cls.testClient.getParsedTestDataConfig() cls.services = cls.testClient.getParsedTestDataConfig()
cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests()) cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests())
cls.mgtSvrDetails = cls.config.__dict__["mgtSvr"][0].__dict__ cls.mgtSvrDetails = cls.config.__dict__["mgtSvr"][0].__dict__
cls.kubernetes_version_iso_url = 'http://download.cloudstack.org/cks/setup-1.24.0.iso' cls.kubernetes_version = cls.services["cks_kubernetes_version"]
cls.kubernetes_version_iso_url = cls.services["cks_kubernetes_versions"][cls.kubernetes_version]["url"]
cls.initial_configuration_cks_enabled = Configurations.list(cls.apiclient, cls.initial_configuration_cks_enabled = Configurations.list(cls.apiclient,
name="cloud.kubernetes.service.enabled")[0].value name="cloud.kubernetes.service.enabled")[0].value

View File

@ -2248,8 +2248,23 @@ test_data = {
"url": "http://download.cloudstack.org/cks/setup-1.24.0.iso", "url": "http://download.cloudstack.org/cks/setup-1.24.0.iso",
"mincpunumber": 2, "mincpunumber": 2,
"minmemory": 2048 "minmemory": 2048
},
"1.25.0": {
"semanticversion": "1.25.0",
"url": "http://download.cloudstack.org/cks/setup-1.25.0.iso",
"mincpunumber": 2,
"minmemory": 2048
},
"1.26.0": {
"semanticversion": "1.26.0",
"url": "http://download.cloudstack.org/cks/setup-1.26.0.iso",
"mincpunumber": 2,
"minmemory": 2048
} }
}, },
"cks_kubernetes_version": "1.26.0",
"cks_kubernetes_version_upgrade_from": "1.25.0",
"cks_kubernetes_version_upgrade_to": "1.26.0",
"cks_service_offering": { "cks_service_offering": {
"name": "CKS-Instance", "name": "CKS-Instance",
"displaytext": "CKS Instance", "displaytext": "CKS Instance",