Skip to content

Commit e7015cb

Browse files
authored
Move console proxy related global settings to Zone level (#11415)
1 parent 273ae03 commit e7015cb

File tree

9 files changed

+168
-238
lines changed

9 files changed

+168
-238
lines changed

server/src/main/java/com/cloud/configuration/Config.java

Lines changed: 1 addition & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.apache.cloudstack.framework.config.ConfigKey;
2626

2727
import com.cloud.agent.AgentManager;
28-
import com.cloud.consoleproxy.ConsoleProxyManager;
2928
import com.cloud.ha.HighAvailabilityManager;
3029
import com.cloud.hypervisor.Hypervisor.HypervisorType;
3130
import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
@@ -404,96 +403,6 @@ public enum Config {
404403
"service monitoring in router enable/disable option, default false", null),
405404

406405

407-
// Console Proxy
408-
ConsoleProxyCapacityStandby(
409-
"Console Proxy",
410-
AgentManager.class,
411-
String.class,
412-
"consoleproxy.capacity.standby",
413-
"10",
414-
"The minimal number of console proxy viewer sessions that system is able to serve immediately(standby capacity)",
415-
null),
416-
ConsoleProxyCapacityScanInterval(
417-
"Console Proxy",
418-
AgentManager.class,
419-
String.class,
420-
"consoleproxy.capacityscan.interval",
421-
"30000",
422-
"The time interval(in millisecond) to scan whether or not system needs more console proxy to ensure minimal standby capacity",
423-
null),
424-
ConsoleProxyCmdPort(
425-
"Console Proxy",
426-
AgentManager.class,
427-
Integer.class,
428-
"consoleproxy.cmd.port",
429-
"8001",
430-
"Console proxy command port that is used to communicate with management server",
431-
null),
432-
ConsoleProxyRestart(
433-
"Console Proxy",
434-
AgentManager.class,
435-
Boolean.class,
436-
"consoleproxy.restart",
437-
"true",
438-
"Console proxy restart flag, defaulted to true",
439-
null),
440-
ConsoleProxyUrlDomain(
441-
"Console Proxy",
442-
AgentManager.class,
443-
String.class,
444-
"consoleproxy.url.domain",
445-
"",
446-
"Console proxy url domain",
447-
"domainName,privateip"),
448-
ConsoleProxySessionMax(
449-
"Console Proxy",
450-
AgentManager.class,
451-
Integer.class,
452-
"consoleproxy.session.max",
453-
String.valueOf(ConsoleProxyManager.DEFAULT_PROXY_CAPACITY),
454-
"The max number of viewer sessions console proxy is configured to serve for",
455-
null),
456-
ConsoleProxySessionTimeout(
457-
"Console Proxy",
458-
AgentManager.class,
459-
Integer.class,
460-
"consoleproxy.session.timeout",
461-
"300000",
462-
"Timeout(in milliseconds) that console proxy tries to maintain a viewer session before it times out the session for no activity",
463-
null),
464-
ConsoleProxyDisableRpFilter(
465-
"Console Proxy",
466-
AgentManager.class,
467-
Boolean.class,
468-
"consoleproxy.disable.rpfilter",
469-
"true",
470-
"disable rp_filter on console proxy VM public interface",
471-
null),
472-
ConsoleProxyLaunchMax(
473-
"Console Proxy",
474-
AgentManager.class,
475-
Integer.class,
476-
"consoleproxy.launch.max",
477-
"10",
478-
"maximum number of console proxy instances per zone can be launched",
479-
null),
480-
ConsoleProxyManagementState(
481-
"Console Proxy",
482-
AgentManager.class,
483-
String.class,
484-
"consoleproxy.management.state",
485-
com.cloud.consoleproxy.ConsoleProxyManagementState.Auto.toString(),
486-
"console proxy service management state",
487-
null),
488-
ConsoleProxyManagementLastState(
489-
"Console Proxy",
490-
AgentManager.class,
491-
String.class,
492-
"consoleproxy.management.state.last",
493-
com.cloud.consoleproxy.ConsoleProxyManagementState.Auto.toString(),
494-
"last console proxy service management state",
495-
null),
496-
497406
// Snapshots
498407

499408
SnapshotPollInterval(
@@ -1587,14 +1496,6 @@ public enum Config {
15871496
"false",
15881497
"Should be set to true, if there will be multiple NetScaler devices providing EIP service in a zone",
15891498
null),
1590-
ConsoleProxyServiceOffering(
1591-
"Advanced",
1592-
ManagementServer.class,
1593-
String.class,
1594-
"consoleproxy.service.offering",
1595-
null,
1596-
"Uuid of the service offering used by console proxy; if NULL - system offering will be used",
1597-
null),
15981499
SecondaryStorageServiceOffering(
15991500
"Advanced",
16001501
ManagementServer.class,
@@ -1799,6 +1700,7 @@ public enum Config {
17991700

18001701
SSVMPSK("Hidden", ManagementServer.class, String.class, "upload.post.secret.key", "", "PSK with SSVM", null);
18011702

1703+
18021704
private final String _category;
18031705
private final Class<?> _componentClass;
18041706
private final Class<?> _type;

server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import javax.inject.Inject;
5050
import javax.naming.ConfigurationException;
5151

52+
import com.cloud.consoleproxy.ConsoleProxyManager;
5253
import org.apache.cloudstack.acl.RoleType;
5354
import org.apache.cloudstack.acl.SecurityChecker;
5455
import org.apache.cloudstack.affinity.AffinityGroup;
@@ -573,7 +574,7 @@ protected void populateConfigValuesForValidationSet() {
573574
configValuesForValidation.add("event.purge.interval");
574575
configValuesForValidation.add("account.cleanup.interval");
575576
configValuesForValidation.add("alert.wait");
576-
configValuesForValidation.add("consoleproxy.capacityscan.interval");
577+
configValuesForValidation.add(ConsoleProxyManager.ConsoleProxyCapacityScanInterval.key());
577578
configValuesForValidation.add("expunge.interval");
578579
configValuesForValidation.add("host.stats.interval");
579580
configValuesForValidation.add("network.gc.interval");

server/src/main/java/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,12 @@ public boolean configure(String name, Map<String, Object> params) throws Configu
120120
_consoleProxyPort = NumbersUtil.parseInt(value, ConsoleProxyManager.DEFAULT_PROXY_VNC_PORT);
121121
}
122122

123-
value = configs.get(ConsoleProxySslEnabled.key());
124-
if (value != null && value.equalsIgnoreCase("true")) {
123+
Boolean sslEnabled = ConsoleProxySslEnabled.value();
124+
if (Boolean.TRUE.equals(sslEnabled)) {
125125
_sslEnabled = true;
126126
}
127127

128-
_consoleProxyUrlDomain = configs.get("consoleproxy.url.domain");
128+
_consoleProxyUrlDomain = ConsoleProxyUrlDomain.value();
129129

130130
_listener = new ConsoleProxyListener(new AgentBasedAgentHook(_instanceDao, _hostDao, _configDao, _ksMgr,
131131
_agentMgr, _keysMgr, consoleAccessManager));
@@ -166,6 +166,8 @@ public ConsoleProxyInfo assignProxy(long dataCenterId, VMInstanceVO userVm) {
166166
urlPort = host.getProxyPort().intValue();
167167
}
168168

169+
_sslEnabled = ConsoleProxySslEnabled.valueIn(dataCenterId);
170+
_consoleProxyUrlDomain = ConsoleProxyUrlDomain.valueIn(dataCenterId);
169171
return new ConsoleProxyInfo(_sslEnabled, publicIp, _consoleProxyPort, urlPort, _consoleProxyUrlDomain);
170172
} else {
171173
logger.warn("Host that VM is running is no longer available, console access to VM {} will be temporarily unavailable.", userVm);
@@ -189,7 +191,7 @@ public boolean destroyProxy(long proxyVmId) {
189191
}
190192

191193
@Override
192-
public int getVncPort() {
194+
public int getVncPort(Long dataCenterId) {
193195
return _consoleProxyPort;
194196
}
195197

server/src/main/java/com/cloud/consoleproxy/AgentHookBase.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.security.NoSuchAlgorithmException;
2121
import java.security.SecureRandom;
2222
import java.util.Date;
23+
import java.util.Objects;
2324

2425
import org.apache.cloudstack.consoleproxy.ConsoleAccessManager;
2526
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -41,7 +42,6 @@
4142
import com.cloud.agent.api.StartupCommand;
4243
import com.cloud.agent.api.StartupProxyCommand;
4344
import com.cloud.agent.api.proxy.StartConsoleProxyAgentHttpHandlerCommand;
44-
import com.cloud.configuration.Config;
4545
import com.cloud.exception.AgentUnavailableException;
4646
import com.cloud.exception.OperationTimedoutException;
4747
import com.cloud.host.Host;
@@ -213,10 +213,16 @@ public void startAgentHttpHandlerInVM(StartupProxyCommand startupCmd) {
213213

214214
byte[] ksBits = null;
215215

216-
String consoleProxyUrlDomain = _configDao.getValue(Config.ConsoleProxyUrlDomain.key());
217-
String consoleProxySslEnabled = _configDao.getValue(ConsoleProxyManager.ConsoleProxySslEnabled.key());
218-
if (!StringUtils.isEmpty(consoleProxyUrlDomain) && !StringUtils.isEmpty(consoleProxySslEnabled)
219-
&& consoleProxySslEnabled.equalsIgnoreCase("true")) {
216+
HostVO consoleProxyHost = findConsoleProxyHost(startupCmd);
217+
218+
if (Objects.isNull(consoleProxyHost)) {
219+
throw new IllegalStateException("Console proxy host is null");
220+
}
221+
222+
Long datacenterId = consoleProxyHost.getDataCenterId();
223+
String consoleProxyUrlDomain = ConsoleProxyManager.ConsoleProxyUrlDomain.valueIn(datacenterId);
224+
Boolean consoleProxySslEnabled = ConsoleProxyManager.ConsoleProxySslEnabled.valueIn(datacenterId);
225+
if (!StringUtils.isEmpty(consoleProxyUrlDomain) && Boolean.TRUE.equals(consoleProxySslEnabled)) {
220226
ksBits = _ksMgr.getKeystoreBits(ConsoleProxyManager.CERTIFICATE_NAME, ConsoleProxyManager.CERTIFICATE_NAME, storePassword);
221227
//ks manager raises exception if ksBits are null, hence no need to explicltly handle the condition
222228
} else {
@@ -227,9 +233,6 @@ public void startAgentHttpHandlerInVM(StartupProxyCommand startupCmd) {
227233
cmd.setEncryptorPassword(getEncryptorPassword());
228234
cmd.setIsSourceIpCheckEnabled(Boolean.parseBoolean(_configDao.getValue(ConsoleProxyManager.NoVncConsoleSourceIpCheckEnabled.key())));
229235

230-
HostVO consoleProxyHost = findConsoleProxyHost(startupCmd);
231-
232-
assert (consoleProxyHost != null);
233236
if (consoleProxyHost != null) {
234237
Answer answer = _agentMgr.send(consoleProxyHost.getId(), cmd);
235238
if (answer == null || !answer.getResult()) {

server/src/main/java/com/cloud/consoleproxy/ConsoleProxyManager.java

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
// under the License.
1717
package com.cloud.consoleproxy;
1818

19+
import java.util.Arrays;
1920
import java.util.Map;
21+
import java.util.stream.Collectors;
2022

2123
import org.apache.cloudstack.framework.config.ConfigKey;
2224

@@ -45,15 +47,52 @@ public interface ConsoleProxyManager extends Manager, ConsoleProxyService {
4547
String ALERT_SUBJECT = "proxy-alert";
4648
String CERTIFICATE_NAME = "CPVMCertificate";
4749

48-
ConfigKey<Boolean> ConsoleProxySslEnabled = new ConfigKey<>(ConfigKey.CATEGORY_ADVANCED, Boolean.class, "consoleproxy.sslEnabled", "false",
49-
"Enable SSL for console proxy", false);
50+
ConfigKey<Boolean> ConsoleProxySslEnabled = new ConfigKey<>(Boolean.class, "consoleproxy.sslEnabled", ConfigKey.CATEGORY_ADVANCED, "false",
51+
"Enable SSL for console proxy", false, ConfigKey.Scope.Zone, null);
5052

51-
ConfigKey<Boolean> NoVncConsoleDefault = new ConfigKey<>(ConfigKey.CATEGORY_ADVANCED, Boolean.class, "novnc.console.default", "true",
52-
"If true, noVNC console will be default console for virtual machines", true);
53+
ConfigKey<Boolean> NoVncConsoleDefault = new ConfigKey<>(Boolean.class, "novnc.console.default", ConfigKey.CATEGORY_ADVANCED, "true",
54+
"If true, noVNC console will be default console for virtual machines", false, ConfigKey.Scope.Zone, null);
5355

5456
ConfigKey<Boolean> NoVncConsoleSourceIpCheckEnabled = new ConfigKey<>(ConfigKey.CATEGORY_ADVANCED, Boolean.class, "novnc.console.sourceip.check.enabled", "false",
5557
"If true, The source IP to access novnc console must be same as the IP in request to management server for console URL. Needs to reconnect CPVM to management server when this changes (via restart CPVM, or management server, or cloud service in CPVM)", false);
5658

59+
ConfigKey<String> ConsoleProxyServiceOffering = new ConfigKey<>(String.class, "consoleproxy.service.offering", "Console Proxy", null,
60+
"Uuid of the service offering used by console proxy; if NULL - system offering will be used", true, ConfigKey.Scope.Zone, null);
61+
62+
ConfigKey<String> ConsoleProxyCapacityStandby = new ConfigKey<>(String.class, "consoleproxy.capacity.standby", "Console Proxy", String.valueOf(DEFAULT_STANDBY_CAPACITY),
63+
"The minimal number of console proxy viewer sessions that system is able to serve immediately(standby capacity)", false, ConfigKey.Scope.Zone, null);
64+
65+
ConfigKey<String> ConsoleProxyCapacityScanInterval = new ConfigKey<>(String.class, "consoleproxy.capacityscan.interval", "Console Proxy", "30000",
66+
"The time interval(in millisecond) to scan whether or not system needs more console proxy to ensure minimal standby capacity", false, null);
67+
68+
ConfigKey<Integer> ConsoleProxyCmdPort = new ConfigKey<>(Integer.class, "consoleproxy.cmd.port", "Console Proxy", String.valueOf(DEFAULT_PROXY_CMD_PORT),
69+
"Console proxy command port that is used to communicate with management server", false, ConfigKey.Scope.Zone, null);
70+
71+
ConfigKey<Boolean> ConsoleProxyRestart = new ConfigKey<>(Boolean.class, "consoleproxy.restart", "Console Proxy", "true",
72+
"Console proxy restart flag, defaults to true", true, ConfigKey.Scope.Zone, null);
73+
74+
ConfigKey<String> ConsoleProxyUrlDomain = new ConfigKey<>(String.class, "consoleproxy.url.domain", "Console Proxy", "",
75+
"Console proxy url domain - domainName,privateip", false, ConfigKey.Scope.Zone, null);
76+
77+
ConfigKey<Integer> ConsoleProxySessionMax = new ConfigKey<>(Integer.class, "consoleproxy.session.max", "Console Proxy", String.valueOf(DEFAULT_PROXY_CAPACITY),
78+
"The max number of viewer sessions console proxy is configured to serve for", true, ConfigKey.Scope.Zone, null);
79+
80+
ConfigKey<Integer> ConsoleProxySessionTimeout = new ConfigKey<>(Integer.class, "consoleproxy.session.timeout", "Console Proxy", String.valueOf(DEFAULT_PROXY_SESSION_TIMEOUT),
81+
"Timeout(in milliseconds) that console proxy tries to maintain a viewer session before it times out the session for no activity", true, ConfigKey.Scope.Zone, null);
82+
83+
ConfigKey<Boolean> ConsoleProxyDisableRpFilter = new ConfigKey<>(Boolean.class, "consoleproxy.disable.rpfilter", "Console Proxy", "true",
84+
"disable rp_filter on console proxy VM public interface", true, ConfigKey.Scope.Zone, null);
85+
86+
ConfigKey<Integer> ConsoleProxyLaunchMax = new ConfigKey<>(Integer.class, "consoleproxy.launch.max", "Console Proxy", "10",
87+
"maximum number of console proxy instances per zone can be launched", false, ConfigKey.Scope.Zone, null);
88+
89+
String consoleProxyManagementStates = Arrays.stream(com.cloud.consoleproxy.ConsoleProxyManagementState.values()).map(Enum::name).collect(Collectors.joining(","));
90+
ConfigKey<String> ConsoleProxyServiceManagementState = new ConfigKey<String>(ConfigKey.CATEGORY_ADVANCED, String.class, "consoleproxy.management.state", com.cloud.consoleproxy.ConsoleProxyManagementState.Auto.toString(),
91+
"console proxy service management state", false, ConfigKey.Kind.Select, consoleProxyManagementStates);
92+
93+
ConfigKey<String> ConsoleProxyManagementLastState = new ConfigKey<String>(ConfigKey.CATEGORY_ADVANCED, String.class, "consoleproxy.management.state.last", com.cloud.consoleproxy.ConsoleProxyManagementState.Auto.toString(),
94+
"last console proxy service management state", false, ConfigKey.Kind.Select, consoleProxyManagementStates);
95+
5796
void setManagementState(ConsoleProxyManagementState state);
5897

5998
ConsoleProxyManagementState getManagementState();
@@ -72,6 +111,6 @@ void startProxyForHA(VirtualMachine vm, Map<VirtualMachineProfile.Param, Object>
72111

73112
boolean destroyProxy(long proxyVmId);
74113

75-
int getVncPort();
114+
int getVncPort(Long dataCenterId);
76115

77116
}

0 commit comments

Comments
 (0)