Skip to content

Commit e4583ce

Browse files
John Burwellsudison
authored andcommitted
S3-backed Secondary Storage
1 parent 3d2fefa commit e4583ce

File tree

11 files changed

+337
-66
lines changed

11 files changed

+337
-66
lines changed

api/src/com/cloud/api/commands/ListS3sCmd.java

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,11 @@
1818
*/
1919
package com.cloud.api.commands;
2020

21-
import static com.cloud.api.ApiConstants.ID;
22-
import static com.cloud.api.BaseCmd.CommandType.LONG;
23-
2421
import java.util.ArrayList;
2522
import java.util.List;
2623

2724
import com.cloud.api.BaseListCmd;
2825
import com.cloud.api.Implementation;
29-
import com.cloud.api.Parameter;
3026
import com.cloud.api.ServerApiException;
3127
import com.cloud.api.response.ListResponse;
3228
import com.cloud.api.response.S3Response;
@@ -42,9 +38,6 @@ public final class ListS3sCmd extends BaseListCmd {
4238

4339
private static final String COMMAND_NAME = "lists3sresponse";
4440

45-
@Parameter(name = ID, type = LONG, required = true, description = "The ID of the S3")
46-
private Long id;
47-
4841
@Override
4942
public void execute() throws ResourceUnavailableException, InsufficientCapacityException,
5043
ServerApiException, ConcurrentOperationException, ResourceAllocationException,
@@ -74,39 +67,9 @@ public void execute() throws ResourceUnavailableException, InsufficientCapacityE
7467

7568
}
7669

77-
@Override
78-
public boolean equals(final Object thatObject) {
79-
80-
if (this == thatObject) {
81-
return true;
82-
}
83-
84-
if (thatObject == null || getClass() != thatObject.getClass()) {
85-
return false;
86-
}
87-
88-
final ListS3sCmd thatListS3sCmd = (ListS3sCmd) thatObject;
89-
90-
if (this.id != null ? !this.id.equals(thatListS3sCmd.id) : thatListS3sCmd.id != null) {
91-
return false;
92-
}
93-
94-
return true;
95-
96-
}
97-
98-
@Override
99-
public int hashCode() {
100-
return this.id != null ? this.id.hashCode() : 0;
101-
}
102-
10370
@Override
10471
public String getCommandName() {
10572
return COMMAND_NAME;
10673
}
10774

108-
public Long getId() {
109-
return this.id;
110-
}
111-
11275
}

build/package.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,10 @@
217217
<include name="discovery-*.jar" />
218218
<include name="wsdl4j-*.jar" />
219219
<include name="ejb-api-3.0.jar" />
220+
<include name="aws-java-sdk-1.3.21.1.jar" />
221+
<include name="httpclient-4.1.jar" />
222+
<include name="httpcore-4.1.jar" />
223+
<include name="commons-lang-2.1.jar" />
220224
</zipfileset>
221225
<zipfileset dir="${jar.dir}">
222226
<include name="${agent.jar}" />

server/src/com/cloud/configuration/ConfigurationManagerImpl.java

Lines changed: 88 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,35 +16,110 @@
1616
// under the License.
1717
package com.cloud.configuration;
1818

