diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index f74c46161180..eac52e986d32 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -186,6 +186,7 @@ public class ApiConstants { public static final String DEVICE_IDS = "deviceids"; public static final String DEVICE_NAME = "devicename"; public static final String DIRECT_DOWNLOAD = "directdownload"; + public static final String DISABLE_DEFAULT_VIEW = "disabledefaultview"; public static final String DISK = "disk"; public static final String DISK_OFFERING_ID = "diskofferingid"; public static final String NEW_DISK_OFFERING_ID = "newdiskofferingid"; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java index 2cb64070950b..faad59304f00 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/config/ListCapabilitiesCmd.java @@ -93,6 +93,7 @@ public void execute() { Map vpnCustomerGatewayParameters = (Map) capabilities.get(ApiConstants.VPN_CUSTOMER_GATEWAY_PARAMETERS); response.setVpnCustomerGatewayParameters(vpnCustomerGatewayParameters); } + response.setDisableDefaultView((Boolean)capabilities.get(ApiConstants.DISABLE_DEFAULT_VIEW)); response.setObjectName("capability"); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java index 7ef627ec33ce..1c5852bab999 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/CapabilitiesResponse.java @@ -163,6 +163,10 @@ public class CapabilitiesResponse extends BaseResponse { @Param(description = "Excluded and obsolete VPN customer gateway cryptographic parameters") private Map vpnCustomerGatewayParameters; + @SerializedName(ApiConstants.DISABLE_DEFAULT_VIEW) + @Param(description = "Whether the Default view should be disabled for account.", since = "4.20.0.10-scclouds") + private Boolean disableDefaultView; + public void setSecurityGroupsEnabled(boolean securityGroupsEnabled) { this.securityGroupsEnabled = securityGroupsEnabled; } @@ -298,4 +302,8 @@ public void setAdditionalConfigEnabled(Boolean additionalConfigEnabled) { public void setVpnCustomerGatewayParameters(Map vpnCustomerGatewayParameters) { this.vpnCustomerGatewayParameters = vpnCustomerGatewayParameters; } + + public void setDisableDefaultView(Boolean disableDefaultView) { + this.disableDefaultView = disableDefaultView; + } } diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index f32857d7cf04..4748c4108975 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -4904,6 +4904,7 @@ public Map listCapabilities(final ListCapabilitiesCmd cmd) { if (exposeCloudStackVersionInApiListCapabilities.value()) { capabilities.put("cloudStackVersion", getVersion()); } + final Boolean disableDefaultView = AccountManager.DisableDefaultView.valueIn(caller.getAccountId()); capabilities.put("securityGroupsEnabled", securityGroupsEnabled); capabilities.put("userPublicTemplateEnabled", userPublicTemplateEnabled); @@ -4930,6 +4931,7 @@ public Map listCapabilities(final ListCapabilitiesCmd cmd) { capabilities.put(ApiConstants.INSTANCES_DISKS_STATS_RETENTION_TIME, StatsCollector.vmDiskStatsMaxRetentionTime.value()); capabilities.put(ApiConstants.INSTANCE_LEASE_ENABLED, VMLeaseManager.InstanceLeaseEnabled.value()); capabilities.put(ApiConstants.DYNAMIC_SCALING_ENABLED, UserVmManager.EnableDynamicallyScaleVm.value()); + capabilities.put(ApiConstants.DISABLE_DEFAULT_VIEW, disableDefaultView); if (apiLimitEnabled) { capabilities.put("apiLimitInterval", apiLimitInterval); capabilities.put("apiLimitMax", apiLimitMax); diff --git a/server/src/main/java/com/cloud/user/AccountManager.java b/server/src/main/java/com/cloud/user/AccountManager.java index 054880d45b4d..c6371955e538 100644 --- a/server/src/main/java/com/cloud/user/AccountManager.java +++ b/server/src/main/java/com/cloud/user/AccountManager.java @@ -192,6 +192,8 @@ void buildACLViewSearchCriteria(SearchCriteria s ConfigKey UseSecretKeyInResponse = new ConfigKey("Advanced", Boolean.class, "use.secret.key.in.response", "false", "This parameter allows the users to enable or disable of showing secret key as a part of response for various APIs. By default it is set to false.", true); + ConfigKey DisableDefaultView = new ConfigKey<>("Advanced", Boolean.class, "disable.default.view", "false", "This defines if the account will have access to the default view, or only to the projects it is associated to. In the GUI, if the account does not have access to any project, the Default View will be rendered.", true, ConfigKey.Scope.Account); + boolean moveUser(long id, Long domainId, Account newAccount) throws ResourceAllocationException; UserTwoFactorAuthenticator getUserTwoFactorAuthenticator(final Long domainId, final Long userAccountId); diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index c06228e44f9d..6e1e6a1da5b5 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -4205,7 +4205,7 @@ public String getConfigComponentName() { public ConfigKey[] getConfigKeys() { return new ConfigKey[] {UseSecretKeyInResponse, enableUserTwoFactorAuthentication, userTwoFactorAuthenticationDefaultProvider, mandateUserTwoFactorAuthentication, userTwoFactorAuthenticationIssuer, apiKeyAccess, - userAllowMultipleAccounts, listOfRoleTypesAllowedForOperationsOfSameRoleType, allowOperationsOnUsersInSameAccount}; + userAllowMultipleAccounts, listOfRoleTypesAllowedForOperationsOfSameRoleType, allowOperationsOnUsersInSameAccount, DisableDefaultView}; } public List getUserTwoFactorAuthenticationProviders() { diff --git a/ui/src/components/header/ProjectMenu.vue b/ui/src/components/header/ProjectMenu.vue index 32a77723825f..5a33e6b3b7cc 100644 --- a/ui/src/components/header/ProjectMenu.vue +++ b/ui/src/components/header/ProjectMenu.vue @@ -27,11 +27,13 @@ :defaultOption="defaultOption" defaultIcon="project-outlined" :pageSize="100" - @change-option="changeProject" /> + :selectFirstOption="shouldHideDefaultView" + @change-option="changeProject"/>