diff --git a/api/src/com/cloud/api/ApiConstants.java b/api/src/com/cloud/api/ApiConstants.java index f95c3d889df..5802e5ddd7a 100755 --- a/api/src/com/cloud/api/ApiConstants.java +++ b/api/src/com/cloud/api/ApiConstants.java @@ -149,6 +149,7 @@ public class ApiConstants { public static final String SCHEDULE = "schedule"; public static final String SCOPE = "scope"; public static final String SECRET_KEY = "usersecretkey"; + public static final String KEY = "key"; public static final String SECURITY_GROUP_IDS = "securitygroupids"; public static final String SECURITY_GROUP_NAMES = "securitygroupnames"; public static final String SECURITY_GROUP_NAME = "securitygroupname"; diff --git a/api/src/com/cloud/api/ResponseGenerator.java b/api/src/com/cloud/api/ResponseGenerator.java index 69f4628b84a..c15c6fea76f 100755 --- a/api/src/com/cloud/api/ResponseGenerator.java +++ b/api/src/com/cloud/api/ResponseGenerator.java @@ -55,6 +55,7 @@ import com.cloud.api.response.ServiceOfferingResponse; import com.cloud.api.response.SnapshotPolicyResponse; import com.cloud.api.response.SnapshotResponse; 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; @@ -99,6 +100,7 @@ import com.cloud.projects.ProjectAccount; import com.cloud.projects.ProjectInvitation; import com.cloud.storage.Snapshot; import com.cloud.storage.StoragePool; +import com.cloud.storage.Swift; import com.cloud.storage.Volume; import com.cloud.storage.snapshot.SnapshotPolicy; import com.cloud.template.VirtualMachineTemplate; @@ -233,4 +235,6 @@ public interface ResponseGenerator { SystemVmInstanceResponse createSystemVmInstanceResponse(VirtualMachine systemVM); + SwiftResponse createSwiftResponse(Swift swift); + } diff --git a/api/src/com/cloud/api/commands/AddSwiftCmd.java b/api/src/com/cloud/api/commands/AddSwiftCmd.java new file mode 100644 index 00000000000..19bb7d02cab --- /dev/null +++ b/api/src/com/cloud/api/commands/AddSwiftCmd.java @@ -0,0 +1,113 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package com.cloud.api.commands; + +import java.util.List; + +import org.apache.log4j.Logger; + +import com.cloud.api.ApiConstants; +import com.cloud.api.BaseCmd; +import com.cloud.api.Implementation; +import com.cloud.api.Parameter; +import com.cloud.api.ServerApiException; +import com.cloud.api.response.HostResponse; +import com.cloud.api.response.SwiftResponse; +import com.cloud.exception.DiscoveryException; +import com.cloud.storage.Swift; +import com.cloud.user.Account; + +@Implementation(description = "Adds Swift.", responseObject = HostResponse.class) +public class AddSwiftCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(AddSwiftCmd.class.getName()); + private static final String s_name = "addSwiftresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.URL, type = CommandType.STRING, required = true, description = "the URL for swift") + private String url; + + @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "the account for swift") + private String account; + + @Parameter(name = ApiConstants.USERNAME, type = CommandType.STRING, description = "the username for swift") + private String username; + + @Parameter(name = ApiConstants.KEY, type = CommandType.STRING, description = " key for the user for swift") + private String key; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public String getUrl() { + return url; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + public String getAccount() { + return account; + } + + public String getUsername() { + return username; + } + + public String getKey() { + return key; + } + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute(){ + try { + List result = _resourceService.discoverSwift(this); + SwiftResponse swiftResponse = null; + if (result != null && result.size() > 0) { + for (Swift swift : result) { + // There should only be one secondary storage host per add + swiftResponse = _responseGenerator.createSwiftResponse(swift); + swiftResponse.setResponseName(getCommandName()); + swiftResponse.setObjectName("Swift"); + this.setResponseObject(swiftResponse); + } + } else { + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Failed to add Swift"); + } + } catch (DiscoveryException ex) { + String errMsg = "Failed to add Swift due to " + ex.toString(); + s_logger.warn(errMsg, ex); + throw new ServerApiException(BaseCmd.INTERNAL_ERROR, errMsg); + } + } +} diff --git a/api/src/com/cloud/api/response/SwiftResponse.java b/api/src/com/cloud/api/response/SwiftResponse.java new file mode 100755 index 00000000000..ba7f3c8ff4d --- /dev/null +++ b/api/src/com/cloud/api/response/SwiftResponse.java @@ -0,0 +1,64 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.api.response; + +import java.util.Date; + +import com.cloud.api.ApiConstants; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +public class SwiftResponse extends BaseResponse { + @SerializedName(ApiConstants.ID) + @Param(description = "the ID of swift") + private Long id; + + @SerializedName(ApiConstants.URL) + @Param(description = "url for swift") + private String url; + + @SerializedName(ApiConstants.CREATED) + @Param(description = "the date and time the host was created") + private Date created; + + @Override + public Long getObjectId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + +} diff --git a/api/src/com/cloud/resource/ResourceService.java b/api/src/com/cloud/resource/ResourceService.java index d6e5ca9aa8e..ec8ccee15cc 100644 --- a/api/src/com/cloud/resource/ResourceService.java +++ b/api/src/com/cloud/resource/ResourceService.java @@ -22,6 +22,7 @@ import java.util.List; import com.cloud.api.commands.AddClusterCmd; import com.cloud.api.commands.AddHostCmd; import com.cloud.api.commands.AddSecondaryStorageCmd; +import com.cloud.api.commands.AddSwiftCmd; import com.cloud.api.commands.CancelMaintenanceCmd; import com.cloud.api.commands.DeleteClusterCmd; import com.cloud.api.commands.PrepareForMaintenanceCmd; @@ -33,6 +34,7 @@ import com.cloud.exception.DiscoveryException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.host.Host; import com.cloud.org.Cluster; +import com.cloud.storage.Swift; public interface ResourceService { /** @@ -86,4 +88,6 @@ public interface ResourceService { Host getHost(long hostId); Cluster getCluster(Long clusterId); + + List discoverSwift(AddSwiftCmd addSwiftCmd) throws DiscoveryException; } diff --git a/core/src/com/cloud/storage/Swift.java b/api/src/com/cloud/storage/Swift.java similarity index 97% rename from core/src/com/cloud/storage/Swift.java rename to api/src/com/cloud/storage/Swift.java index f058fe270fb..83f8906edac 100644 --- a/core/src/com/cloud/storage/Swift.java +++ b/api/src/com/cloud/storage/Swift.java @@ -20,6 +20,7 @@ package com.cloud.storage; import com.cloud.agent.api.to.SwiftTO; public interface Swift { + public long getId(); public String getUrl(); public String getAccount(); public String getUserName(); diff --git a/core/src/com/cloud/storage/SwiftVO.java b/core/src/com/cloud/storage/SwiftVO.java index 9d3e7f93255..a47bbf5bb24 100644 --- a/core/src/com/cloud/storage/SwiftVO.java +++ b/core/src/com/cloud/storage/SwiftVO.java @@ -18,6 +18,8 @@ package com.cloud.storage; +import java.util.Date; + import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; @@ -26,6 +28,7 @@ import javax.persistence.Id; import javax.persistence.Table; import com.cloud.agent.api.to.SwiftTO; +import com.cloud.utils.db.GenericDao; @Entity @Table(name="swift") @@ -47,6 +50,9 @@ public class SwiftVO implements Swift { @Column(name="key") String key; + + @Column(name = GenericDao.CREATED_COLUMN) + private Date created; public SwiftVO() { } @@ -57,6 +63,7 @@ public class SwiftVO implements Swift { this.key = key; } + @Override public long getId() { return id; } @@ -77,6 +84,10 @@ public class SwiftVO implements Swift { return key; } + public Date getCreated() { + return created; + } + @Override public SwiftTO toSwiftTO() { return new SwiftTO(getId(), getUrl(), getAccount(), getUserName(), getKey()); diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index eacedc159fc..959eb19c7a9 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -76,6 +76,7 @@ import com.cloud.api.response.ServiceResponse; import com.cloud.api.response.SnapshotPolicyResponse; import com.cloud.api.response.SnapshotResponse; 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; @@ -148,6 +149,7 @@ import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.StoragePool; import com.cloud.storage.StoragePoolVO; import com.cloud.storage.StorageStats; +import com.cloud.storage.Swift; import com.cloud.storage.UploadVO; import com.cloud.storage.VMTemplateHostVO; import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; @@ -597,6 +599,15 @@ public class ApiResponseHelper implements ResponseGenerator { return hostResponse; } + @Override + public SwiftResponse createSwiftResponse(Swift swift) { + SwiftResponse swiftResponse = new SwiftResponse(); + swiftResponse.setId(swift.getId()); + swiftResponse.setUrl(swift.getUrl()); + swiftResponse.setObjectName("Swift"); + return swiftResponse; + } + @Override public VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan) { Long podId = ApiDBUtils.getPodIdForVlan(vlan.getId()); diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 64dd5e1a924..eda21f96836 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -37,6 +37,7 @@ import com.cloud.agent.manager.AgentAttache; import com.cloud.api.commands.AddClusterCmd; import com.cloud.api.commands.AddHostCmd; import com.cloud.api.commands.AddSecondaryStorageCmd; +import com.cloud.api.commands.AddSwiftCmd; import com.cloud.api.commands.CancelMaintenanceCmd; import com.cloud.api.commands.DeleteClusterCmd; import com.cloud.api.commands.PrepareForMaintenanceCmd; @@ -44,6 +45,8 @@ import com.cloud.api.commands.ReconnectHostCmd; import com.cloud.api.commands.UpdateHostCmd; import com.cloud.api.commands.UpdateHostPasswordCmd; import com.cloud.cluster.ManagementServerNode; +import com.cloud.configuration.Config; +import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenterVO; @@ -70,7 +73,10 @@ import com.cloud.org.Grouping; import com.cloud.org.Managed; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.StorageManager; +import com.cloud.storage.Swift; +import com.cloud.storage.SwiftVO; import com.cloud.storage.dao.GuestOSCategoryDao; +import com.cloud.storage.dao.SwiftDao; import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.user.Account; import com.cloud.user.AccountManager; @@ -110,8 +116,12 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma @Inject protected HostDao _hostDao; @Inject + protected SwiftDao _swiftDao; + @Inject protected HostDetailsDao _hostDetailsDao; @Inject + protected ConfigurationDao _configDao; + @Inject protected HostTagsDao _hostTagsDao; @Inject protected GuestOSCategoryDao _guestOSCategoryDao; @@ -439,6 +449,19 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma return discoverHostsFull(dcId, null, null, null, url, null, null, "SecondaryStorage", null, null, null); } + @Override + public List discoverSwift(AddSwiftCmd cmd) throws DiscoveryException { + Boolean swiftEnable = Boolean.valueOf(_configDao.getValue(Config.SwiftEnable.key())); + if (!swiftEnable) { + throw new DiscoveryException("Swift is not enabled"); + } + SwiftVO swift = new SwiftVO(cmd.getUrl(), cmd.getAccount(), cmd.getUsername(), cmd.getKey()); + swift = _swiftDao.persist(swift); + List list = new ArrayList(); + list.add(swift); + return list; + } + private List discoverHostsFull(Long dcId, Long podId, Long clusterId, String clusterName, String url, String username, String password, String hypervisorType, List hostTags, Map params, String allocationState) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException { URI uri = null; diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index e16c531a6f2..64cd48e4736 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -1662,6 +1662,7 @@ CREATE TABLE `cloud`.`swift` ( `account` varchar(255) NOT NULL COMMENT ' account in swift', `username` varchar(255) NOT NULL COMMENT ' username in swift', `key` varchar(255) NOT NULL COMMENT 'token for this user', + `created` datetime COMMENT 'date the swift first signed on', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;