19+
import java.net.URI;
20+
import java.sql.PreparedStatement;
21+
import java.sql.ResultSet;
22+
import java.sql.SQLException;
23+
import java.util.ArrayList;
24+
import java.util.Collection;
25+
import java.util.HashMap;
26+
import java.util.HashSet;
27+
import java.util.Hashtable;
28+
import java.util.Iterator;
29+
import java.util.List;
30+
import java.util.Map;
31+
import java.util.Set;
32+
import java.util.UUID;
33+
34+
import javax.ejb.Local;
35+
import javax.naming.ConfigurationException;
36+
import javax.naming.Context;
37+
import javax.naming.NamingException;
38+
import javax.naming.directory.DirContext;
39+
import javax.naming.directory.InitialDirContext;
40+
41+
import org.apache.log4j.Logger;
42+
1943
import com.cloud.acl.SecurityChecker;
2044
import com.cloud.alert.AlertManager;
2145
import com.cloud.api.ApiConstants.LDAPParams;
2246
import com.cloud.api.ApiDBUtils;
23-
import com.cloud.api.commands.*;
47+
import com.cloud.api.commands.CreateDiskOfferingCmd;
48+
import com.cloud.api.commands.CreateNetworkOfferingCmd;
49+
import com.cloud.api.commands.CreateServiceOfferingCmd;
50+
import com.cloud.api.commands.CreateVlanIpRangeCmd;
51+
import com.cloud.api.commands.CreateZoneCmd;
52+
import com.cloud.api.commands.DeleteDiskOfferingCmd;
53+
import com.cloud.api.commands.DeleteNetworkOfferingCmd;
54+
import com.cloud.api.commands.DeletePodCmd;
55+
import com.cloud.api.commands.DeleteServiceOfferingCmd;
56+
import com.cloud.api.commands.DeleteVlanIpRangeCmd;
57+
import com.cloud.api.commands.DeleteZoneCmd;
58+
import com.cloud.api.commands.LDAPConfigCmd;
59+
import com.cloud.api.commands.LDAPRemoveCmd;
60+
import com.cloud.api.commands.ListNetworkOfferingsCmd;
61+
import com.cloud.api.commands.UpdateCfgCmd;
62+
import com.cloud.api.commands.UpdateDiskOfferingCmd;
63+
import com.cloud.api.commands.UpdateNetworkOfferingCmd;
64+
import com.cloud.api.commands.UpdatePodCmd;
65+
import com.cloud.api.commands.UpdateServiceOfferingCmd;
66+
import com.cloud.api.commands.UpdateZoneCmd;
2467
import com.cloud.capacity.dao.CapacityDao;
2568
import com.cloud.configuration.Resource.ResourceType;
2669
import com.cloud.configuration.dao.ConfigurationDao;
27-
import com.cloud.dc.*;
70+
import com.cloud.dc.AccountVlanMapVO;
71+
import com.cloud.dc.ClusterVO;
72+
import com.cloud.dc.DataCenter;
2873
import com.cloud.dc.DataCenter.NetworkType;
74+
import com.cloud.dc.DataCenterIpAddressVO;
75+
import com.cloud.dc.DataCenterLinkLocalIpAddressVO;
76+
import com.cloud.dc.DataCenterVO;
77+
import com.cloud.dc.HostPodVO;
78+
import com.cloud.dc.Pod;
79+
import com.cloud.dc.PodVlanMapVO;
80+
import com.cloud.dc.Vlan;
2981
import com.cloud.dc.Vlan.VlanType;
30-
import com.cloud.dc.dao.*;
82+
import com.cloud.dc.VlanVO;
83+
import com.cloud.dc.dao.AccountVlanMapDao;
84+
import com.cloud.dc.dao.ClusterDao;
85+
import com.cloud.dc.dao.DataCenterDao;
86+
import com.cloud.dc.dao.DataCenterIpAddressDao;
87+
import com.cloud.dc.dao.DataCenterLinkLocalIpAddressDaoImpl;
88+
import com.cloud.dc.dao.HostPodDao;
89+
import com.cloud.dc.dao.PodVlanMapDao;
90+
import com.cloud.dc.dao.VlanDao;
3191
import com.cloud.deploy.DataCenterDeployment;
3292
import com.cloud.domain.Domain;
3393
import com.cloud.domain.DomainVO;
3494
import com.cloud.domain.dao.DomainDao;
3595
import com.cloud.event.ActionEvent;
3696
import com.cloud.event.EventTypes;
37-
import com.cloud.exception.*;
97+
import com.cloud.exception.ConcurrentOperationException;
98+
import com.cloud.exception.InsufficientCapacityException;
99+
import com.cloud.exception.InvalidParameterValueException;
100+
import com.cloud.exception.PermissionDeniedException;
101+
import com.cloud.exception.ResourceAllocationException;
102+
import com.cloud.exception.ResourceUnavailableException;
38103
import com.cloud.host.HostVO;
39104
import com.cloud.hypervisor.Hypervisor.HypervisorType;
40-
import com.cloud.network.*;
105+
import com.cloud.network.IPAddressVO;
106+
import com.cloud.network.Network;
41107
import com.cloud.network.Network.Capability;
42108
import com.cloud.network.Network.GuestType;
43109
import com.cloud.network.Network.Provider;
44110
import com.cloud.network.Network.Service;
111+
import com.cloud.network.NetworkManager;
112+
import com.cloud.network.NetworkVO;
45113
import com.cloud.network.Networks.BroadcastDomainType;
46114
import com.cloud.network.Networks.TrafficType;
47-
import com.cloud.network.dao.*;
115+
import com.cloud.network.PhysicalNetwork;
116+
import com.cloud.network.PhysicalNetworkVO;
117+
import com.cloud.network.dao.FirewallRulesDao;
118+
import com.cloud.network.dao.IPAddressDao;
119+
import com.cloud.network.dao.NetworkDao;
120+
import com.cloud.network.dao.PhysicalNetworkDao;
121+
import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao;
122+
import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
48123
import com.cloud.network.vpc.VpcManager;
49124
import com.cloud.offering.DiskOffering;
50125
import com.cloud.offering.NetworkOffering;
@@ -69,7 +144,12 @@
69144
import com.cloud.storage.secondary.SecondaryStorageVmManager;
70145
import com.cloud.storage.swift.SwiftManager;
71146
import com.cloud.test.IPRangeConfig;
72-
import com.cloud.user.*;
147+
import com.cloud.user.Account;
148+
import com.cloud.user.AccountManager;
149+
import com.cloud.user.AccountVO;
150+
import com.cloud.user.ResourceLimitService;
151+
import com.cloud.user.User;
152+
import com.cloud.user.UserContext;
73153
import com.cloud.user.dao.AccountDao;
74154
import com.cloud.utils.NumbersUtil;
75155
import com.cloud.utils.StringUtils;
@@ -85,20 +165,8 @@
85165
import com.cloud.utils.net.NetUtils;
86166
import com.cloud.vm.VirtualMachine;
87167
import com.cloud.vm.dao.NicDao;
88-
import edu.emory.mathcs.backport.java.util.Arrays;
89-
import org.apache.log4j.Logger;
90168

