You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by du...@apache.org on 2013/12/12 00:38:17 UTC
git commit: updated refs/heads/4.3 to 900bedb
Updated Branches:
refs/heads/4.3 796f2aa48 -> 900bedbe1
added LDAP group name label in add account wizard
changed the parameter for domain in api importLdapUser from name to UUID
improved error handling
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/900bedbe
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/900bedbe
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/900bedbe
Branch: refs/heads/4.3
Commit: 900bedbe158a696682b8dd641fdb2ad65ebacb48
Parents: 796f2aa
Author: Rajani Karuturi <ra...@gmail.com>
Authored: Fri Nov 15 14:20:40 2013 +0530
Committer: Ian Duffy <ia...@ianduffy.ie>
Committed: Wed Dec 11 23:35:58 2013 +0000
----------------------------------------------------------------------
.../classes/resources/messages.properties | 1 +
.../api/command/LdapImportUsersCmd.java | 200 +++++++------
.../ldap/LdapImportUsersCmdSpec.groovy | 289 ++++++++++---------
ui/dictionary.jsp | 1 +
ui/scripts/accountsWizard.js | 67 +++--
ui/scripts/docs.js | 4 +
ui/scripts/ui-custom/accountsWizard.js | 106 ++++---
7 files changed, 380 insertions(+), 288 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/900bedbe/client/WEB-INF/classes/resources/messages.properties
----------------------------------------------------------------------
diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties
index 5885bd0..1303562 100644
--- a/client/WEB-INF/classes/resources/messages.properties
+++ b/client/WEB-INF/classes/resources/messages.properties
@@ -1250,6 +1250,7 @@ label.zoneWizard.trafficType.guest=Guest\: Traffic between end-user virtual mach
label.zoneWizard.trafficType.management=Management\: Traffic between CloudStack\\\\'s internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs
label.zoneWizard.trafficType.public=Public\: Traffic between the internet and virtual machines in the cloud.
label.zoneWizard.trafficType.storage=Storage\: Traffic between primary and secondary storage servers, such as VM templates and snapshots
+label.ldap.group.name=LDAP Group
managed.state=Managed State
message.acquire.new.ip.vpc=Please confirm that you would like to acquire a new IP for this VPC.
message.acquire.new.ip=Please confirm that you would like to acquire a new IP for this network.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/900bedbe/plugins/user-authenticators/ldap/src/org/apache/cloudstack/api/command/LdapImportUsersCmd.java
----------------------------------------------------------------------
diff --git a/plugins/user-authenticators/ldap/src/org/apache/cloudstack/api/command/LdapImportUsersCmd.java b/plugins/user-authenticators/ldap/src/org/apache/cloudstack/api/command/LdapImportUsersCmd.java
index 063db0e..1855d5d 100644
--- a/plugins/user-authenticators/ldap/src/org/apache/cloudstack/api/command/LdapImportUsersCmd.java
+++ b/plugins/user-authenticators/ldap/src/org/apache/cloudstack/api/command/LdapImportUsersCmd.java
@@ -16,11 +16,17 @@
// under the License.
package org.apache.cloudstack.api.command;
-import com.cloud.domain.Domain;
-import com.cloud.exception.*;
-import com.cloud.user.AccountService;
-import com.cloud.user.DomainService;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
import org.apache.cloudstack.api.*;
+import org.apache.cloudstack.api.response.DomainResponse;
import org.apache.cloudstack.api.response.LdapUserResponse;
import org.apache.cloudstack.api.response.ListResponse;
import org.apache.cloudstack.ldap.LdapManager;
@@ -30,13 +36,10 @@ import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.bouncycastle.util.encoders.Base64;
-import javax.inject.Inject;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import com.cloud.domain.Domain;
+import com.cloud.exception.*;
+import com.cloud.user.AccountService;
+import com.cloud.user.DomainService;
@APICommand(name = "importLdapUsers", description = "Import LDAP users", responseObject = LdapUserResponse.class, since = "4.3.0")
public class LdapImportUsersCmd extends BaseListCmd {
@@ -45,117 +48,136 @@ public class LdapImportUsersCmd extends BaseListCmd {
private static final String s_name = "ldapuserresponse";
- @Parameter(name = ApiConstants.TIMEZONE, type = CommandType.STRING,
- description = "Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.")
+ @Parameter(name = ApiConstants.TIMEZONE, type = CommandType.STRING, description = "Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.")
private String timezone;
- @Parameter(name = ApiConstants.ACCOUNT_TYPE, type = CommandType.SHORT, required = true,
- description = "Type of the account. Specify 0 for user, 1 for root admin, and 2 for domain admin")
+ @Parameter(name = ApiConstants.ACCOUNT_TYPE, type = CommandType.SHORT, required = true, description = "Type of the account. Specify 0 for user, 1 for root admin, and 2 for domain admin")
private Short accountType;
@Parameter(name = ApiConstants.ACCOUNT_DETAILS, type = CommandType.MAP, description = "details for account used to store specific parameters")
private Map<String, String> details;
- @Parameter(name = ApiConstants.DOMAIN, type = CommandType.STRING,
- description = "Specifies the domain to which the ldap users are to be imported. If no domain is specified, a domain will created using group parameter. If the " +
- "group is also not specified, a domain name based on the OU information will be created. If no OU hierarchy exists, will be defaulted to ROOT domain")
- private String domainName;
+ @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "Specifies the domain to which the ldap users are to be "
+ + "imported. If no domain is specified, a domain will created using group parameter. If the group is also not specified, a domain name based on the OU information will be "
+ + "created. If no OU hierarchy exists, will be defaulted to ROOT domain")
+ private Long domainId;
- @Parameter(name = ApiConstants.GROUP, type = CommandType.STRING,
- description = "Specifies the group name from which the ldap users are to be imported. If no group is specified, all the users will be imported.")
+ @Parameter(name = ApiConstants.GROUP, type = CommandType.STRING, description = "Specifies the group name from which the ldap users are to be imported. "
+ + "If no group is specified, all the users will be imported.")
private String groupName;
+ private Domain _domain;
+
@Inject
private LdapManager _ldapManager;
public LdapImportUsersCmd() {
- super();
+ super();
}
public LdapImportUsersCmd(final LdapManager ldapManager, final DomainService domainService, final AccountService accountService) {
- super();
- _ldapManager = ldapManager;
- _domainService = domainService;
- _accountService = accountService;
+ super();
+ _ldapManager = ldapManager;
+ _domainService = domainService;
+ _accountService = accountService;
}
@Override
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException,
- NetworkRuleConflictException {
- List<LdapUserResponse> ldapResponses = null;
- final ListResponse<LdapUserResponse> response = new ListResponse<LdapUserResponse>();
- try {
- List<LdapUser> users;
- if(StringUtils.isNotBlank(groupName)) {
- users = _ldapManager.getUsersInGroup(groupName);
- } else {
- users = _ldapManager.getUsers();
- }
- for (LdapUser user : users) {
- Domain domain = getDomain(user);
- _accountService.createUserAccount(user.getUsername(), generatePassword(), user.getFirstname(), user.getLastname(), user.getEmail(), timezone, user.getUsername(),
- accountType, domain.getId(), domain.getNetworkDomain(), details, UUID.randomUUID().toString(), UUID.randomUUID().toString());
- }
- ldapResponses = createLdapUserResponse(users);
- } catch (final NoLdapUserMatchingQueryException ex) {
- ldapResponses = new ArrayList<LdapUserResponse>();
- } finally {
- response.setResponses(ldapResponses);
- response.setResponseName(getCommandName());
- setResponseObject(response);
- }
+ NetworkRuleConflictException {
+
+ List<LdapUser> users;
+ try {
+ if (StringUtils.isNotBlank(groupName)) {
+ users = _ldapManager.getUsersInGroup(groupName);
+ } else {
+ users = _ldapManager.getUsers();
+ }
+ } catch (NoLdapUserMatchingQueryException ex) {
+ users = new ArrayList<LdapUser>();
+ s_logger.info("No Ldap user matching query. "+" ::: "+ex.getMessage());
+ }
+
+ List<LdapUser> addedUsers = new ArrayList<LdapUser>();
+ for (LdapUser user : users) {
+ Domain domain = getDomain(user);
+ try {
+ _accountService.createUserAccount(user.getUsername(), generatePassword(), user.getFirstname(), user.getLastname(), user.getEmail(), timezone, user.getUsername(),
+ accountType, domain.getId(), domain.getNetworkDomain(), details, UUID.randomUUID().toString(), UUID.randomUUID().toString());
+ addedUsers.add(user);
+ } catch (InvalidParameterValueException ex) {
+ s_logger.error("Failed to create user with username: " + user.getUsername() +" ::: "+ex.getMessage());
+ }
+ }
+ ListResponse<LdapUserResponse> response = new ListResponse<LdapUserResponse>();
+ response.setResponses(createLdapUserResponse(addedUsers));
+ response.setResponseName(getCommandName());
+ setResponseObject(response);
+ }
+
+ private Domain getDomainForName(String name) {
+ Domain domain = null;
+ if (StringUtils.isNotBlank(name)) {
+ //removing all the special characters and trimming its length to 190 to make the domain valid.
+ String domainName = StringUtils.substring(name.replaceAll("\\W", ""), 0, 190);
+ if (StringUtils.isNotBlank(domainName)) {
+ domain = _domainService.getDomainByName(domainName, Domain.ROOT_DOMAIN);
+ if (domain == null) {
+ domain = _domainService.createDomain(domainName, Domain.ROOT_DOMAIN, domainName, UUID.randomUUID().toString());
+ }
+ }
+ }
+ return domain;
}
private Domain getDomain(LdapUser user) {
- String csDomainName = null;
- if (StringUtils.isNotBlank(domainName)) {
- csDomainName = domainName;
- } else {
- if (StringUtils.isNotBlank(groupName)) {
- csDomainName = groupName;
- } else if (StringUtils.isNotBlank(user.getDomain())) {
- csDomainName = user.getDomain();
- }
- //removing all the special characters and trimming it length 190 to make the domain valid.
- csDomainName = StringUtils.substring(csDomainName.replaceAll("\\W",""),0,190);
- }
- Domain domain;
- if (StringUtils.isNotBlank(csDomainName)) {
- domain = _domainService.getDomainByName(csDomainName, Domain.ROOT_DOMAIN);
-
- if (domain == null) {
- domain = _domainService.createDomain(csDomainName, Domain.ROOT_DOMAIN, csDomainName, UUID.randomUUID().toString());
- }
- } else {
- domain = _domainService.getDomain(Domain.ROOT_DOMAIN);
- }
-
- return domain;
+ Domain domain;
+ if (_domain != null) {
+ //this means either domain id or groupname is passed and this will be same for all the users in this call. hence returning it.
+ domain = _domain;
+ } else {
+ if (domainId != null) {
+ // a domain Id is passed. use it for this user and all the users in the same api call (by setting _domain)
+ domain = _domain = _domainService.getDomain(domainId);
+ } else {
+ // a group name is passed. use it for this user and all the users in the same api call(by setting _domain)
+ domain = _domain = getDomainForName(groupName);
+ if (domain == null) {
+ //use the domain from the LDAP for this user
+ domain = getDomainForName(user.getDomain());
+ }
+ }
+ if (domain == null) {
+ // could not get a domain using domainId / LDAP group / OU of LDAP user. using ROOT domain for this user
+ domain = _domainService.getDomain(Domain.ROOT_DOMAIN);
+ }
+ }
+ return domain;
}
private List<LdapUserResponse> createLdapUserResponse(List<LdapUser> users) {
- final List<LdapUserResponse> ldapResponses = new ArrayList<LdapUserResponse>();
- for (final LdapUser user : users) {
- final LdapUserResponse ldapResponse = _ldapManager.createLdapUserResponse(user);
- ldapResponse.setObjectName("LdapUser");
- ldapResponses.add(ldapResponse);
- }
- return ldapResponses;
+ final List<LdapUserResponse> ldapResponses = new ArrayList<LdapUserResponse>();
+ for (final LdapUser user : users) {
+ final LdapUserResponse ldapResponse = _ldapManager.createLdapUserResponse(user);
+ ldapResponse.setObjectName("LdapUser");
+ ldapResponses.add(ldapResponse);
+ }
+ return ldapResponses;
}
@Override
public String getCommandName() {
- return s_name;
+ return s_name;
}
private String generatePassword() throws ServerApiException {
- try {
- final SecureRandom randomGen = SecureRandom.getInstance("SHA1PRNG");
- final byte bytes[] = new byte[20];
- randomGen.nextBytes(bytes);
- return Base64.encode(bytes).toString();
- } catch (final NoSuchAlgorithmException e) {
- throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to generate random password");
- }
+ try {
+ final SecureRandom randomGen = SecureRandom.getInstance("SHA1PRNG");
+ final byte bytes[] = new byte[20];
+ randomGen.nextBytes(bytes);
+ return Base64.encode(bytes).toString();
+ } catch (final NoSuchAlgorithmException e) {
+ throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to generate random password");
+ }
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/900bedbe/plugins/user-authenticators/ldap/test/groovy/org/apache/cloudstack/ldap/LdapImportUsersCmdSpec.groovy
----------------------------------------------------------------------
diff --git a/plugins/user-authenticators/ldap/test/groovy/org/apache/cloudstack/ldap/LdapImportUsersCmdSpec.groovy b/plugins/user-authenticators/ldap/test/groovy/org/apache/cloudstack/ldap/LdapImportUsersCmdSpec.groovy
index 0455640..a66da1f 100644
--- a/plugins/user-authenticators/ldap/test/groovy/org/apache/cloudstack/ldap/LdapImportUsersCmdSpec.groovy
+++ b/plugins/user-authenticators/ldap/test/groovy/org/apache/cloudstack/ldap/LdapImportUsersCmdSpec.groovy
@@ -20,8 +20,6 @@ import com.cloud.domain.Domain
import com.cloud.domain.DomainVO
import com.cloud.user.AccountService
import com.cloud.user.DomainService
-import com.cloud.user.UserAccount
-import com.cloud.user.UserAccountVO
import org.apache.cloudstack.api.command.LdapImportUsersCmd
import org.apache.cloudstack.api.response.LdapUserResponse
import org.apache.cloudstack.ldap.LdapManager
@@ -31,160 +29,167 @@ class LdapImportUsersCmdSpec extends spock.lang.Specification {
def "Test successful return of getCommandName"() {
- given: "We have an LdapManager, DomainService and a LdapImportUsersCmd"
- def ldapManager = Mock(LdapManager)
- def domainService = Mock(DomainService)
- def accountService = Mock(AccountService)
- def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
- when: "Get command name is called"
- String commandName = ldapImportUsersCmd.getCommandName()
- then: "ldapuserresponse is returned"
- commandName == "ldapuserresponse"
+ given: "We have an LdapManager, DomainService and a LdapImportUsersCmd"
+ def ldapManager = Mock(LdapManager)
+ def domainService = Mock(DomainService)
+ def accountService = Mock(AccountService)
+ def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
+ when: "Get command name is called"
+ String commandName = ldapImportUsersCmd.getCommandName()
+ then: "ldapuserresponse is returned"
+ commandName == "ldapuserresponse"
}
def "Test successful response from execute"() {
- given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
- def ldapManager = Mock(LdapManager)
- def domainService = Mock(DomainService)
- def accountService = Mock(AccountService)
-
- List<LdapUser> users = new ArrayList()
- users.add(new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering"))
- users.add(new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering"))
- ldapManager.getUsers() >> users
- LdapUserResponse response1 = new LdapUserResponse("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
- LdapUserResponse response2 = new LdapUserResponse("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering")
- ldapManager.createLdapUserResponse(_) >>>[response1, response2]
-
-
- Domain domain = new DomainVO("engineering", 1L, 1L, "engineering", UUID.randomUUID().toString())
- domainService.getDomainByName("engineering", 1L) >>> [null, domain]
- 1 * domainService.createDomain("engineering", 1L, "engineering", _) >> domain
-
- def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
- ldapImportUsersCmd.accountType = 2;
-
- when: "LdapListUsersCmd is executed"
- ldapImportUsersCmd.execute()
- then: "a list of size 2 is returned"
- ldapImportUsersCmd.responseObject.getResponses().size() == 2
+ given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
+ def ldapManager = Mock(LdapManager)
+ def domainService = Mock(DomainService)
+ def accountService = Mock(AccountService)
+
+ List<LdapUser> users = new ArrayList()
+ users.add(new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering"))
+ users.add(new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering"))
+ ldapManager.getUsers() >> users
+ LdapUserResponse response1 = new LdapUserResponse("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
+ LdapUserResponse response2 = new LdapUserResponse("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering")
+ ldapManager.createLdapUserResponse(_) >>> [response1, response2]
+
+
+ Domain domain = new DomainVO("engineering", 1L, 1L, "engineering", UUID.randomUUID().toString())
+ 2 * domainService.getDomainByName("engineering", 1L) >>> [null, domain]
+ 1 * domainService.createDomain("engineering", 1L, "engineering", _) >> domain
+
+ def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
+ ldapImportUsersCmd.accountType = 2;
+
+ when: "LdapListUsersCmd is executed"
+ ldapImportUsersCmd.execute()
+ then: "a list of size 2 is returned"
+ ldapImportUsersCmd.responseObject.getResponses().size() == 2
}
def "Test successful response from execute with group specified"() {
- given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
- def ldapManager = Mock(LdapManager)
- def domainService = Mock(DomainService)
- def accountService = Mock(AccountService)
-
- List<LdapUser> users = new ArrayList()
- users.add(new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering"))
- users.add(new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering"))
- ldapManager.getUsersInGroup("TestGroup") >> users
- LdapUserResponse response1 = new LdapUserResponse("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
- LdapUserResponse response2 = new LdapUserResponse("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering")
- ldapManager.createLdapUserResponse(_) >>>[response1, response2]
-
-
- Domain domain = new DomainVO("TestGroup", 1L, 1L, "TestGroup", UUID.randomUUID().toString())
- domainService.getDomainByName("TestGroup", 1L) >>> [null, domain]
- 1 * domainService.createDomain("TestGroup", 1L, "TestGroup", _) >> domain
-
- def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
- ldapImportUsersCmd.accountType = 2;
- ldapImportUsersCmd.groupName = "TestGroup";
-
- when: "LdapListUsersCmd is executed"
- ldapImportUsersCmd.execute()
- then: "a list of size 2 is returned"
- ldapImportUsersCmd.responseObject.getResponses().size() == 2
+ given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
+ def ldapManager = Mock(LdapManager)
+ def domainService = Mock(DomainService)
+ def accountService = Mock(AccountService)
+
+ List<LdapUser> users = new ArrayList()
+ users.add(new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering"))
+ users.add(new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering"))
+ ldapManager.getUsersInGroup("TestGroup") >> users
+ LdapUserResponse response1 = new LdapUserResponse("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
+ LdapUserResponse response2 = new LdapUserResponse("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering")
+ ldapManager.createLdapUserResponse(_) >>> [response1, response2]
+
+
+ Domain domain = new DomainVO("TestGroup", 1L, 1L, "TestGroup", UUID.randomUUID().toString())
+ 1 * domainService.getDomainByName("TestGroup", 1L) >>> null
+ 1 * domainService.createDomain("TestGroup", 1L, "TestGroup", _) >> domain
+
+ def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
+ ldapImportUsersCmd.accountType = 2;
+ ldapImportUsersCmd.groupName = "TestGroup";
+
+ when: "LdapListUsersCmd is executed"
+ ldapImportUsersCmd.execute()
+ then: "a list of size 2 is returned"
+ ldapImportUsersCmd.responseObject.getResponses().size() == 2
}
def "Test successful response from execute with group and domain specified"() {
- given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
- def ldapManager = Mock(LdapManager)
- def domainService = Mock(DomainService)
- def accountService = Mock(AccountService)
-
- List<LdapUser> users = new ArrayList()
- users.add(new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering"))
- users.add(new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering"))
- ldapManager.getUsersInGroup("TestGroup") >> users
- LdapUserResponse response1 = new LdapUserResponse("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
- LdapUserResponse response2 = new LdapUserResponse("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering")
- ldapManager.createLdapUserResponse(_) >>>[response1, response2]
-
-
- Domain domain = new DomainVO("TestDomain", 1L, 1L, "TestDomain", UUID.randomUUID().toString())
- domainService.getDomainByName("TestDomain", 1L) >>> [null, domain]
- 1 * domainService.createDomain("TestDomain", 1L, "TestDomain", _) >> domain
-
- def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
- ldapImportUsersCmd.accountType = 2;
- ldapImportUsersCmd.groupName = "TestGroup";
- ldapImportUsersCmd.domainName = "TestDomain";
-
- when: "LdapListUsersCmd is executed"
- ldapImportUsersCmd.execute()
- then: "a list of size 2 is returned"
- ldapImportUsersCmd.responseObject.getResponses().size() == 2
+ given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
+ def ldapManager = Mock(LdapManager)
+ def domainService = Mock(DomainService)
+ def accountService = Mock(AccountService)
+
+ List<LdapUser> users = new ArrayList()
+ users.add(new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering"))
+ users.add(new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering"))
+ ldapManager.getUsersInGroup("TestGroup") >> users
+ LdapUserResponse response1 = new LdapUserResponse("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
+ LdapUserResponse response2 = new LdapUserResponse("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering")
+ ldapManager.createLdapUserResponse(_) >>> [response1, response2]
+
+
+ Domain domain = new DomainVO("TestDomain", 1L, 1L, "TestDomain", UUID.randomUUID().toString())
+ 1 * domainService.getDomain(1L) >> domain;
+
+ def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
+ ldapImportUsersCmd.accountType = 2;
+ ldapImportUsersCmd.groupName = "TestGroup";
+ ldapImportUsersCmd.domainId = 1L;
+
+ when: "LdapListUsersCmd is executed"
+ ldapImportUsersCmd.execute()
+ then: "a list of size 2 is returned"
+ ldapImportUsersCmd.responseObject.getResponses().size() == 2
}
def "Test successful response from execute with domain specified"() {
- given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
- def ldapManager = Mock(LdapManager)
- def domainService = Mock(DomainService)
- def accountService = Mock(AccountService)
-
- List<LdapUser> users = new ArrayList()
- users.add(new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering"))
- users.add(new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering"))
- ldapManager.getUsers() >> users
- LdapUserResponse response1 = new LdapUserResponse("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
- LdapUserResponse response2 = new LdapUserResponse("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering")
- ldapManager.createLdapUserResponse(_) >>>[response1, response2]
-
-
- Domain domain = new DomainVO("TestDomain", 1L, 1L, "TestDomain", UUID.randomUUID().toString())
- domainService.getDomainByName("TestDomain", 1L) >>> [null, domain]
- 1 * domainService.createDomain("TestDomain", 1L, "TestDomain", _) >> domain
-
- def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
- ldapImportUsersCmd.accountType = 2;
- ldapImportUsersCmd.domainName = "TestDomain";
-
- when: "LdapListUsersCmd is executed"
- ldapImportUsersCmd.execute()
- then: "a list of size 2 is returned"
- ldapImportUsersCmd.responseObject.getResponses().size() == 2
+ given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
+ def ldapManager = Mock(LdapManager)
+ def domainService = Mock(DomainService)
+ def accountService = Mock(AccountService)
+
+ List<LdapUser> users = new ArrayList()
+ users.add(new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering"))
+ users.add(new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering"))
+ ldapManager.getUsers() >> users
+ LdapUserResponse response1 = new LdapUserResponse("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
+ LdapUserResponse response2 = new LdapUserResponse("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering")
+ ldapManager.createLdapUserResponse(_) >>> [response1, response2]
+
+
+ Domain domain = new DomainVO("TestDomain", 1L, 1L, "TestDomain", UUID.randomUUID().toString())
+ 1 * domainService.getDomain(1L) >> domain;
+
+ def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
+ ldapImportUsersCmd.accountType = 2;
+ ldapImportUsersCmd.domainId = 1L;
+
+ when: "LdapListUsersCmd is executed"
+ ldapImportUsersCmd.execute()
+ then: "a list of size 2 is returned"
+ ldapImportUsersCmd.responseObject.getResponses().size() == 2
}
- def "Test getDomain with no domain or group name specified specified"() {
- given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
- def ldapManager = Mock(LdapManager)
- def domainService = Mock(DomainService)
- def accountService = Mock(AccountService)
- def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
- ldapImportUsersCmd.domainName = varDomainName
- ldapImportUsersCmd.groupName = varGroupName
-
- def ldapUser1 = new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
- def ldapUser2 = new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering");
-
- Domain domain = new DomainVO(expectedDomainName, 1L, 1L, expectedDomainName, UUID.randomUUID().toString())
- 2 * domainService.getDomainByName(expectedDomainName, 1L) >>> [null, domain]
- 1 * domainService.createDomain(expectedDomainName, 1L, expectedDomainName, _) >> domain
-
- def result1 = ldapImportUsersCmd.getDomain(ldapUser1)
- def result2 = ldapImportUsersCmd.getDomain(ldapUser2)
- expect: "engineering domain is returned"
- result1 == domain
- result2 == domain
- where: "The domain and group are set to the following values"
- varDomainName | varGroupName | expectedDomainName
- null | null | "engineering"
- "TestDomain" | null | "TestDomain"
- "TestDomain" | "TestGroup" | "TestDomain"
- null | "TestGroup" | "TestGroup"
+ def "Test getDomain"() {
+ given: "We have an LdapManager, DomainService, two users and a LdapImportUsersCmd"
+ def ldapManager = Mock(LdapManager)
+ def domainService = Mock(DomainService)
+ def accountService = Mock(AccountService)
+ def ldapImportUsersCmd = new LdapImportUsersCmd(ldapManager, domainService, accountService)
+ ldapImportUsersCmd.domainId = varDomainId
+ ldapImportUsersCmd.groupName = varGroupName
+
+ def ldapUser1 = new LdapUser("rmurphy", "rmurphy@test.com", "Ryan", "Murphy", "cn=rmurphy,ou=engineering,dc=cloudstack,dc=org", "engineering")
+ def ldapUser2 = new LdapUser("bob", "bob@test.com", "Robert", "Young", "cn=bob,ou=engineering,dc=cloudstack,dc=org", "engineering");
+
+ Domain domain = new DomainVO(expectedDomainName, 1L, 1L, expectedDomainName, UUID.randomUUID().toString());
+ if (varDomainId != null) {
+ 1 * domainService.getDomain(varDomainId) >> domain;
+ } else {
+ if(varGroupName != null) {
+ 1 * domainService.getDomainByName(expectedDomainName, 1L) >> null
+ } else {
+ domainService.getDomainByName(expectedDomainName, 1L) >>> [null, domain]
+ }
+ 1 * domainService.createDomain(expectedDomainName, 1L, expectedDomainName, _) >> domain
+ }
+
+ def result1 = ldapImportUsersCmd.getDomain(ldapUser1)
+ def result2 = ldapImportUsersCmd.getDomain(ldapUser2)
+ expect: "engineering domain is returned"
+ result1 == domain
+ result2 == domain
+ where: "The domain and group are set to the following values"
+ varDomainId | varGroupName | expectedDomainName
+ null | null | "engineering"
+ 1L | null | "TestDomain"
+ 1L | "TestGroup" | "TestDomain"
+ null | "TestGroup" | "TestGroup"
+ null | "Test Group" | "TestGroup"
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/900bedbe/ui/dictionary.jsp
----------------------------------------------------------------------
diff --git a/ui/dictionary.jsp b/ui/dictionary.jsp
index 0ccfc23..f069588 100644
--- a/ui/dictionary.jsp
+++ b/ui/dictionary.jsp
@@ -1219,6 +1219,7 @@ dictionary = {
'label.zone.step.3.title': '<fmt:message key="label.zone.step.3.title" />',
'label.zone.step.4.title': '<fmt:message key="label.zone.step.4.title" />',
'label.zone.wide': '<fmt:message key="label.zone.wide" />',
+'label.ldap.group.name': '<fmt:message key="label.ldap.group.name" />',
'managed.state': '<fmt:message key="managed.state" />',
'message.acquire.new.ip': '<fmt:message key="message.acquire.new.ip" />',
'message.acquire.new.ip.vpc': '<fmt:message key="message.acquire.new.ip.vpc" />',
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/900bedbe/ui/scripts/accountsWizard.js
----------------------------------------------------------------------
diff --git a/ui/scripts/accountsWizard.js b/ui/scripts/accountsWizard.js
index 70ef082..e41f8c4 100644
--- a/ui/scripts/accountsWizard.js
+++ b/ui/scripts/accountsWizard.js
@@ -161,14 +161,23 @@
validation: {
required: false
}
+ },
+ ldapGroupName: {
+ label: 'label.ldap.group.name',
+ docID: 'helpLdapGroupName',
+ validation: {
+ required: false
+ }
}
+
},
action: function(args) {
var array1 = [];
var ldapStatus = isLdapEnabled();
- console.log("creating user: " + args.username);
- array1.push("&username=" + args.username);
+ if (args.username) {
+ array1.push("&username=" + args.username);
+ }
if (!ldapStatus) {
var password = args.data.password;
@@ -179,7 +188,7 @@
array1.push("&firstname=" + args.data.firstname);
array1.push("&lastname=" + args.data.lastname);
- var password = args.data.password;
+ password = args.data.password;
if (md5Hashed) {
password = $.md5(password);
}
@@ -207,25 +216,43 @@
if (args.data.networkdomain !== null && args.data.networkdomain.length > 0) {
array1.push("&networkdomain=" + args.data.networkdomain);
}
+ if (args.groupname && args.groupname !== null && args.groupname.length > 0) {
+ array1.push("&group=" + args.groupname);
+ }
if (ldapStatus) {
- console.log("doing an ldap add");
- $.ajax({
- url: createURL('ldapCreateAccount' + array1.join("")),
- dataType: "json",
- async: false,
- success: function(json) {
- var item = json.createaccountresponse.account;
- args.response.success({
- data: item
- });
- },
- error: function(XMLHttpResponse) {
- args.response.error(parseXMLHttpResponse(XMLHttpResponse));
- }
- });
+ if (args.groupname) {
+ $.ajax({
+ url: createURL('importLdapUsers' + array1.join("")),
+ dataType: "json",
+ async: false,
+ success: function(json) {
+ var count = json.ldapuserresponse.count;
+ args.response.success({
+ data: count
+ });
+ },
+ error: function(XMLHttpResponse) {
+ args.response.error(parseXMLHttpResponse(XMLHttpResponse));
+ }
+ });
+ } else if (args.username) {
+ $.ajax({
+ url: createURL('ldapCreateAccount' + array1.join("")),
+ dataType: "json",
+ async: false,
+ success: function(json) {
+ var item = json.createaccountresponse.account;
+ args.response.success({
+ data: item
+ });
+ },
+ error: function(XMLHttpResponse) {
+ args.response.error(parseXMLHttpResponse(XMLHttpResponse));
+ }
+ });
+ }
} else {
- console.log("doing normal user add");
$.ajax({
url: createURL('createAccount' + array1.join("")),
dataType: "json",
@@ -285,4 +312,4 @@
}
*/
};
-}(cloudStack, jQuery));
+}(cloudStack, jQuery));
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/900bedbe/ui/scripts/docs.js
----------------------------------------------------------------------
diff --git a/ui/scripts/docs.js b/ui/scripts/docs.js
index a3151b1..2e451fd 100755
--- a/ui/scripts/docs.js
+++ b/ui/scripts/docs.js
@@ -1196,5 +1196,9 @@ cloudStack.docs = {
helpUploadVolumeChecksum: {
desc: 'Use the hash that you created at the start of the volume upload procedure',
externalLink: ''
+ },
+ helpLdapGroupName: {
+ desc: 'The group name from which you want to import LDAP users',
+ externalLink: ''
}
};
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/900bedbe/ui/scripts/ui-custom/accountsWizard.js
----------------------------------------------------------------------
diff --git a/ui/scripts/ui-custom/accountsWizard.js b/ui/scripts/ui-custom/accountsWizard.js
index 358e29c..f341711 100644
--- a/ui/scripts/ui-custom/accountsWizard.js
+++ b/ui/scripts/ui-custom/accountsWizard.js
@@ -33,16 +33,47 @@
var completeAction = function() {
var data = cloudStack.serializeForm($form);
- var username = data.username;
- var bulkAdd = (username instanceof Array);
- if (bulkAdd) {
- console.log("doing bulk add");
- for (var i = 0; i < username.length; i++) {
- console.log("creating user " + username[i]);
+ var groupname = $.trim(data.ldapGroupName);
+ if (groupname) {
+ args.action({
+ context: context,
+ data: data,
+ groupname: groupname,
+ response: {
+ error: function(message) {
+ if (message) {
+ cloudStack.dialog.notice({
+ message: message
+ });
+ }
+ }
+ }
+ });
+ } else {
+ var username = data.username;
+ var bulkAdd = (username instanceof Array);
+ if (bulkAdd) {
+ for (var i = 0; i < username.length; i++) {
+ args.action({
+ context: context,
+ data: data,
+ username: username[i],
+ response: {
+ error: function(message) {
+ if (message) {
+ cloudStack.dialog.notice({
+ message: message
+ });
+ }
+ }
+ }
+ });
+ }
+ } else {
args.action({
context: context,
data: data,
- username: username[i],
+ username: username,
response: {
error: function(message) {
if (message) {
@@ -54,21 +85,6 @@
}
});
}
- } else {
- args.action({
- context: context,
- data: data,
- username: username,
- response: {
- error: function(message) {
- if (message) {
- cloudStack.dialog.notice({
- message: message
- });
- }
- }
- }
- });
}
};
@@ -92,25 +108,38 @@
if (ldapStatus) {
var $table = $wizard.find('.ldap-account-choice tbody');
+ $("#label_ldap_group_name").live("keypress", function(event) {
+ if ($table.find("#tr-groupname-message").length === 0) {
+ $("<tr id='tr-groupname-message'>").appendTo($table).append("<td colspan=\"4\">All The users from the given group name will be imported</td>");
+ }
+ $table.find("tr").hide();
+ $table.find("#tr-groupname-message").show();
+ });
+ $("#label_ldap_group_name").live("blur", function(event) {
+ if (!$(this).val()) {
+ $table.find("tr").show();
+ $table.find("#tr-groupname-message").hide();
+ }
+ });
$.ajax({
- url: createURL("listLdapUsers&listtype=new"),
+ url: createURL("listLdapUsers&listtype=new"),
dataType: "json",
async: false,
success: function(json) {
- if (json.ldapuserresponse.count > 0) {
- $(json.ldapuserresponse.LdapUser).each(function() {
- var result = $("<tr>");
- result.append("<td><input type=\"checkbox\" class=\"required\" name=\"username\" value=\"" + this.username + "\"></td>");
- result.append("<td>" + this.firstname + " " + this.lastname + "</td>");
- result.append("<td>" + this.username + "</td>");
- result.append("<td>" + this.email + "</td>");
- $table.append(result);
- });
- } else {
+ if (json.ldapuserresponse.count > 0) {
+ $(json.ldapuserresponse.LdapUser).each(function() {
+ var result = $("<tr>");
+ result.append("<td><input type=\"checkbox\" name=\"username\" value=\"" + this.username + "\"></td>");
+ result.append("<td>" + this.firstname + " " + this.lastname + "</td>");
+ result.append("<td>" + this.username + "</td>");
+ result.append("<td>" + this.email + "</td>");
+ $table.append(result);
+ });
+ } else {
var result = $("<tr>");
- result.append("<td colspan=\"4\">No data to show</td>");
+ result.append("<td colspan=\"4\">No data to show</td>");
$table.append(result);
- }
+ }
}
});
} else {
@@ -123,7 +152,6 @@
}
});
- //console.log(informationWithinLdap.$formContainer);
var informationWithinLdapForm = informationWithinLdap.$formContainer.find('form .form-item');
informationWithinLdapForm.find('.value #label_username').addClass('required');
informationWithinLdapForm.find('.value #password').addClass('required');
@@ -137,6 +165,10 @@
$wizard.removeClass('multi-wizard');
}
+ if (!ldapStatus) {
+ delete args.informationNotInLdap.ldapGroupName;
+ }
+
var informationNotInLdap = cloudStack.dialog.createForm({
context: context,
noDialog: true,
@@ -166,4 +198,4 @@
accountsWizard(args);
};
};
-})(jQuery, cloudStack);
+})(jQuery, cloudStack);
\ No newline at end of file