1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.jclouds.savvis.vpdc.compute.strategy;
20
21 import static com.google.common.base.Preconditions.checkNotNull;
22 import static org.jclouds.savvis.vpdc.options.GetVMOptions.Builder.withPowerState;
23 import static org.jclouds.savvis.vpdc.reference.VPDCConstants.PROPERTY_VPDC_VDC_EMAIL;
24
25 import java.net.URI;
26 import java.util.Map;
27 import java.util.concurrent.TimeUnit;
28
29 import javax.inject.Named;
30 import javax.inject.Singleton;
31
32 import org.jclouds.compute.ComputeService;
33 import org.jclouds.compute.ComputeServiceAdapter;
34 import org.jclouds.compute.domain.CIMOperatingSystem;
35 import org.jclouds.compute.domain.Template;
36 import org.jclouds.compute.domain.Volume;
37 import org.jclouds.domain.Credentials;
38 import org.jclouds.predicates.RetryablePredicate;
39 import org.jclouds.savvis.vpdc.VPDCClient;
40 import org.jclouds.savvis.vpdc.domain.Network;
41 import org.jclouds.savvis.vpdc.domain.Org;
42 import org.jclouds.savvis.vpdc.domain.Resource;
43 import org.jclouds.savvis.vpdc.domain.Task;
44 import org.jclouds.savvis.vpdc.domain.VDC;
45 import org.jclouds.savvis.vpdc.domain.VM;
46 import org.jclouds.savvis.vpdc.domain.VMSpec;
47 import org.jclouds.savvis.vpdc.predicates.TaskSuccess;
48 import org.jclouds.savvis.vpdc.reference.VCloudMediaType;
49
50 import com.google.common.base.Predicate;
51 import com.google.common.collect.ImmutableSet;
52 import com.google.common.collect.Iterables;
53 import com.google.common.collect.ImmutableSet.Builder;
54 import com.google.inject.Inject;
55
56 ;
57
58
59
60
61
62
63 @Singleton
64 public class VPDCComputeServiceAdapter implements ComputeServiceAdapter<VM, VMSpec, CIMOperatingSystem, Network> {
65 private final VPDCClient client;
66 private final RetryablePredicate<String> taskTester;
67 @Inject(optional = true)
68 @Named(PROPERTY_VPDC_VDC_EMAIL)
69 String email;
70
71 @Inject
72 public VPDCComputeServiceAdapter(VPDCClient client, TaskSuccess taskSuccess) {
73 this.client = checkNotNull(client, "client");
74
75 this.taskTester = new RetryablePredicate<String>(checkNotNull(taskSuccess, "taskSuccess"), 650, 10,
76 TimeUnit.SECONDS);
77 }
78
79 @Override
80 public VM createNodeWithGroupEncodedIntoNameThenStoreCredentials(String tag, String name, Template template,
81 Map<String, Credentials> credentialStore) {
82 String networkTierName = template.getLocation().getId();
83 String vpdcId = template.getLocation().getParent().getId();
84 String billingSiteId = template.getLocation().getParent().getParent().getId();
85
86 VMSpec.Builder specBuilder = VMSpec.builder();
87 specBuilder.name(name);
88 specBuilder.networkTierName(networkTierName);
89 specBuilder.operatingSystem(CIMOperatingSystem.class.cast(template.getImage().getOperatingSystem()));
90 specBuilder.processorCount(template.getHardware().getProcessors().size());
91 specBuilder.memoryInGig(template.getHardware().getRam() / 1024);
92
93 for (Volume volume : template.getHardware().getVolumes()) {
94 if (volume.isBootDevice())
95 specBuilder.bootDeviceName(volume.getDevice()).bootDiskSize(volume.getSize().intValue());
96 else
97 specBuilder.addDataDrive(volume.getDevice(), volume.getSize().intValue());
98 }
99
100 Task task = client.getVMClient().addVMIntoVDC(billingSiteId, vpdcId, specBuilder.build());
101
102 if (task.getError() != null)
103 throw new RuntimeException("cloud not add vm: " + task.getError().toString());
104
105 if (taskTester.apply(task.getId())) {
106 try {
107 return this.getNode(task.getResult().getHref().toASCIIString());
108 } finally {
109
110
111 }
112 } else {
113 throw new RuntimeException("task timed out: " + task);
114 }
115 }
116
117 @Override
118 public Iterable<VMSpec> listHardwareProfiles() {
119
120 return ImmutableSet.of(VMSpec.builder().operatingSystem(Iterables.get(listImages(), 0)).memoryInGig(2)
121 .addDataDrive("/data01", 25).build());
122 }
123
124 @Override
125 public Iterable<CIMOperatingSystem> listImages() {
126 return client.listPredefinedOperatingSystems();
127 }
128
129 @Override
130 public Iterable<VM> listNodes() {
131 Builder<VM> builder = ImmutableSet.<VM> builder();
132 for (Resource org1 : client.listOrgs()) {
133 Org org = client.getBrowsingClient().getOrg(org1.getId());
134 for (Resource vdc : org.getVDCs()) {
135 VDC VDC = client.getBrowsingClient().getVDCInOrg(org.getId(), vdc.getId());
136 for (Resource vApp : Iterables.filter(VDC.getResourceEntities(), new Predicate<Resource>() {
137
138 @Override
139 public boolean apply(Resource arg0) {
140 return VCloudMediaType.VAPP_XML.equals(arg0.getType());
141 }
142
143 })) {
144 builder.add(client.getBrowsingClient().getVMInVDC(org.getId(), vdc.getId(), vApp.getId(),
145 withPowerState()));
146 }
147 }
148 }
149 return builder.build();
150 }
151
152 @Override
153 public Iterable<Network> listLocations() {
154 Builder<Network> builder = ImmutableSet.<Network> builder();
155 for (Resource org1 : client.listOrgs()) {
156 Org org = client.getBrowsingClient().getOrg(org1.getId());
157 for (Resource vdc : org.getVDCs()) {
158 VDC VDC = client.getBrowsingClient().getVDCInOrg(org.getId(), vdc.getId());
159
160 if (email != null && VDC.getDescription().indexOf(email) != -1)
161 continue;
162 for (Resource network : VDC.getAvailableNetworks()) {
163 builder.add(client.getBrowsingClient().getNetworkInVDC(org.getId(), vdc.getId(), network.getId()));
164 }
165 }
166 }
167 return builder.build();
168 }
169
170 @Override
171 public VM getNode(String id) {
172 return client.getBrowsingClient().getVM(URI.create(checkNotNull(id, "id")), withPowerState());
173 }
174
175 @Override
176 public void destroyNode(String id) {
177 taskTester.apply(client.getVMClient().removeVM(URI.create(checkNotNull(id, "id"))).getId());
178 }
179
180 @Override
181 public void rebootNode(String id) {
182
183 suspendNode(id);
184 resumeNode(id);
185 }
186
187 @Override
188 public void resumeNode(String id) {
189 taskTester.apply(client.getServiceManagementClient().powerOnVM(URI.create(checkNotNull(id, "id"))).getId());
190 }
191
192 @Override
193 public void suspendNode(String id) {
194 taskTester.apply(client.getServiceManagementClient().powerOffVM(URI.create(checkNotNull(id, "id"))).getId());
195 }
196 }