diff --git a/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java b/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java index 035e5fd5944..8bba19c6c91 100644 --- a/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java +++ b/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java @@ -45,11 +45,14 @@ public interface VpcProvisioningService { */ public boolean deleteVpcOffering(long offId); + @Deprecated + public VpcOffering updateVpcOffering(long vpcOffId, String vpcOfferingName, String displayText, String state); + /** * @param cmd * @return */ - public VpcOffering updateVpcOffering(UpdateVPCOfferingCmd cmd); + VpcOffering updateVpcOffering(final UpdateVPCOfferingCmd cmd); /** * Retrieve ID of domains for a VPC offering diff --git a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java index 194d3aa5189..ce8f96c464d 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/admin/vpc/UpdateVPCOfferingCmd.java @@ -69,6 +69,9 @@ public class UpdateVPCOfferingCmd extends BaseAsyncCmd { since = "4.13") private String zoneIds; + @Parameter(name = ApiConstants.SORT_KEY, type = CommandType.INTEGER, description = "sort key of the VPC offering, integer") + private Integer sortKey; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -149,6 +152,10 @@ public class UpdateVPCOfferingCmd extends BaseAsyncCmd { return validZoneIds; } + public Integer getSortKey() { + return sortKey; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java index f9367652bdb..53273fe1d1c 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/loadbalancer/CreateLoadBalancerRuleCmd.java @@ -114,7 +114,7 @@ public class CreateLoadBalancerRuleCmd extends BaseAsyncCreateCmd /*implements L + "rule will be created for. Required when public Ip address is not associated with any Guest network yet (VPC case)") private Long networkId; - @Parameter(name = ApiConstants.PROTOCOL, type = CommandType.STRING, description = "The protocol for the LB") + @Parameter(name = ApiConstants.PROTOCOL, type = CommandType.STRING, description = "The protocol for the LB such as tcp, udp or tcp-proxy.") private String lbProtocol; @Parameter(name = ApiConstants.FOR_DISPLAY, type = CommandType.BOOLEAN, description = "an optional field, whether to the display the rule to the end user or not", since = "4.4", authorized = {RoleType.Admin}) diff --git a/engine/schema/src/main/java/com/cloud/network/vpc/VpcOfferingVO.java b/engine/schema/src/main/java/com/cloud/network/vpc/VpcOfferingVO.java index b91072d0102..aa26f16568a 100644 --- a/engine/schema/src/main/java/com/cloud/network/vpc/VpcOfferingVO.java +++ b/engine/schema/src/main/java/com/cloud/network/vpc/VpcOfferingVO.java @@ -76,6 +76,9 @@ public class VpcOfferingVO implements VpcOffering { @Column(name = "redundant_router_service") boolean redundantRouter = false; + @Column(name = "sort_key") + int sortKey; + public VpcOfferingVO() { this.uuid = UUID.randomUUID().toString(); } @@ -193,4 +196,12 @@ public class VpcOfferingVO implements VpcOffering { return this.redundantRouter; } + public void setSortKey(int key) { + sortKey = key; + } + + public int getSortKey() { + return sortKey; + } + } diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41200to41300.sql b/engine/schema/src/main/resources/META-INF/db/schema-41200to41300.sql index 2bc2eac171f..9343af2eb77 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41200to41300.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41200to41300.sql @@ -26,6 +26,8 @@ INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervis -- DPDK client and server mode support ALTER TABLE `cloud`.`service_offering_details` CHANGE COLUMN `value` `value` TEXT NOT NULL; +ALTER TABLE `cloud`.`vpc_offerings` ADD COLUMN `sort_key` int(32) NOT NULL default 0 COMMENT 'sort key used for customising sort method'; + -- Add `sort_key` column to data_center ALTER TABLE `cloud`.`data_center` ADD COLUMN `sort_key` INT(32) NOT NULL DEFAULT 0; @@ -259,6 +261,7 @@ CREATE VIEW `cloud`.`vpc_offering_view` AS `vpc_offerings`.`supports_distributed_router` AS `supports_distributed_router`, `vpc_offerings`.`supports_region_level_vpc` AS `supports_region_level_vpc`, `vpc_offerings`.`redundant_router_service` AS `redundant_router_service`, + `vpc_offerings`.`sort_key` AS `sort_key`, GROUP_CONCAT(DISTINCT(domain.id)) AS domain_id, GROUP_CONCAT(DISTINCT(domain.uuid)) AS domain_uuid, GROUP_CONCAT(DISTINCT(domain.name)) AS domain_name, @@ -317,4 +320,4 @@ CREATE VIEW `cloud`.`data_center_view` AS left join `cloud`.`dedicated_resources` ON data_center.id = dedicated_resources.data_center_id left join - `cloud`.`affinity_group` ON dedicated_resources.affinity_group_id = affinity_group.id; + `cloud`.`affinity_group` ON dedicated_resources.affinity_group_id = affinity_group.id; \ No newline at end of file diff --git a/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java b/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java index 85b674d0252..68ff2e80378 100644 --- a/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java +++ b/plugins/network-elements/juniper-contrail/src/test/java/org/apache/cloudstack/network/contrail/management/MockAccountManager.java @@ -319,7 +319,7 @@ public class MockAccountManager extends ManagerBase implements AccountManager { } @Override - public boolean moveUser(long id, Long domainId, long accountId) { + public boolean moveUser(long id, Long domainId, Account account) { return false; } diff --git a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/LdapAuthenticator.java b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/LdapAuthenticator.java index 517c7185e29..2d8fe530d9d 100644 --- a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/LdapAuthenticator.java +++ b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/ldap/LdapAuthenticator.java @@ -35,6 +35,7 @@ import com.cloud.user.UserAccount; import com.cloud.user.dao.UserAccountDao; import com.cloud.utils.Pair; import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.exception.CloudRuntimeException; public class LdapAuthenticator extends AdapterBase implements UserAuthenticator { private static final Logger s_logger = Logger.getLogger(LdapAuthenticator.class.getName()); @@ -135,7 +136,11 @@ public class LdapAuthenticator extends AdapterBase implements UserAuthenticator } else { // not a new user, check if mapped group has changed if(userAccount.getAccountId() != mapping.getAccountId()) { - _accountManager.moveUser(userAccount.getId(),userAccount.getDomainId(),mapping.getAccountId()); + final Account mappedAccount = _accountManager.getAccount(mapping.getAccountId()); + if (mappedAccount == null || mappedAccount.getRemoved() != null) { + throw new CloudRuntimeException("Mapped account for users does not exist. Please contact your administrator."); + } + _accountManager.moveUser(userAccount.getId(), userAccount.getDomainId(), mappedAccount); } // else { the user hasn't changed in ldap, the ldap group stayed the same, hurray, pass, fun thou self a lot of fun } } diff --git a/server/src/main/java/com/cloud/api/query/vo/VpcOfferingJoinVO.java b/server/src/main/java/com/cloud/api/query/vo/VpcOfferingJoinVO.java index 68ebdcf1eec..6cc5c225379 100644 --- a/server/src/main/java/com/cloud/api/query/vo/VpcOfferingJoinVO.java +++ b/server/src/main/java/com/cloud/api/query/vo/VpcOfferingJoinVO.java @@ -74,6 +74,9 @@ public class VpcOfferingJoinVO implements VpcOffering { @Column(name = "redundant_router_service") boolean redundantRouter = false; + @Column(name = "sort_key") + int sortKey; + @Column(name = "domain_id") private String domainId; @@ -162,6 +165,10 @@ public class VpcOfferingJoinVO implements VpcOffering { return redundantRouter; } + public int getSortKey() { + return sortKey; + } + public String getDomainId() { return domainId; } diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index 2d74ce7c378..b1b1059c123 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -657,7 +657,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis final Long startIndex = cmd.getStartIndex(); final Long pageSizeVal = cmd.getPageSizeVal(); final Long zoneId = cmd.getZoneId(); - final Filter searchFilter = new Filter(VpcOfferingJoinVO.class, "created", false, null, null); + Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm")); + isAscending = isAscending == null ? Boolean.TRUE : isAscending; + final Filter searchFilter = new Filter(VpcOfferingJoinVO.class, "sortKey", isAscending, null, null); final SearchCriteria sc = vpcOfferingJoinDao.createSearchCriteria(); if (keyword != null) { @@ -800,13 +802,20 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis @Override @ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_UPDATE, eventDescription = "updating vpc offering") - public VpcOffering updateVpcOffering(UpdateVPCOfferingCmd cmd) { + public VpcOffering updateVpcOffering(long vpcOffId, String vpcOfferingName, String displayText, String state) { + return updateVpcOfferingInternal(vpcOffId, vpcOfferingName, displayText, state, null, null, null); + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_UPDATE, eventDescription = "updating vpc offering") + public VpcOffering updateVpcOffering(final UpdateVPCOfferingCmd cmd) { final Long offeringId = cmd.getId(); final String vpcOfferingName = cmd.getVpcOfferingName(); final String displayText = cmd.getDisplayText(); final String state = cmd.getState(); final List domainIds = cmd.getDomainIds(); final List zoneIds = cmd.getZoneIds(); + final Integer sortKey = cmd.getSortKey(); // check if valid domain if (CollectionUtils.isNotEmpty(domainIds)) { @@ -825,10 +834,10 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis } } - return updateVpcOffering(offeringId, vpcOfferingName, displayText, state, domainIds, zoneIds); + return updateVpcOfferingInternal(offeringId, vpcOfferingName, displayText, state, sortKey, domainIds, zoneIds); } - private VpcOffering updateVpcOffering(final long vpcOffId,final String vpcOfferingName, final String displayText, final String state, final List domainIds, final List zoneIds) { + private VpcOffering updateVpcOfferingInternal(long vpcOffId, String vpcOfferingName, String displayText, String state, Integer sortKey, final List domainIds, final List zoneIds) { CallContext.current().setEventDetails(" Id: " + vpcOffId); // Verify input parameters @@ -854,7 +863,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis } Collections.sort(filteredZoneIds); - final boolean updateNeeded = vpcOfferingName != null || displayText != null || state != null; + final boolean updateNeeded = vpcOfferingName != null || displayText != null || state != null || sortKey != null; final VpcOfferingVO offering = _vpcOffDao.createForUpdate(vpcOffId); @@ -862,11 +871,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis if (vpcOfferingName != null) { offering.setName(vpcOfferingName); } - if (displayText != null) { offering.setDisplayText(displayText); } - if (state != null) { boolean validState = false; for (final VpcOffering.State st : VpcOffering.State.values()) { @@ -879,6 +886,10 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis throw new InvalidParameterValueException("Incorrect state value: " + state); } } + if (sortKey != null) { + offering.setSortKey(sortKey); + } + if (!_vpcOffDao.update(vpcOffId, offering)) { return null; } diff --git a/server/src/main/java/com/cloud/user/AccountManager.java b/server/src/main/java/com/cloud/user/AccountManager.java index de6dcca0a67..57012e13334 100644 --- a/server/src/main/java/com/cloud/user/AccountManager.java +++ b/server/src/main/java/com/cloud/user/AccountManager.java @@ -180,11 +180,12 @@ public interface AccountManager extends AccountService, Configurable { List listAclGroupsByAccount(Long accountId); - public static final String MESSAGE_ADD_ACCOUNT_EVENT = "Message.AddAccount.Event"; + String MESSAGE_ADD_ACCOUNT_EVENT = "Message.AddAccount.Event"; - public static final String MESSAGE_REMOVE_ACCOUNT_EVENT = "Message.RemoveAccount.Event"; - public static final ConfigKey UseSecretKeyInResponse = new ConfigKey("Advanced", Boolean.class, "use.secret.key.in.response", "false", + String MESSAGE_REMOVE_ACCOUNT_EVENT = "Message.RemoveAccount.Event"; + + 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); - boolean moveUser(long id, Long domainId, long accountId); + boolean moveUser(long id, Long domainId, Account newAccount); } diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index c394793dfeb..20d769f09ef 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -1820,13 +1820,12 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M } @Override - public boolean moveUser(long id, Long domainId, long accountId) { + public boolean moveUser(long id, Long domainId, Account newAccount) { UserVO user = getValidUserVO(id); Account oldAccount = _accountDao.findById(user.getAccountId()); checkAccountAndAccess(user, oldAccount); - Account newAccount = _accountDao.findById(accountId); checkIfNotMovingAcrossDomains(domainId, newAccount); - return moveUser(user, accountId); + return moveUser(user, newAccount.getId()); } private boolean moveUser(UserVO user, long newAccountId) { diff --git a/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java b/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java index 071affc2610..ea6287d2bcc 100644 --- a/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java +++ b/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java @@ -132,7 +132,7 @@ public class MockAccountManagerImpl extends ManagerBase implements Manager, Acco } @Override - public boolean moveUser(long id, Long domainId, long accountId) { + public boolean moveUser(long id, Long domainId, Account account) { return false; }