http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/api/ApiResponseHelper.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/api/ApiResponseHelper.java index 6b84ac0,1965f33..cae27bd --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@@ -29,87 -29,111 +29,186 @@@ import java.util.Map import java.util.Set; import java.util.StringTokenizer; + import org.apache.cloudstack.api.BaseCmd; + import org.apache.cloudstack.api.ResponseGenerator; import org.apache.log4j.Logger; - import com.cloud.acl.ControlledEntity; - import com.cloud.acl.ControlledEntity.ACLType; - import com.cloud.api.ApiConstants.HostDetails; - import com.cloud.api.ApiConstants.VMDetails; - import com.cloud.api.commands.QueryAsyncJobResultCmd; - import com.cloud.api.response.AccountResponse; + import org.apache.cloudstack.acl.ControlledEntity; + import org.apache.cloudstack.acl.ControlledEntity.ACLType; + import org.apache.cloudstack.api.ApiConstants.HostDetails; + import org.apache.cloudstack.api.ApiConstants.VMDetails; + import org.apache.cloudstack.api.command.user.job.QueryAsyncJobResultCmd; + import org.apache.cloudstack.api.response.AccountResponse; + + import com.cloud.api.query.ViewResponseHelper; + import com.cloud.api.query.vo.AccountJoinVO; + import com.cloud.api.query.vo.AsyncJobJoinVO; + import com.cloud.api.query.vo.ControlledViewEntity; + import com.cloud.api.query.vo.DiskOfferingJoinVO; + import com.cloud.api.query.vo.DomainRouterJoinVO; + import com.cloud.api.query.vo.EventJoinVO; + import com.cloud.api.query.vo.HostJoinVO; + import com.cloud.api.query.vo.InstanceGroupJoinVO; + import com.cloud.api.query.vo.ProjectAccountJoinVO; + import com.cloud.api.query.vo.ProjectInvitationJoinVO; + import com.cloud.api.query.vo.ProjectJoinVO; + import com.cloud.api.query.vo.ResourceTagJoinVO; + import com.cloud.api.query.vo.SecurityGroupJoinVO; + import com.cloud.api.query.vo.ServiceOfferingJoinVO; + import com.cloud.api.query.vo.StoragePoolJoinVO; + import com.cloud.api.query.vo.UserAccountJoinVO; + import com.cloud.api.query.vo.UserVmJoinVO; + import com.cloud.api.query.vo.VolumeJoinVO; import com.cloud.api.response.ApiResponseSerializer; ++<<<<<<< HEAD +import com.cloud.api.response.AsyncJobResponse; +import com.cloud.api.response.CapabilityResponse; +import com.cloud.api.response.CapacityResponse; +import com.cloud.api.response.ClusterResponse; +import com.cloud.api.response.ConfigurationResponse; +import com.cloud.api.response.ControlledEntityResponse; +import com.cloud.api.response.CreateCmdResponse; +import com.cloud.api.response.DiskOfferingResponse; +import com.cloud.api.response.DomainResponse; +import com.cloud.api.response.DomainRouterResponse; +import com.cloud.api.response.EventResponse; +import com.cloud.api.response.ExtractResponse; +import com.cloud.api.response.FindAccountResponse; +import com.cloud.api.response.FindDomainResponse; +import com.cloud.api.response.FindUserResponse; +import com.cloud.api.response.FirewallResponse; +import com.cloud.api.response.FirewallRuleResponse; +import com.cloud.api.response.HostResponse; +import com.cloud.api.response.HypervisorCapabilitiesResponse; +import com.cloud.api.response.IPAddressResponse; +import com.cloud.api.response.InstanceGroupResponse; +import com.cloud.api.response.IpForwardingRuleResponse; +import com.cloud.api.response.LBStickinessPolicyResponse; +import com.cloud.api.response.LBStickinessResponse; +import com.cloud.api.response.LDAPConfigResponse; +import com.cloud.api.response.ListResponse; +import com.cloud.api.response.LoadBalancerResponse; +import com.cloud.api.response.NetworkACLResponse; +import com.cloud.api.response.NetworkOfferingResponse; +import com.cloud.api.response.NetworkResponse; +import com.cloud.api.response.NicResponse; +import com.cloud.api.response.PhysicalNetworkResponse; +import com.cloud.api.response.PodResponse; +import com.cloud.api.response.PrivateGatewayResponse; +import com.cloud.api.response.ProjectAccountResponse; +import com.cloud.api.response.ProjectInvitationResponse; +import com.cloud.api.response.ProjectResponse; +import com.cloud.api.response.ProviderResponse; +import com.cloud.api.response.RegionResponse; +import com.cloud.api.response.RemoteAccessVpnResponse; +import com.cloud.api.response.ResourceCountResponse; +import com.cloud.api.response.ResourceLimitResponse; +import com.cloud.api.response.ResourceTagResponse; +import com.cloud.api.response.SecurityGroupResponse; +import com.cloud.api.response.SecurityGroupResultObject; +import com.cloud.api.response.SecurityGroupRuleResponse; +import com.cloud.api.response.SecurityGroupRuleResultObject; +import com.cloud.api.response.ServiceOfferingResponse; +import com.cloud.api.response.ServiceResponse; +import com.cloud.api.response.Site2SiteCustomerGatewayResponse; +import com.cloud.api.response.Site2SiteVpnConnectionResponse; +import com.cloud.api.response.Site2SiteVpnGatewayResponse; +import com.cloud.api.response.SnapshotPolicyResponse; +import com.cloud.api.response.SnapshotResponse; +import com.cloud.api.response.StaticRouteResponse; +import com.cloud.api.response.StorageNetworkIpRangeResponse; +import com.cloud.api.response.StoragePoolResponse; +import com.cloud.api.response.SwiftResponse; +import com.cloud.api.response.SystemVmInstanceResponse; +import com.cloud.api.response.SystemVmResponse; +import com.cloud.api.response.TemplatePermissionsResponse; +import com.cloud.api.response.TemplateResponse; +import com.cloud.api.response.TrafficTypeResponse; +import com.cloud.api.response.UserResponse; +import com.cloud.api.response.UserVmResponse; +import com.cloud.api.response.VirtualRouterProviderResponse; +import com.cloud.api.response.VlanIpRangeResponse; +import com.cloud.api.response.VolumeResponse; +import com.cloud.api.response.VpcOfferingResponse; +import com.cloud.api.response.VpcResponse; +import com.cloud.api.response.VpnUsersResponse; +import com.cloud.api.response.ZoneResponse; ++======= + import org.apache.cloudstack.api.response.AsyncJobResponse; + import org.apache.cloudstack.api.response.AutoScalePolicyResponse; + import org.apache.cloudstack.api.response.AutoScaleVmGroupResponse; + import org.apache.cloudstack.api.response.AutoScaleVmProfileResponse; + import org.apache.cloudstack.api.response.CapabilityResponse; + import org.apache.cloudstack.api.response.CapacityResponse; + import org.apache.cloudstack.api.response.ClusterResponse; + import org.apache.cloudstack.api.response.ConditionResponse; + import org.apache.cloudstack.api.response.ConfigurationResponse; + import org.apache.cloudstack.api.response.ControlledEntityResponse; + import org.apache.cloudstack.api.response.CounterResponse; + import org.apache.cloudstack.api.response.CreateCmdResponse; + import org.apache.cloudstack.api.response.DiskOfferingResponse; + import org.apache.cloudstack.api.response.DomainResponse; + import org.apache.cloudstack.api.response.DomainRouterResponse; + import org.apache.cloudstack.api.response.EventResponse; + import org.apache.cloudstack.api.response.ExtractResponse; + import org.apache.cloudstack.api.response.FirewallResponse; + import org.apache.cloudstack.api.response.FirewallRuleResponse; + import org.apache.cloudstack.api.response.GuestOSResponse; + import org.apache.cloudstack.api.response.HostResponse; + import org.apache.cloudstack.api.response.HypervisorCapabilitiesResponse; + import org.apache.cloudstack.api.response.ControlledViewEntityResponse; + import org.apache.cloudstack.api.response.IPAddressResponse; + import org.apache.cloudstack.api.response.InstanceGroupResponse; + import org.apache.cloudstack.api.response.IpForwardingRuleResponse; + import org.apache.cloudstack.api.response.LBStickinessPolicyResponse; + import org.apache.cloudstack.api.response.LBStickinessResponse; + import org.apache.cloudstack.api.response.LDAPConfigResponse; + import org.apache.cloudstack.api.response.LoadBalancerResponse; + import org.apache.cloudstack.api.response.NetworkACLResponse; + import org.apache.cloudstack.api.response.NetworkOfferingResponse; + import org.apache.cloudstack.api.response.NetworkResponse; + import org.apache.cloudstack.api.response.PhysicalNetworkResponse; + import org.apache.cloudstack.api.response.PodResponse; + import org.apache.cloudstack.api.response.PrivateGatewayResponse; + import org.apache.cloudstack.api.response.ProjectAccountResponse; + import org.apache.cloudstack.api.response.ProjectInvitationResponse; + import org.apache.cloudstack.api.response.ProjectResponse; + import org.apache.cloudstack.api.response.ProviderResponse; + import org.apache.cloudstack.api.response.RemoteAccessVpnResponse; + import org.apache.cloudstack.api.response.ResourceCountResponse; + import org.apache.cloudstack.api.response.ResourceLimitResponse; + import org.apache.cloudstack.api.response.ResourceTagResponse; + import org.apache.cloudstack.api.response.SecurityGroupResponse; + import org.apache.cloudstack.api.response.SecurityGroupRuleResponse; + import org.apache.cloudstack.api.response.ServiceOfferingResponse; + import org.apache.cloudstack.api.response.ServiceResponse; + import org.apache.cloudstack.api.response.Site2SiteCustomerGatewayResponse; + import org.apache.cloudstack.api.response.Site2SiteVpnConnectionResponse; + import org.apache.cloudstack.api.response.Site2SiteVpnGatewayResponse; + import org.apache.cloudstack.api.response.SnapshotPolicyResponse; + import org.apache.cloudstack.api.response.SnapshotResponse; + import org.apache.cloudstack.api.response.SnapshotScheduleResponse; + import org.apache.cloudstack.api.response.StaticRouteResponse; + import org.apache.cloudstack.api.response.StorageNetworkIpRangeResponse; + import org.apache.cloudstack.api.response.StoragePoolResponse; + import org.apache.cloudstack.api.response.SwiftResponse; + import org.apache.cloudstack.api.response.SystemVmInstanceResponse; + import org.apache.cloudstack.api.response.SystemVmResponse; + import org.apache.cloudstack.api.response.TemplatePermissionsResponse; + import org.apache.cloudstack.api.response.TemplateResponse; + import org.apache.cloudstack.api.response.TrafficTypeResponse; + import org.apache.cloudstack.api.response.UserResponse; + import org.apache.cloudstack.api.response.UserVmResponse; + import org.apache.cloudstack.api.response.VirtualRouterProviderResponse; + import org.apache.cloudstack.api.response.VlanIpRangeResponse; + import org.apache.cloudstack.api.response.VolumeResponse; + import org.apache.cloudstack.api.response.VpcOfferingResponse; + import org.apache.cloudstack.api.response.VpcResponse; + import org.apache.cloudstack.api.response.VpnUsersResponse; + import org.apache.cloudstack.api.response.ZoneResponse; + + import org.apache.cloudstack.api.response.S3Response; ++>>>>>>> master import com.cloud.async.AsyncJob; import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityVO; @@@ -200,10 -226,9 +302,10 @@@ import com.cloud.storage.VMTemplateVO import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; import com.cloud.storage.snapshot.SnapshotPolicy; + import com.cloud.storage.snapshot.SnapshotSchedule; import com.cloud.template.VirtualMachineTemplate; - import com.cloud.test.PodZoneConfig; import com.cloud.user.Account; +import com.cloud.user.AccountVO; import com.cloud.user.User; import com.cloud.user.UserAccount; import com.cloud.user.UserContext; @@@ -3654,21 -2751,6 +2828,24 @@@ public class ApiResponseHelper implemen response.setObjectName("storagenetworkiprange"); return response; } ++<<<<<<< HEAD + + @Override + public Long getIdentiyId(String tableName, String token) { + return ApiDispatcher.getIdentiyId(tableName, token); + } + + @Override + public RegionResponse createRegionResponse(Region region) { + RegionResponse response = new RegionResponse(); + response.setId(region.getId()); + response.setName(region.getName()); + response.setEndPoint(region.getEndPoint()); + response.setObjectName("region"); + return response; + } ++======= ++>>>>>>> master @Override public ResourceTagResponse createResourceTagResponse(ResourceTag resourceTag, boolean keyValueOnly) { @@@ -3931,55 -3130,46 +3225,100 @@@ response.setObjectName("vpnconnection"); return response; } ++<<<<<<< HEAD + + @Override + public FindUserResponse createFindUserResponse(User user) { + FindUserResponse userResponse = new FindUserResponse(); + userResponse.setId(user.getId()); + userResponse.setUsername(user.getUsername()); + userResponse.setPassword(user.getPassword()); + userResponse.setFirstname(user.getFirstname()); + userResponse.setLastname(user.getLastname()); + userResponse.setAccountId(user.getAccountId()); + userResponse.setEmail(user.getEmail()); + userResponse.setState(user.getState().toString()); + userResponse.setApiKey(user.getApiKey()); + userResponse.setSecretKey(user.getSecretKey()); + userResponse.setCreated(user.getCreated()); + userResponse.setTimezone(user.getTimezone()); + userResponse.setRegistrationToken(user.getRegistrationToken()); + userResponse.setRegistered(user.isRegistered()); + userResponse.setRegionId(user.getRegionId()); + userResponse.setObjectName("user"); + + return userResponse; + } + + @Override + public FindAccountResponse createFindAccountResponse(Account account) { + FindAccountResponse accountResponse = new FindAccountResponse(); + accountResponse.setId(account.getId()); + accountResponse.setName(account.getAccountName()); + accountResponse.setAccountType(account.getType()); + accountResponse.setDefaultZone(account.getDefaultZoneId()); + accountResponse.setDomainId(account.getDomainId()); + accountResponse.setRegionId(account.getRegionId()); + accountResponse.setState(account.getState().toString()); + accountResponse.setObjectName("account"); + return accountResponse; + } + + @Override + public FindDomainResponse createFindDomainResponse(Domain domain) { + FindDomainResponse domainResponse = new FindDomainResponse(); + domainResponse.setDomainName(domain.getName()); + domainResponse.setId(domain.getId()); + domainResponse.setLevel(domain.getLevel()); + domainResponse.setNetworkDomain(domain.getNetworkDomain()); + domainResponse.setParent(domain.getParent()); + domainResponse.setPath(domain.getPath()); + domainResponse.setObjectName("domain"); + domainResponse.setRegionId(domain.getRegionId()); + return domainResponse; + } ++======= + + + + @Override + public GuestOSResponse createGuestOSResponse(GuestOS guestOS) { + GuestOSResponse response = new GuestOSResponse(); + response.setDescription(guestOS.getDisplayName()); + response.setId(guestOS.getUuid()); + GuestOSCategoryVO category = ApiDBUtils.findGuestOsCategoryById(guestOS.getCategoryId()); + if ( category != null ){ + response.setOsCategoryId(category.getUuid()); + } + + response.setObjectName("ostype"); + return response; + } + + + + @Override + public SnapshotScheduleResponse createSnapshotScheduleResponse(SnapshotSchedule snapshotSchedule) { + SnapshotScheduleResponse response = new SnapshotScheduleResponse(); + response.setId(snapshotSchedule.getUuid()); + if (snapshotSchedule.getVolumeId() != null) { + Volume vol = ApiDBUtils.findVolumeById(snapshotSchedule.getVolumeId()); + if (vol != null) { + response.setVolumeId(vol.getUuid()); + } + } + if (snapshotSchedule.getPolicyId() != null) { + SnapshotPolicy policy = ApiDBUtils.findSnapshotPolicyById(snapshotSchedule.getPolicyId()); + if (policy != null) { + response.setSnapshotPolicyId(policy.getUuid()); + } + } + response.setScheduled(snapshotSchedule.getScheduledTimestamp()); + + response.setObjectName("snapshot"); + return response; + } + + ++>>>>>>> master }
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/api/ApiServer.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/api/ApiServer.java index 50c0125,ad2a12f..93089a1 --- a/server/src/com/cloud/api/ApiServer.java +++ b/server/src/com/cloud/api/ApiServer.java @@@ -94,10 -116,14 +116,15 @@@ import com.cloud.configuration.dao.Conf import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.event.EventUtils; + import com.cloud.exception.AccountLimitException; import com.cloud.exception.CloudAuthenticationException; + import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.PermissionDeniedException; +import com.cloud.region.RegionManager; + import com.cloud.exception.RequestLimitException; + import com.cloud.exception.ResourceAllocationException; + import com.cloud.exception.ResourceUnavailableException; import com.cloud.server.ManagementServer; import com.cloud.user.Account; import com.cloud.user.AccountManager; @@@ -121,31 -146,25 +147,27 @@@ public class ApiServer implements HttpR private static final Logger s_logger = Logger.getLogger(ApiServer.class.getName()); private static final Logger s_accessLogger = Logger.getLogger("apiserver." + ApiServer.class.getName()); - public static final short ADMIN_COMMAND = 1; - public static final short DOMAIN_ADMIN_COMMAND = 4; - public static final short RESOURCE_DOMAIN_ADMIN_COMMAND = 2; - public static final short USER_COMMAND = 8; public static boolean encodeApiResponse = false; public static String jsonContentType = "text/javascript"; - private Properties _apiCommands = null; private ApiDispatcher _dispatcher; - private AccountManager _accountMgr = null; - private DomainManager _domainMgr = null; - private AsyncJobManager _asyncMgr = null; + + @Inject private AccountManager _accountMgr = null; + @Inject private DomainManager _domainMgr = null; + @Inject private AsyncJobManager _asyncMgr = null; + + @Inject(adapter = APILimitChecker.class) + protected Adapters<APILimitChecker> _apiLimitCheckers; + @Inject(adapter = APIChecker.class) + protected Adapters<APIChecker> _apiAccessCheckers; + private Account _systemAccount = null; private User _systemUser = null; + private RegionManager _regionMgr = null; + private static int _workerCount = 0; - private static ApiServer s_instance = null; - private static List<String> s_userCommands = null; - private static List<String> s_resellerCommands = null; // AKA domain-admin - private static List<String> s_adminCommands = null; - private static List<String> s_resourceDomainAdminCommands = null; - private static List<String> s_allCommands = null; - private static List<String> s_pluggableServiceCommands = null; private static final DateFormat _dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); + private static Map<String, Class<?>> _apiNameCmdClassMap = new HashMap<String, Class<?>>(); private static ExecutorService _executor = new ThreadPoolExecutor(10, 150, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory("ApiServer")); @@@ -270,17 -194,9 +197,11 @@@ _systemAccount = _accountMgr.getSystemAccount(); _systemUser = _accountMgr.getSystemUser(); _dispatcher = ApiDispatcher.getInstance(); - _domainMgr = locator.getManager(DomainManager.class); - _regionMgr = locator.getManager(RegionManager.class); ++ _domainMgr = ComponentLocator.inject(DomainManager.class); ++ _regionMgr = ComponentLocator.inject(RegionManager.class); Integer apiPort = null; // api port, null by default + ComponentLocator locator = ComponentLocator.getLocator(ManagementServer.Name); ConfigurationDao configDao = locator.getDao(ConfigurationDao.class); SearchCriteria<ConfigurationVO> sc = configDao.createSearchCriteria(); sc.addAnd("name", SearchCriteria.Op.EQ, "integration.api.port"); http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/configuration/DefaultComponentLibrary.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/domain/DomainVO.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/projects/ProjectManagerImpl.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/projects/ProjectManagerImpl.java index daf185f,15d3675..f65627e --- a/server/src/com/cloud/projects/ProjectManagerImpl.java +++ b/server/src/com/cloud/projects/ProjectManagerImpl.java @@@ -206,14 -205,14 +205,14 @@@ public class ProjectManagerImpl impleme //Create an account associated with the project StringBuilder acctNm = new StringBuilder("PrjAcct-"); acctNm.append(name).append("-").append(owner.getDomainId()); - - Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null); - + + Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null, "", 0); + Project project = _projectDao.persist(new ProjectVO(name, displayText, owner.getDomainId(), projectAccount.getId())); - + //assign owner to the project assignAccountToProject(project, owner.getId(), ProjectAccount.Role.Admin); - + if (project != null) { UserContext.current().setEventDetails("Project id=" + project.getId()); } http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/server/ConfigurationServerImpl.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/server/ConfigurationServerImpl.java index 43fe57a,b0abd04..a63ad19 --- a/server/src/com/cloud/server/ConfigurationServerImpl.java +++ b/server/src/com/cloud/server/ConfigurationServerImpl.java @@@ -105,8 -70,21 +72,23 @@@ import com.cloud.utils.db.Transaction import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.utils.script.Script; +import com.cloud.uuididentity.dao.IdentityDao; + + import org.apache.commons.codec.binary.Base64; + import org.apache.log4j.Logger; + + import javax.crypto.KeyGenerator; + import javax.crypto.SecretKey; + import java.io.*; + import java.net.InetAddress; + import java.net.UnknownHostException; + import java.security.NoSuchAlgorithmException; + import java.sql.PreparedStatement; + import java.sql.ResultSet; + import java.sql.SQLException; + import java.util.*; + import java.util.regex.Pattern; + public class ConfigurationServerImpl implements ConfigurationServer { public static final Logger s_logger = Logger.getLogger(ConfigurationServerImpl.class.getName()); @@@ -279,8 -251,9 +261,8 @@@ // Update the cloud identifier updateCloudIdentifier(); - updateUuids(); - + // We should not update seed data UUID column here since this will be invoked in upgrade case as well. + //updateUuids(); - // Set init to true _configDao.update("init", "Hidden", "true"); } @@@ -330,9 -306,8 +315,9 @@@ @DB protected void saveUser() { + //ToDo: Add regionId to default users and accounts // insert system account - String insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (1, 'system', '1', '1')"; + String insertSql = "INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id) VALUES (1, UUID(), 'system', '1', '1')"; Transaction txn = Transaction.currentTxn(); try { PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql); http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/user/AccountManager.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/user/AccountManagerImpl.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/user/AccountManagerImpl.java index b72a8ac,b910a03..dcd6da3 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@@ -1702,18 -1722,20 +1756,31 @@@ public class AccountManagerImpl impleme if (s_logger.isDebugEnabled()) { s_logger.debug("Creating user: " + userName + ", accountId: " + accountId + " timezone:" + timezone); } + + UserVO user = _userDao.persist(new UserVO(accountId, userName, password, firstName, lastName, email, timezone, UUID.randomUUID().toString(), _regionMgr.getId())); + + return user; + } + + //ToDo Add events?? + public UserVO createUser(long accountId, String userName, String password, String firstName, String lastName, String email, String timezone, String uuid, int regionId) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Creating user: " + userName + ", accountId: " + accountId + " timezone:" + timezone); + } - UserVO user = _userDao.persist(new UserVO(accountId, userName, password, firstName, lastName, email, timezone, uuid, regionId)); + + String encodedPassword = null; + for (Enumeration<UserAuthenticator> en = _userAuthenticators.enumeration(); en.hasMoreElements();) { + UserAuthenticator authenticator = en.nextElement(); + encodedPassword = authenticator.encode(password); + if (encodedPassword != null) { + break; + } + } + if (encodedPassword == null) { + throw new CloudRuntimeException("Failed to encode password"); + } - - UserVO user = _userDao.persist(new UserVO(accountId, userName, encodedPassword, firstName, lastName, email, timezone)); ++ ++ UserVO user = _userDao.persist(new UserVO(accountId, userName, encodedPassword, firstName, lastName, email, timezone, uuid, regionId)); return user; } @@@ -1937,11 -1966,16 +2011,17 @@@ @Override @DB public String[] createApiKeyAndSecretKey(RegisterCmd cmd) { + //Send keys to other Regions Long userId = cmd.getId(); - if (getUserIncludingRemoved(userId) == null) { - throw new InvalidParameterValueException("unable to find user for id : " + userId); + User user = getUserIncludingRemoved(userId); + if (user == null) { + throw new InvalidParameterValueException("unable to find user by id"); + } + + //don't allow updating system user + if (user.getId() == User.UID_SYSTEM) { + throw new PermissionDeniedException("user id : " + user.getId() + " is system account, update is not allowed"); } // generate both an api key and a secret key, update the user table with the keys, return the keys to the user @@@ -2374,26 -2194,51 +2240,69 @@@ } } - @Override + @Override - public UserAccount getUserByApiKey(String apiKey) { - return _userAccountDao.getUserByApiKey(apiKey); - } - - @Override + public User findUser(String username, Long domainId) { + UserAccount userAccount = _userAccountDao.getUserAccount(username, domainId); + if(userAccount == null){ + throw new InvalidParameterValueException("Unable to find user account by name: "+username); + } + User user = _userDao.findById(userAccount.getId()); + if(user == null){ + throw new InvalidParameterValueException("Unable to find user by name: "+username); + } + return user; + } + + @Override + public Account findAccount(Long id) { + return _accountDao.findById(id); + } ++ ++ @Override + public void buildACLViewSearchBuilder(SearchBuilder<? extends ControlledViewEntity> sb, Long domainId, + boolean isRecursive, List<Long> permittedAccounts, ListProjectResourcesCriteria listProjectResourcesCriteria) { + + sb.and("accountIdIN", sb.entity().getAccountId(), SearchCriteria.Op.IN); + sb.and("domainId", sb.entity().getDomainId(), SearchCriteria.Op.EQ); + + if (((permittedAccounts.isEmpty()) && (domainId != null) && isRecursive)) { + // if accountId isn't specified, we can do a domain match for the + // admin case if isRecursive is true + sb.and("domainPath", sb.entity().getDomainPath(), SearchCriteria.Op.LIKE); + } + + if (listProjectResourcesCriteria != null) { + if (listProjectResourcesCriteria == Project.ListProjectResourcesCriteria.ListProjectResourcesOnly) { + sb.and("accountType", sb.entity().getAccountType(), SearchCriteria.Op.EQ); + } else if (listProjectResourcesCriteria == Project.ListProjectResourcesCriteria.SkipProjectResources) { + sb.and("accountType", sb.entity().getAccountType(), SearchCriteria.Op.NEQ); + } + } + + } + + @Override + public void buildACLViewSearchCriteria(SearchCriteria<? extends ControlledViewEntity> sc, + Long domainId, boolean isRecursive, List<Long> permittedAccounts, ListProjectResourcesCriteria listProjectResourcesCriteria) { + + if (listProjectResourcesCriteria != null) { + sc.setParameters("accountType", Account.ACCOUNT_TYPE_PROJECT); + } + + if (!permittedAccounts.isEmpty()) { + sc.setParameters("accountIdIN", permittedAccounts.toArray()); + } else if (domainId != null) { + DomainVO domain = _domainDao.findById(domainId); + if (isRecursive) { + sc.setParameters("domainPath", domain.getPath() + "%"); + } else { + sc.setParameters("domainId", domainId); + } + } + } + + @Override + public UserAccount getUserByApiKey(String apiKey) { + return _userAccountDao.getUserByApiKey(apiKey); + } } http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/src/com/cloud/user/DomainManagerImpl.java ---------------------------------------------------------------------- diff --cc server/src/com/cloud/user/DomainManagerImpl.java index 8ec68bb,54ca2ac..92277e8 --- a/server/src/com/cloud/user/DomainManagerImpl.java +++ b/server/src/com/cloud/user/DomainManagerImpl.java @@@ -24,11 -24,10 +24,11 @@@ import java.util.Set import javax.ejb.Local; import javax.naming.ConfigurationException; + import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd; + import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd; ++import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd; import org.apache.log4j.Logger; - import com.cloud.api.commands.ListDomainChildrenCmd; - import com.cloud.api.commands.ListDomainsCmd; - import com.cloud.api.commands.UpdateDomainCmd; import com.cloud.configuration.ResourceLimit; import com.cloud.configuration.dao.ResourceCountDao; import com.cloud.domain.Domain; @@@ -481,100 -472,7 +488,100 @@@ public class DomainManagerImpl implemen sc.addAnd("state", SearchCriteria.Op.EQ, Domain.State.Active); } - return _domainDao.search(sc, searchFilter); + return _domainDao.searchAndCount(sc, searchFilter); } + @Override + @ActionEvent(eventType = EventTypes.EVENT_DOMAIN_UPDATE, eventDescription = "updating Domain") + @DB + public DomainVO updateDomain(UpdateDomainCmd cmd) { + Long domainId = cmd.getId(); + String domainName = cmd.getDomainName(); + String networkDomain = cmd.getNetworkDomain(); + + // check if domain exists in the system + DomainVO domain = _domainDao.findById(domainId); + if (domain == null) { + InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find domain with specified domain id"); + ex.addProxyObject(domain, domainId, "domainId"); + throw ex; + } else if (domain.getParent() == null && domainName != null) { + // check if domain is ROOT domain - and deny to edit it with the new name + throw new InvalidParameterValueException("ROOT domain can not be edited with a new name"); + } + + // check permissions + Account caller = UserContext.current().getCaller(); + _accountMgr.checkAccess(caller, domain); + + // domain name is unique in the cloud + if (domainName != null) { + SearchCriteria<DomainVO> sc = _domainDao.createSearchCriteria(); + sc.addAnd("name", SearchCriteria.Op.EQ, domainName); + List<DomainVO> domains = _domainDao.search(sc, null); + + boolean sameDomain = (domains.size() == 1 && domains.get(0).getId() == domainId); + + if (!domains.isEmpty() && !sameDomain) { + InvalidParameterValueException ex = new InvalidParameterValueException("Failed to update specified domain id with name '" + domainName + "' since it already exists in the system"); + ex.addProxyObject(domain, domainId, "domainId"); + throw ex; + } + } + + // validate network domain + if (networkDomain != null && !networkDomain.isEmpty()) { + if (!NetUtils.verifyDomainName(networkDomain)) { + throw new InvalidParameterValueException( + "Invalid network domain. Total length shouldn't exceed 190 chars. Each domain label must be between 1 and 63 characters long, can contain ASCII letters 'a' through 'z', the digits '0' through '9', " + + "and the hyphen ('-'); can't start or end with \"-\""); + } + } + + Transaction txn = Transaction.currentTxn(); + + txn.start(); + + if (domainName != null) { + String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName); + updateDomainChildren(domain, updatedDomainPath); + domain.setName(domainName); + domain.setPath(updatedDomainPath); + } + + if (networkDomain != null) { + if (networkDomain.isEmpty()) { + domain.setNetworkDomain(null); + } else { + domain.setNetworkDomain(networkDomain); + } + } + _domainDao.update(domainId, domain); + + txn.commit(); + + return _domainDao.findById(domainId); + + } + + private String getUpdatedDomainPath(String oldPath, String newName) { + String[] tokenizedPath = oldPath.split("/"); + tokenizedPath[tokenizedPath.length - 1] = newName; + StringBuilder finalPath = new StringBuilder(); + for (String token : tokenizedPath) { + finalPath.append(token); + finalPath.append("/"); + } + return finalPath.toString(); + } + + private void updateDomainChildren(DomainVO domain, String updatedDomainPrefix) { + List<DomainVO> domainChildren = _domainDao.findAllChildren(domain.getPath(), domain.getId()); + // for each child, update the path + for (DomainVO dom : domainChildren) { + dom.setPath(dom.getPath().replaceFirst(domain.getPath(), updatedDomainPrefix)); + _domainDao.update(dom.getId(), dom); + } + } + } http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/test/com/cloud/user/MockAccountManagerImpl.java ---------------------------------------------------------------------- diff --cc server/test/com/cloud/user/MockAccountManagerImpl.java index c4c2e6b,550304a..7e20491 --- a/server/test/com/cloud/user/MockAccountManagerImpl.java +++ b/server/test/com/cloud/user/MockAccountManagerImpl.java @@@ -22,14 -22,16 +22,18 @@@ import java.util.Map import javax.ejb.Local; import javax.naming.ConfigurationException; - import com.cloud.acl.ControlledEntity; - import com.cloud.acl.SecurityChecker.AccessType; - import com.cloud.api.commands.DeleteUserCmd; - import com.cloud.api.commands.ListAccountsCmd; - import com.cloud.api.commands.ListUsersCmd; - import com.cloud.api.commands.RegisterCmd; - import com.cloud.api.commands.UpdateAccountCmd; - import com.cloud.api.commands.UpdateUserCmd; + import org.apache.cloudstack.acl.ControlledEntity; + import org.apache.cloudstack.acl.RoleType; + import org.apache.cloudstack.acl.SecurityChecker.AccessType; + import com.cloud.api.query.vo.ControlledViewEntity; + + import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd; ++import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; + import org.apache.cloudstack.api.command.admin.user.RegisterCmd; + import org.apache.cloudstack.api.command.admin.account.UpdateAccountCmd; + import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd; ++import org.apache.cloudstack.api.command.user.account.ListAccountsCmd; + import com.cloud.domain.Domain; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.PermissionDeniedException; @@@ -274,18 -282,23 +278,6 @@@ public class MockAccountManagerImpl imp return true; } - @Override - public List<? extends Account> searchForAccounts(ListAccountsCmd cmd) { - // TODO Auto-generated method stub - return null; - } -- - @Override - public List<? extends UserAccount> searchForUsers(ListUsersCmd cmd) throws PermissionDeniedException { - // TODO Auto-generated method stub - return null; - } - - @Override - public UserAccount createUserAccount(String userName, String password, - String firstName, String lastName, String email, String timezone, - String accountName, short accountType, Long domainId, - String networkDomain, Map<String, String> details) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Account createAccount(String accountName, short accountType, - Long domainId, String networkDomain, Map details) { - // TODO Auto-generated method stub - return null; - } - @Override public boolean enableAccount(long accountId) { // TODO Auto-generated method stub @@@ -320,42 -345,9 +324,46 @@@ return null; } + @Override + public UserAccount createUserAccount(String userName, String password, + String firstName, String lastName, String email, String timezone, + String accountName, short accountType, Long domainId, + String networkDomain, Map<String, String> details, + String accountUUID, String userUUID, Integer regionId) { + // TODO Auto-generated method stub + return null; + } + + @Override + public User createUser(String userName, String password, String firstName, + String lastName, String email, String timeZone, String accountName, + Long domainId, String userUUID, Integer regionId) { + // TODO Auto-generated method stub + return null; + } + + @Override + public User findUser(String username, Long domainId) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Account findAccount(Long id) { + // TODO Auto-generated method stub + return null; + } + + @Override + public Account createAccount(String accountName, short accountType, + Long domainId, String networkDomain, Map details, String uuid, + int regionId) { + // TODO Auto-generated method stub + return null; + } + @Override + public RoleType getRoleType(Account account) { + return null; + } } http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/test/com/cloud/user/MockDomainManagerImpl.java ---------------------------------------------------------------------- diff --cc server/test/com/cloud/user/MockDomainManagerImpl.java index 2927526,0fe259d..4f134a0 --- a/server/test/com/cloud/user/MockDomainManagerImpl.java +++ b/server/test/com/cloud/user/MockDomainManagerImpl.java @@@ -23,18 -23,24 +23,20 @@@ import java.util.Set import javax.ejb.Local; import javax.naming.ConfigurationException; - import com.cloud.api.commands.ListDomainChildrenCmd; - import com.cloud.api.commands.ListDomainsCmd; - import com.cloud.api.commands.UpdateDomainCmd; + import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd; + import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd; ++import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd; ++ import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.exception.PermissionDeniedException; import com.cloud.utils.component.Manager; + import com.cloud.utils.Pair; - @Local(value = { DomainManager.class }) - public class MockDomainManagerImpl implements Manager, DomainManager { + @Local(value = { DomainManager.class, DomainService.class }) + public class MockDomainManagerImpl implements Manager, DomainManager, DomainService { @Override - public Domain createDomain(String name, Long parentId, String networkDomain) { - // TODO Auto-generated method stub - return null; - } - - @Override public Domain getDomain(long id) { // TODO Auto-generated method stub return null; http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/test/com/cloud/vm/MockUserVmManagerImpl.java ---------------------------------------------------------------------- diff --cc server/test/com/cloud/vm/MockUserVmManagerImpl.java index 1baf34a,27508b1..e397b82 --- a/server/test/com/cloud/vm/MockUserVmManagerImpl.java +++ b/server/test/com/cloud/vm/MockUserVmManagerImpl.java @@@ -193,9 -194,9 +195,9 @@@ public class MockUserVmManagerImpl impl } @Override - public List<UserVmVO> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List<Long> permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags) { + public Pair<List<UserVmJoinVO>, Integer> searchForUserVMs(Criteria c, Account caller, Long domainId, boolean isRecursive, List<Long> permittedAccounts, boolean listAll, ListProjectResourcesCriteria listProjectResourcesCriteria, Map<String, String> tags) { // TODO Auto-generated method stub - return null; + return new ArrayList<UserVmVO>(); } @Override http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/setup/db/create-schema.sql ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/utils/conf/db.properties ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/utils/src/com/cloud/utils/db/GenericDao.java ---------------------------------------------------------------------- diff --cc utils/src/com/cloud/utils/db/GenericDao.java index ca4c21a,15d04b7..9864b18 --- a/utils/src/com/cloud/utils/db/GenericDao.java +++ b/utils/src/com/cloud/utils/db/GenericDao.java @@@ -260,6 -265,11 +265,13 @@@ public interface GenericDao<T, ID exten * @return */ Class<T> getEntityBeanType(); + + public int getRegionId(); + + /** + * @param sc + * @param filter + * @return + */ + Pair<List<T>, Integer> searchAndCount(SearchCriteria<T> sc, Filter filter); } http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/utils/src/com/cloud/utils/db/GenericDaoBase.java ---------------------------------------------------------------------- diff --cc utils/src/com/cloud/utils/db/GenericDaoBase.java index 271cec5,880e9de..ec2e7e0 --- a/utils/src/com/cloud/utils/db/GenericDaoBase.java +++ b/utils/src/com/cloud/utils/db/GenericDaoBase.java @@@ -1769,9 -1794,74 +1794,79 @@@ public abstract class GenericDaoBase<T factory.setCallback(0, sc); return sc; } + + @Override + public int getRegionId(){ + return Transaction.s_region_id; + } + + public Integer getCount(SearchCriteria<T> sc) { + String clause = sc != null ? sc.getWhereClause() : null; + if (clause != null && clause.length() == 0) { + clause = null; + } + + final StringBuilder str = createCountSelect(sc, clause != null); + if (clause != null) { + str.append(clause); + } + + Collection<JoinBuilder<SearchCriteria<?>>> joins = null; + if (sc != null) { + joins = sc.getJoins(); + if (joins != null) { + addJoins(str, joins); + } + } + + // we have to disable group by in getting count, since count for groupBy clause will be different. + //List<Object> groupByValues = addGroupBy(str, sc); + final Transaction txn = Transaction.currentTxn(); + final String sql = str.toString(); + + PreparedStatement pstmt = null; + try { + pstmt = txn.prepareAutoCloseStatement(sql); + int i = 0; + if (clause != null) { + for (final Pair<Attribute, Object> value : sc.getValues()) { + prepareAttribute(++i, pstmt, value.first(), value.second()); + } + } + + if (joins != null) { + i = addJoinAttributes(i, pstmt, joins); + } + + /* + if (groupByValues != null) { + for (Object value : groupByValues) { + pstmt.setObject(i++, value); + } + } + */ + + final ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + return rs.getInt(1); + } + return 0; + } catch (final SQLException e) { + throw new CloudRuntimeException("DB Exception on: " + pstmt, e); + } catch (final Throwable e) { + throw new CloudRuntimeException("Caught: " + pstmt, e); + } + } + + @DB(txn=false) + protected StringBuilder createCountSelect(SearchCriteria<?> sc, final boolean whereClause) { + StringBuilder sql = new StringBuilder(_count); + + if (!whereClause) { + sql.delete(sql.length() - (_discriminatorClause == null ? 6 : 4), sql.length()); + } + + return sql; + } + } http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/1f57d925/utils/src/com/cloud/utils/db/Transaction.java ----------------------------------------------------------------------
