mirror of https://github.com/apache/cloudstack.git
Merge remote-tracking branch 'apache/4.22'
This commit is contained in:
commit
25cb545325
|
|
@ -331,7 +331,7 @@ public class ConsoleProxyResource extends ServerResourceBase implements ServerRe
|
|||
final Object resource = this;
|
||||
logger.info("Building class loader for com.cloud.consoleproxy.ConsoleProxy");
|
||||
if (consoleProxyMain == null) {
|
||||
logger.info("Running com.cloud.consoleproxy.ConsoleProxy with encryptor password={}", encryptorPassword);
|
||||
logger.info("Running com.cloud.consoleproxy.ConsoleProxy");
|
||||
consoleProxyMain = new Thread(new ManagedContextRunnable() {
|
||||
@Override
|
||||
protected void runInContext() {
|
||||
|
|
|
|||
|
|
@ -47,10 +47,12 @@ import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo;
|
|||
import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope;
|
||||
import org.apache.cloudstack.framework.async.AsyncCompletionCallback;
|
||||
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
|
||||
import org.apache.cloudstack.secstorage.heuristics.HeuristicType;
|
||||
import org.apache.cloudstack.storage.RemoteHostEndPoint;
|
||||
import org.apache.cloudstack.storage.command.CopyCommand;
|
||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
|
||||
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
|
||||
import org.apache.cloudstack.storage.heuristics.HeuristicRuleHelper;
|
||||
import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity;
|
||||
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
|
@ -112,6 +114,9 @@ public class AncientDataMotionStrategy implements DataMotionStrategy {
|
|||
@Inject
|
||||
SnapshotDao snapshotDao;
|
||||
|
||||
@Inject
|
||||
HeuristicRuleHelper heuristicRuleHelper;
|
||||
|
||||
@Override
|
||||
public StrategyPriority canHandle(DataObject srcData, DataObject destData) {
|
||||
return StrategyPriority.DEFAULT;
|
||||
|
|
@ -379,7 +384,13 @@ public class AncientDataMotionStrategy implements DataMotionStrategy {
|
|||
}
|
||||
// need to find a nfs or cifs image store, assuming that can't copy volume
|
||||
// directly to s3
|
||||
ImageStoreEntity imageStore = (ImageStoreEntity)dataStoreMgr.getImageStoreWithFreeCapacity(destScope.getScopeId());
|
||||
Long zoneId = destScope.getScopeId();
|
||||
ImageStoreEntity imageStore = (ImageStoreEntity) heuristicRuleHelper.getImageStoreIfThereIsHeuristicRule(zoneId, HeuristicType.VOLUME, destData);
|
||||
if (imageStore == null) {
|
||||
logger.debug("Secondary storage selector did not direct volume migration to a specific secondary storage; using secondary storage with the most free capacity.");
|
||||
imageStore = (ImageStoreEntity) dataStoreMgr.getImageStoreWithFreeCapacity(zoneId);
|
||||
}
|
||||
|
||||
if (imageStore == null || !imageStore.getProtocol().equalsIgnoreCase("nfs") && !imageStore.getProtocol().equalsIgnoreCase("cifs")) {
|
||||
String errMsg = "can't find a nfs (or cifs) image store to satisfy the need for a staging store";
|
||||
Answer answer = new Answer(null, false, errMsg);
|
||||
|
|
|
|||
|
|
@ -46,10 +46,10 @@ public class BaremetalDnsmasqResource extends BaremetalDhcpResourceBase {
|
|||
com.trilead.ssh2.Connection sshConnection = null;
|
||||
try {
|
||||
super.configure(name, params);
|
||||
logger.debug(String.format("Trying to connect to DHCP server(IP=%1$s, username=%2$s, password=%3$s)", _ip, _username, _password));
|
||||
logger.debug(String.format("Trying to connect to DHCP server(IP=%1$s, username=%2$s", _ip, _username));
|
||||
sshConnection = SSHCmdHelper.acquireAuthorizedConnection(_ip, _username, _password);
|
||||
if (sshConnection == null) {
|
||||
throw new ConfigurationException(String.format("Cannot connect to DHCP server(IP=%1$s, username=%2$s, password=%3$s", _ip, _username, _password));
|
||||
throw new ConfigurationException(String.format("Cannot connect to DHCP server(IP=%1$s, username=%2$s", _ip, _username));
|
||||
}
|
||||
|
||||
if (!SSHCmdHelper.sshExecuteCmd(sshConnection, "[ -f '/usr/sbin/dnsmasq' ]")) {
|
||||
|
|
|
|||
|
|
@ -130,8 +130,8 @@ public class BaremetalKickStartPxeResource extends BaremetalPxeResourceBase {
|
|||
|
||||
sshConnection.connect(null, 60000, 60000);
|
||||
if (!sshConnection.authenticateWithPassword(_username, _password)) {
|
||||
logger.debug("SSH Failed to authenticate");
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s, password=%3$s", _ip, _username, _password));
|
||||
logger.debug("SSH Failed to authenticate with user {} credentials", _username);
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s", _ip, _username));
|
||||
}
|
||||
|
||||
String script = String.format("python /usr/bin/baremetal_user_data.py '%s'", arg);
|
||||
|
|
@ -167,7 +167,7 @@ public class BaremetalKickStartPxeResource extends BaremetalPxeResourceBase {
|
|||
sshConnection.connect(null, 60000, 60000);
|
||||
if (!sshConnection.authenticateWithPassword(_username, _password)) {
|
||||
logger.debug("SSH Failed to authenticate");
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s, password=%3$s", _ip, _username, _password));
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s", _ip, _username));
|
||||
}
|
||||
|
||||
String copyTo = String.format("%s/%s", _tftpDir, cmd.getTemplateUuid());
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ public class BaremetalPingPxeResource extends BaremetalPxeResourceBase {
|
|||
sshConnection.connect(null, 60000, 60000);
|
||||
if (!sshConnection.authenticateWithPassword(_username, _password)) {
|
||||
logger.debug("SSH Failed to authenticate");
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s, password=%3$s", _ip, _username, "******"));
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s, password=******", _ip, _username));
|
||||
}
|
||||
|
||||
String cmd = String.format("[ -f /%1$s/pxelinux.0 ] && [ -f /%2$s/kernel ] && [ -f /%3$s/initrd.gz ] ", _tftpDir, _tftpDir, _tftpDir);
|
||||
|
|
@ -150,8 +150,8 @@ public class BaremetalPingPxeResource extends BaremetalPxeResourceBase {
|
|||
try {
|
||||
sshConnection.connect(null, 60000, 60000);
|
||||
if (!sshConnection.authenticateWithPassword(_username, _password)) {
|
||||
logger.debug("SSH Failed to authenticate");
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s, password=%3$s", _ip, _username, _password));
|
||||
logger.debug("SSH Failed to authenticate with user {} credentials", _username);
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s", _ip, _username));
|
||||
}
|
||||
|
||||
String script =
|
||||
|
|
@ -179,7 +179,7 @@ public class BaremetalPingPxeResource extends BaremetalPxeResourceBase {
|
|||
sshConnection.connect(null, 60000, 60000);
|
||||
if (!sshConnection.authenticateWithPassword(_username, _password)) {
|
||||
logger.debug("SSH Failed to authenticate");
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s, password=%3$s", _ip, _username, _password));
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s", _ip, _username));
|
||||
}
|
||||
|
||||
String script =
|
||||
|
|
@ -237,7 +237,7 @@ public class BaremetalPingPxeResource extends BaremetalPxeResourceBase {
|
|||
sshConnection.connect(null, 60000, 60000);
|
||||
if (!sshConnection.authenticateWithPassword(_username, _password)) {
|
||||
logger.debug("SSH Failed to authenticate");
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s, password=%3$s", _ip, _username, _password));
|
||||
throw new ConfigurationException(String.format("Cannot connect to PING PXE server(IP=%1$s, username=%2$s", _ip, _username));
|
||||
}
|
||||
|
||||
String script = String.format("python /usr/bin/baremetal_user_data.py '%s'", arg);
|
||||
|
|
|
|||
|
|
@ -477,7 +477,7 @@ public class KubernetesClusterManagerImpl extends ManagerBase implements Kuberne
|
|||
logger.warn("Network offering: {} does not have necessary services to provision Kubernetes cluster", networkOffering);
|
||||
return false;
|
||||
}
|
||||
if (!networkOffering.isEgressDefaultPolicy()) {
|
||||
if (!networkOffering.isForVpc() && !networkOffering.isEgressDefaultPolicy()) {
|
||||
logger.warn("Network offering: {} has egress default policy turned off should be on to provision Kubernetes cluster", networkOffering);
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5427,6 +5427,7 @@ public class QueryManagerImpl extends MutualExclusiveIdsManagerBase implements Q
|
|||
options.put(VmDetailConstants.VIRTUAL_TPM_VERSION, Arrays.asList("1.2", "2.0"));
|
||||
options.put(VmDetailConstants.GUEST_CPU_MODE, Arrays.asList("custom", "host-model", "host-passthrough"));
|
||||
options.put(VmDetailConstants.GUEST_CPU_MODEL, Collections.emptyList());
|
||||
options.put(VmDetailConstants.KVM_GUEST_OS_MACHINE_TYPE, Collections.emptyList());
|
||||
options.put(VmDetailConstants.KVM_SKIP_FORCE_DISK_CONTROLLER, Arrays.asList("true", "false"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -550,7 +550,15 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
|
|||
|
||||
@Override
|
||||
public boolean reorderAclRules(Vpc vpc, List<? extends Network> networks, List<? extends NetworkACLItem> networkACLItems) {
|
||||
return true;
|
||||
boolean result = true;
|
||||
try {
|
||||
for (Network network : networks) {
|
||||
result = result && applyNetworkACLs(network, networkACLItems);
|
||||
}
|
||||
} catch (ResourceUnavailableException ex) {
|
||||
result = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -109,6 +109,8 @@ public class NetworkACLServiceImpl extends ManagerBase implements NetworkACLServ
|
|||
private NsxProviderDao nsxProviderDao;
|
||||
@Inject
|
||||
private NetrisProviderDao netrisProviderDao;
|
||||
@Inject
|
||||
private VpcManager vpcManager;
|
||||
|
||||
private String supportedProtocolsForAclRules = "tcp,udp,icmp,all";
|
||||
|
||||
|
|
@ -1037,13 +1039,20 @@ public class NetworkACLServiceImpl extends ManagerBase implements NetworkACLServ
|
|||
if (Objects.isNull(vpc)) {
|
||||
return networkACLItem;
|
||||
}
|
||||
List<NetworkVO> networks = _networkDao.listByAclId(lockedAcl.getId());
|
||||
if (networks.isEmpty()) {
|
||||
return networkACLItem;
|
||||
}
|
||||
|
||||
final DataCenter dc = _entityMgr.findById(DataCenter.class, vpc.getZoneId());
|
||||
final NsxProviderVO nsxProvider = nsxProviderDao.findByZoneId(dc.getId());
|
||||
final NetrisProviderVO netrisProvider = netrisProviderDao.findByZoneId(dc.getId());
|
||||
List<NetworkVO> networks = _networkDao.listByAclId(lockedAcl.getId());
|
||||
if (ObjectUtils.anyNotNull(nsxProvider, netrisProvider) && !networks.isEmpty()) {
|
||||
boolean isVpcNetworkACLProvider = vpcManager.isProviderSupportServiceInVpc(vpc.getId(), Network.Service.NetworkACL, Network.Provider.VPCVirtualRouter);
|
||||
|
||||
if (ObjectUtils.anyNotNull(nsxProvider, netrisProvider) || isVpcNetworkACLProvider) {
|
||||
allAclRules = getAllAclRulesSortedByNumber(lockedAcl.getId());
|
||||
Network.Provider networkProvider = nsxProvider != null ? Network.Provider.Nsx : Network.Provider.Netris;
|
||||
Network.Provider networkProvider = isVpcNetworkACLProvider ? Network.Provider.VPCVirtualRouter
|
||||
: (nsxProvider != null ? Network.Provider.Nsx : Network.Provider.Netris);
|
||||
_networkAclMgr.reorderAclRules(vpc, networks, allAclRules, networkProvider);
|
||||
}
|
||||
return networkACLItem;
|
||||
|
|
|
|||
|
|
@ -117,8 +117,8 @@ public class HeuristicRuleHelper {
|
|||
accountId = ((SnapshotInfo) obj).getAccountId();
|
||||
break;
|
||||
case VOLUME:
|
||||
presetVariables.setVolume(setVolumePresetVariable((VolumeVO) obj));
|
||||
accountId = ((VolumeVO) obj).getAccountId();
|
||||
presetVariables.setVolume(setVolumePresetVariable((com.cloud.storage.Volume) obj));
|
||||
accountId = ((com.cloud.storage.Volume) obj).getAccountId();
|
||||
break;
|
||||
}
|
||||
presetVariables.setAccount(setAccountPresetVariable(accountId));
|
||||
|
|
@ -191,14 +191,14 @@ public class HeuristicRuleHelper {
|
|||
return template;
|
||||
}
|
||||
|
||||
protected Volume setVolumePresetVariable(VolumeVO volumeVO) {
|
||||
Volume volume = new Volume();
|
||||
protected Volume setVolumePresetVariable(com.cloud.storage.Volume volumeVO) {
|
||||
Volume volumePresetVariable = new Volume();
|
||||
|
||||
volume.setName(volumeVO.getName());
|
||||
volume.setFormat(volumeVO.getFormat());
|
||||
volume.setSize(volumeVO.getSize());
|
||||
volumePresetVariable.setName(volumeVO.getName());
|
||||
volumePresetVariable.setFormat(volumeVO.getFormat());
|
||||
volumePresetVariable.setSize(volumeVO.getSize());
|
||||
|
||||
return volume;
|
||||
return volumePresetVariable;
|
||||
}
|
||||
|
||||
protected Snapshot setSnapshotPresetVariable(SnapshotInfo snapshotInfo) {
|
||||
|
|
|
|||
|
|
@ -210,7 +210,6 @@ public class Client {
|
|||
public void runClient(String[] args) {
|
||||
|
||||
try {
|
||||
|
||||
Protocol protocol = parseOptions(args);
|
||||
if (protocol == Protocol.NONE)
|
||||
return;
|
||||
|
|
@ -299,21 +298,28 @@ public class Client {
|
|||
|
||||
private Protocol parseOptions(String[] args) {
|
||||
String protocolName = (args.length > 0) ? args[0] : "";
|
||||
Protocol protocol = Protocol.NONE;
|
||||
Protocol protocol;
|
||||
|
||||
Option[] options;
|
||||
if (protocolName.equals("vnc")) {
|
||||
protocol = Protocol.VNC;
|
||||
options = join(commonOptions, vncOptions);
|
||||
} else if (protocolName.equals("rdp")) {
|
||||
protocol = Protocol.RDP;
|
||||
options = join(commonOptions, rdpOptions);
|
||||
} else if (protocolName.equals("hyperv")) {
|
||||
protocol = Protocol.HYPERV;
|
||||
options = join(commonOptions, hyperVOptions);
|
||||
} else {
|
||||
help();
|
||||
return Protocol.NONE;
|
||||
try {
|
||||
protocol = Protocol.valueOf(protocolName);
|
||||
} catch (IllegalArgumentException e) {
|
||||
protocol = Protocol.NONE;
|
||||
}
|
||||
|
||||
switch (protocol) {
|
||||
case VNC:
|
||||
options = join(commonOptions, vncOptions);
|
||||
break;
|
||||
case RDP:
|
||||
options = join(commonOptions, rdpOptions);
|
||||
break;
|
||||
case HYPERV:
|
||||
options = join(commonOptions, hyperVOptions);
|
||||
break;
|
||||
default:
|
||||
help();
|
||||
return Protocol.NONE;
|
||||
}
|
||||
|
||||
// Parse all options for given protocol
|
||||
|
|
|
|||
|
|
@ -3751,6 +3751,7 @@
|
|||
"message.resource.not.found": "Resource not found.",
|
||||
"message.restart.mgmt.server": "Please restart your management server(s) for your new settings to take effect.",
|
||||
"message.restart.network": "All services provided by this Network will be interrupted. Please confirm that you want to restart this Network.",
|
||||
"message.restart.usage.server": "Please restart your usage server(s) for your new settings to take effect.",
|
||||
"message.restart.vm.to.update.settings": "Update in fields other than name and display name will require the Instance to be restarted.",
|
||||
"message.restart.vpc": "Please confirm that you want to restart the VPC.",
|
||||
"message.restart.vpc.remark": "Please confirm that you want to restart the VPC <p><i>Remark: making a non-redundant VPC redundant will force a clean up. The Networks will not be available for a couple of minutes</i>.</p>",
|
||||
|
|
|
|||
|
|
@ -1252,15 +1252,7 @@ export default {
|
|||
this.editableValueKey = null
|
||||
this.$store.dispatch('RefreshFeatures')
|
||||
this.$messageConfigSuccess(`${this.$t('message.setting.updated')} ${record.name}`, record)
|
||||
if (json.updateconfigurationresponse &&
|
||||
json.updateconfigurationresponse.configuration &&
|
||||
!json.updateconfigurationresponse.configuration.isdynamic &&
|
||||
['Admin'].includes(this.$store.getters.userInfo.roletype)) {
|
||||
this.$notification.warning({
|
||||
message: this.$t('label.status'),
|
||||
description: this.$t('message.restart.mgmt.server')
|
||||
})
|
||||
}
|
||||
this.$notifyConfigurationValueChange(json?.updateconfigurationresponse?.configuration || null)
|
||||
}).catch(error => {
|
||||
console.error(error)
|
||||
this.$message.error(this.$t('message.error.save.setting'))
|
||||
|
|
|
|||
|
|
@ -550,6 +550,17 @@ export const dialogUtilPlugin = {
|
|||
onOk: () => callback(configRecord)
|
||||
})
|
||||
}
|
||||
|
||||
app.config.globalProperties.$notifyConfigurationValueChange = function (configRecord) {
|
||||
if (!configRecord || configRecord.isdynamic || store.getters.userInfo?.roletype !== 'Admin') {
|
||||
return
|
||||
}
|
||||
const server = configRecord.group === 'Usage Server' ? 'usage' : 'mgmt'
|
||||
this.$notification.warning({
|
||||
message: this.$t('label.status'),
|
||||
description: this.$t('message.restart.' + server + '.server')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -301,15 +301,7 @@ export default {
|
|||
this.$emit('change-config', { value: newValue })
|
||||
this.$store.dispatch('RefreshFeatures')
|
||||
this.$messageConfigSuccess(`${this.$t('message.setting.updated')} ${configrecord.name}`, configrecord)
|
||||
if (json.updateconfigurationresponse &&
|
||||
json.updateconfigurationresponse.configuration &&
|
||||
!json.updateconfigurationresponse.configuration.isdynamic &&
|
||||
['Admin'].includes(this.$store.getters.userInfo.roletype)) {
|
||||
this.$notification.warning({
|
||||
message: this.$t('label.status'),
|
||||
description: this.$t('message.restart.mgmt.server')
|
||||
})
|
||||
}
|
||||
this.$notifyConfigurationValueChange(json?.updateconfigurationresponse?.configuration || null)
|
||||
}).catch(error => {
|
||||
this.editableValue = this.actualValue
|
||||
console.error(error)
|
||||
|
|
@ -345,15 +337,7 @@ export default {
|
|||
this.$emit('change-config', { value: newValue })
|
||||
this.$store.dispatch('RefreshFeatures')
|
||||
this.$messageConfigSuccess(`${this.$t('label.setting')} ${configrecord.name} ${this.$t('label.reset.config.value')}`, configrecord)
|
||||
if (json.resetconfigurationresponse &&
|
||||
json.resetconfigurationresponse.configuration &&
|
||||
!json.resetconfigurationresponse.configuration.isdynamic &&
|
||||
['Admin'].includes(this.$store.getters.userInfo.roletype)) {
|
||||
this.$notification.warning({
|
||||
message: this.$t('label.status'),
|
||||
description: this.$t('message.restart.mgmt.server')
|
||||
})
|
||||
}
|
||||
this.$notifyConfigurationValueChange(json?.resetconfigurationresponse?.configuration || null)
|
||||
}).catch(error => {
|
||||
this.editableValue = this.actualValue
|
||||
console.error(error)
|
||||
|
|
|
|||
|
|
@ -500,8 +500,12 @@ public class UriUtils {
|
|||
if ((user != null) && (password != null)) {
|
||||
httpclient.getParams().setAuthenticationPreemptive(true);
|
||||
Credentials defaultcreds = new UsernamePasswordCredentials(user, password);
|
||||
httpclient.getState().setCredentials(new AuthScope(hostAndPort.first(), hostAndPort.second(), AuthScope.ANY_REALM), defaultcreds);
|
||||
LOGGER.info("Added username=" + user + ", password=" + password + "for host " + hostAndPort.first() + ":" + hostAndPort.second());
|
||||
httpclient.getState().setCredentials(
|
||||
new AuthScope(hostAndPort.first(), hostAndPort.second(), AuthScope.ANY_REALM), defaultcreds);
|
||||
LOGGER.info("Added username={} along with password for host {}:{}"
|
||||
, user
|
||||
, hostAndPort.first()
|
||||
, hostAndPort.second());
|
||||
}
|
||||
// Execute the method.
|
||||
GetMethod method = new GetMethod(url);
|
||||
|
|
|
|||
Loading…
Reference in New Issue