91-
import javax.ejb.Local;
92-
import javax.naming.ConfigurationException;
93-
import javax.naming.Context;
94-
import javax.naming.NamingException;
95-
import javax.naming.directory.DirContext;
96-
import javax.naming.directory.InitialDirContext;
97-
import java.net.URI;
98-
import java.sql.PreparedStatement;
99-
import java.sql.ResultSet;
100-
import java.sql.SQLException;
101-
import java.util.*;
169+
import edu.emory.mathcs.backport.java.util.Arrays;
102170

103171
@Local(value = { ConfigurationManager.class, ConfigurationService.class })
104172
public class ConfigurationManagerImpl implements ConfigurationManager, ConfigurationService {

server/src/com/cloud/server/ManagementServerImpl.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@
203203
import com.cloud.storage.dao.UploadDao;
204204
import com.cloud.storage.dao.VMTemplateDao;
205205
import com.cloud.storage.dao.VolumeDao;
206+
import com.cloud.storage.s3.S3Manager;
206207
import com.cloud.storage.secondary.SecondaryStorageVmManager;
207208
import com.cloud.storage.snapshot.SnapshotManager;
208209
import com.cloud.storage.swift.SwiftManager;
@@ -292,6 +293,7 @@ public class ManagementServerImpl implements ManagementServer {
292293
private final ConsoleProxyManager _consoleProxyMgr;
293294
private final SecondaryStorageVmManager _secStorageVmMgr;
294295
private final SwiftManager _swiftMgr;
296+
private final S3Manager _s3Mgr;
295297
private final ServiceOfferingDao _offeringsDao;
296298
private final DiskOfferingDao _diskOfferingDao;
297299
private final VMTemplateDao _templateDao;
@@ -370,6 +372,7 @@ protected ManagementServerImpl() {
370372
_consoleProxyMgr = locator.getManager(ConsoleProxyManager.class);
371373
_secStorageVmMgr = locator.getManager(SecondaryStorageVmManager.class);
372374
_swiftMgr = locator.getManager(SwiftManager.class);
375+
_s3Mgr = locator.getManager(S3Manager.class);
373376
_storageMgr = locator.getManager(StorageManager.class);
374377
_publicIpAddressDao = locator.getDao(IPAddressDao.class);
375378
_consoleProxyDao = locator.getDao(ConsoleProxyDao.class);
@@ -1399,6 +1402,29 @@ private Set<Pair<Long, Long>> listTemplates(Long templateId, String name, String
13991402
}
14001403
templateZonePairSet.add(new Pair<Long, Long>(template.getId(), zoneId));
14011404
}
1405+
} else if (_s3Mgr.isS3Enabled()) {
1406+
if (template == null) {
1407+
templateZonePairSet = _templateDao.searchSwiftTemplates(name, keyword, templateFilter, isIso,
1408+
hypers, bootable, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr,
1409+
permittedAccounts, caller, tags);
1410+
Set<Pair<Long, Long>> templateZonePairSet2 = new HashSet<Pair<Long, Long>>();
1411+
templateZonePairSet2 = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers,
1412+
bootable, domain, pageSize, startIndex, zoneId, hyperType, onlyReady, showDomr,
1413+
permittedAccounts, caller, listProjectResourcesCriteria, tags);
1414+
1415+
for (Pair<Long, Long> tmpltPair : templateZonePairSet2) {
1416+
if (!templateZonePairSet.contains(new Pair<Long, Long>(tmpltPair.first(), -1L))) {
1417+
templateZonePairSet.add(tmpltPair);
1418+
}
1419+
}
1420+
} else {
1421+
// if template is not public, perform permission check here
1422+
if (!template.isPublicTemplate() && caller.getType() != Account.ACCOUNT_TYPE_ADMIN) {
1423+
Account owner = _accountMgr.getAccount(template.getAccountId());
1424+
_accountMgr.checkAccess(caller, null, true, owner);
1425+
}
1426+
templateZonePairSet.add(new Pair<Long, Long>(template.getId(), zoneId));
1427+
}
14021428
} else {
14031429
if (template == null) {
14041430
templateZonePairSet = _templateDao.searchTemplates(name, keyword, templateFilter, isIso, hypers,

server/src/com/cloud/storage/dao/VMTemplateDao.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ public Set<Pair<Long, Long>> searchSwiftTemplates(String name, String keyword, T
5858
boolean isIso, List<HypervisorType> hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex,
5959
Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List<Account> permittedAccounts, Account caller, Map<String, String> tags);
6060

61+
public Set<Pair<Long, Long>> searchS3Templates(String name, String keyword, TemplateFilter templateFilter,
62+
boolean isIso, List<HypervisorType> hypers, Boolean bootable, DomainVO domain, Long pageSize, Long startIndex,
63+
Long zoneId, HypervisorType hyperType, boolean onlyReady, boolean showDomr, List<Account> permittedAccounts, Account caller, Map<String, String> tags);
64+
6165
public long addTemplateToZone(VMTemplateVO tmplt, long zoneId);
6266
public List<VMTemplateVO> listAllInZone(long dataCenterId);
6367

0 commit comments

Comments
 (0)