From bc05bd1a0e3a0ad27b994c3f1f3a8a522a588ee6 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 26 Jun 2019 07:51:41 +0530 Subject: [PATCH 1/3] api: Fix API argument documentation to list supported protocols (#3423) This fixes the API arg description to advise the user the possible protocol options they can provide to the createLoadBalancerRule API. Fixes #3090 Signed-off-by: Rohit Yadav --- .../command/user/loadbalancer/CreateLoadBalancerRuleCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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}) From f653e6149c53c9316bcccaf23f407c1be19eecb3 Mon Sep 17 00:00:00 2001 From: Anurag Awasthi Date: Wed, 26 Jun 2019 08:02:19 +0530 Subject: [PATCH 2/3] server: support sort_key for vpc_offerings table (#3268) Fixes #2742 UI Supported ordering VPC Offerings but the API did not have that support implemented. This makes the change in updateVPCOfferings and listVPCOfferings API calls, along with necessary database changes for supporting sorting of VPC Offerings. --- .../network/vpc/VpcProvisioningService.java | 16 ++++++----- .../admin/vpc/UpdateVPCOfferingCmd.java | 10 ++++++- .../com/cloud/network/vpc/VpcOfferingVO.java | 11 ++++++++ .../META-INF/db/schema-41200to41300.sql | 4 ++- .../com/cloud/network/vpc/VpcManagerImpl.java | 27 +++++++++++++++++-- 5 files changed, 57 insertions(+), 11 deletions(-) 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 cce285030b9..e682d9f99d4 100644 --- a/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java +++ b/api/src/main/java/com/cloud/network/vpc/VpcProvisioningService.java @@ -20,6 +20,8 @@ package com.cloud.network.vpc; import java.util.List; import java.util.Map; +import org.apache.cloudstack.api.command.admin.vpc.UpdateVPCOfferingCmd; + import com.cloud.utils.Pair; public interface VpcProvisioningService { @@ -40,13 +42,13 @@ public interface VpcProvisioningService { */ public boolean deleteVpcOffering(long offId); - /** - * @param vpcOffId - * @param vpcOfferingName - * @param displayText - * @param state - * @return - */ + @Deprecated public VpcOffering updateVpcOffering(long vpcOffId, String vpcOfferingName, String displayText, String state); + /** + * @param vpcOfferingCmd + * @return + */ + public VpcOffering updateVpcOffering(final UpdateVPCOfferingCmd vpcOfferingCmd); + } 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 5af47d3a4c7..f681ca94e89 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 @@ -52,6 +52,9 @@ public class UpdateVPCOfferingCmd extends BaseAsyncCmd { @Parameter(name = ApiConstants.STATE, type = CommandType.STRING, description = "update state for the VPC offering; " + "supported states - Enabled/Disabled") private String state; + @Parameter(name = ApiConstants.SORT_KEY, type = CommandType.INTEGER, description = "sort key of the VPC offering, integer") + private Integer sortKey; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -72,6 +75,11 @@ public class UpdateVPCOfferingCmd extends BaseAsyncCmd { return state; } + public Integer getSortKey() { + return sortKey; + } + + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -87,7 +95,7 @@ public class UpdateVPCOfferingCmd extends BaseAsyncCmd { @Override public void execute() { - VpcOffering result = _vpcProvSvc.updateVpcOffering(getId(), getVpcOfferingName(), getDisplayText(), getState()); + VpcOffering result = _vpcProvSvc.updateVpcOffering(this); if (result != null) { VpcOfferingResponse response = _responseGenerator.createVpcOfferingResponse(result); response.setResponseName(getCommandName()); 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 62e8cf3ae2a..60961e5ac5a 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(); } @@ -183,4 +186,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 97e9fac35c3..c0b0751a245 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; @@ -67,4 +69,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/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index a4ea50d94dd..33ae1cc08cd 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -39,6 +39,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; import org.apache.cloudstack.acl.ControlledEntity.ACLType; +import org.apache.cloudstack.api.command.admin.vpc.UpdateVPCOfferingCmd; import org.apache.cloudstack.api.command.user.vpc.ListPrivateGatewaysCmd; import org.apache.cloudstack.api.command.user.vpc.ListStaticRoutesCmd; import org.apache.cloudstack.context.CallContext; @@ -579,7 +580,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis @Override public Pair, Integer> listVpcOfferings(final Long id, final String name, final String displayText, final List supportedServicesStr, final Boolean isDefault, final String keyword, final String state, final Long startIndex, final Long pageSizeVal) { - final Filter searchFilter = new Filter(VpcOfferingVO.class, "created", false, null, null); + Boolean isAscending = Boolean.parseBoolean(_configDao.getValue("sortkey.algorithm")); + isAscending = isAscending == null ? Boolean.TRUE : isAscending; + final Filter searchFilter = new Filter(VpcOfferingVO.class, "sortKey", isAscending, null, null); final SearchCriteria sc = _vpcOffDao.createSearchCriteria(); if (keyword != null) { @@ -692,7 +695,23 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis @Override @ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_UPDATE, eventDescription = "updating vpc offering") - public VpcOffering updateVpcOffering(final long vpcOffId, final String vpcOfferingName, final String displayText, final String state) { + public VpcOffering updateVpcOffering(long vpcOffId, String vpcOfferingName, String displayText, String state) { + return updateVpcOfferingInternal(vpcOffId, vpcOfferingName, displayText, state, null); + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_VPC_OFFERING_UPDATE, eventDescription = "updating vpc offering") + public VpcOffering updateVpcOffering(final UpdateVPCOfferingCmd vpcOfferingCmd) { + final long vpcOffId = vpcOfferingCmd.getId(); + final String vpcOfferingName = vpcOfferingCmd.getVpcOfferingName(); + final String displayText = vpcOfferingCmd.getDisplayText(); + final String state = vpcOfferingCmd.getState(); + final Integer sortKey = vpcOfferingCmd.getSortKey(); + + return updateVpcOfferingInternal(vpcOffId, vpcOfferingName, displayText, state, sortKey); + } + + private VpcOffering updateVpcOfferingInternal(long vpcOffId, String vpcOfferingName, String displayText, String state, Integer sortKey) { CallContext.current().setEventDetails(" Id: " + vpcOffId); // Verify input parameters @@ -724,6 +743,10 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis } } + if (sortKey != null) { + offering.setSortKey(sortKey); + } + if (_vpcOffDao.update(vpcOffId, offering)) { s_logger.debug("Updated VPC offeirng id=" + vpcOffId); return _vpcOffDao.findById(vpcOffId); From 0833cf1dd74b03fd2aa805588f05bf555e1ceaf0 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Wed, 26 Jun 2019 10:27:21 +0530 Subject: [PATCH 3/3] server: fix potential NPE while ldap authentication (#3418) This fixes a potential NPE when a mapped account is not found and moving of user to the mapped account is performed. This will now throw a more information exception than NPE. Fixes #2853 Signed-off-by: Rohit Yadav --- .../network/contrail/management/MockAccountManager.java | 2 +- .../org/apache/cloudstack/ldap/LdapAuthenticator.java | 7 ++++++- server/src/main/java/com/cloud/user/AccountManager.java | 9 +++++---- .../src/main/java/com/cloud/user/AccountManagerImpl.java | 5 ++--- .../test/java/com/cloud/user/MockAccountManagerImpl.java | 2 +- 5 files changed, 15 insertions(+), 10 deletions(-) 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 100f38060be..f07a7435231 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 @@ -316,7 +316,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/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 bda4ccab468..b71d548c4d5 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -1817,13 +1817,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 4fbf7526f31..9fece09f357 100644 --- a/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java +++ b/server/src/test/java/com/cloud/user/MockAccountManagerImpl.java @@ -129,7 +129,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; }