| 1 | /** |
| 2 | * Licensed to jclouds, Inc. (jclouds) under one or more |
| 3 | * contributor license agreements. See the NOTICE file |
| 4 | * distributed with this work for additional information |
| 5 | * regarding copyright ownership. jclouds licenses this file |
| 6 | * to you under the Apache License, Version 2.0 (the |
| 7 | * "License"); you may not use this file except in compliance |
| 8 | * with the License. You may obtain a copy of the License at |
| 9 | * |
| 10 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 11 | * |
| 12 | * Unless required by applicable law or agreed to in writing, |
| 13 | * software distributed under the License is distributed on an |
| 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| 15 | * KIND, either express or implied. See the License for the |
| 16 | * specific language governing permissions and limitations |
| 17 | * under the License. |
| 18 | */ |
| 19 | package org.jclouds.savvis.vpdc.domain; |
| 20 | |
| 21 | import static com.google.common.base.Preconditions.checkNotNull; |
| 22 | |
| 23 | import java.net.URI; |
| 24 | import java.util.Set; |
| 25 | |
| 26 | import org.jclouds.ovf.NetworkSection; |
| 27 | import org.jclouds.ovf.OperatingSystemSection; |
| 28 | import org.jclouds.ovf.ProductSection; |
| 29 | import org.jclouds.ovf.Section; |
| 30 | import org.jclouds.ovf.VirtualHardwareSection; |
| 31 | import org.jclouds.ovf.internal.BaseVirtualSystem; |
| 32 | |
| 33 | import com.google.common.collect.ImmutableSet; |
| 34 | import com.google.common.collect.Multimap; |
| 35 | import com.google.common.collect.Sets; |
| 36 | |
| 37 | /** |
| 38 | * A virtual application (vApp) is a software solution, packaged in OVF containing one or more |
| 39 | * virtual machines. A vApp can be authored by Developers at ISVs and VARs or by IT Administrators |
| 40 | * in Enterprises and Service Providers. |
| 41 | * |
| 42 | * @author Adrian Cole |
| 43 | */ |
| 44 | public class VM extends BaseVirtualSystem<VM> implements Resource { |
| 45 | /** |
| 46 | * Objects such as vAppTemplate, vApp, and Vm have a status attribute whose value indicates the |
| 47 | * state of the object. Status for an object, such as a vAppTemplate or vApp, whose Children (Vm |
| 48 | * objects) each have a status of their own, is computed from the status of the Children. |
| 49 | * |
| 50 | * <h2>NOTE</h2> |
| 51 | * <p/> |
| 52 | * The deployment status of an object is indicated by the value of its deployed attribute. |
| 53 | * |
| 54 | * @since vcloud api 0.8 |
| 55 | * |
| 56 | * @author Adrian Cole |
| 57 | */ |
| 58 | public enum Status { |
| 59 | |
| 60 | /** |
| 61 | * When the VM is in Designing,Saved,Inqueue, has issue in pre provisioning or any exception |
| 62 | * cases. VM is not in Savvis VPDC (may the VM has been removed) or cannot get VM state due to |
| 63 | * unknown exception |
| 64 | */ |
| 65 | UNRESOLVED, |
| 66 | /** |
| 67 | * When the Savvis VPDC is in Provisioning, PartiallyDeployed, Failed and the VM failed in |
| 68 | * provisioning or pending infrastructure notification |
| 69 | */ |
| 70 | RESOLVED, |
| 71 | /** |
| 72 | * When the VM is deployed in vmware and powered off. |
| 73 | */ |
| 74 | OFF, |
| 75 | /** |
| 76 | * We do not support suspended state. |
| 77 | */ |
| 78 | SUSPENDED, |
| 79 | /** |
| 80 | * When the VM is deployed in vmware and powered on. |
| 81 | */ |
| 82 | ON, |
| 83 | /** |
| 84 | * The VM is deployed in vmware but the state of VM may be Uninitialized, Start, Stop, Resume, |
| 85 | * Reset, RebootGuest, Error, Failed, Unknown, PoweringOn, PoweringOff, Suspending, Stopping, |
| 86 | * Starting, Resetting, RebootingGuest. Please call back the Get VApp Power State API after |
| 87 | * few minute. |
| 88 | */ |
| 89 | UNKNOWN, UNRECOGNIZED; |
| 90 | |
| 91 | public String value() { |
| 92 | switch (this) { |
| 93 | case UNRESOLVED: |
| 94 | return "0"; |
| 95 | case RESOLVED: |
| 96 | return "1"; |
| 97 | case OFF: |
| 98 | return "2"; |
| 99 | case SUSPENDED: |
| 100 | return "3"; |
| 101 | case ON: |
| 102 | return "4"; |
| 103 | case UNKNOWN: |
| 104 | return "5"; |
| 105 | default: |
| 106 | return "UNRECOGNIZED"; |
| 107 | } |
| 108 | } |
| 109 | |
| 110 | public static Status fromValue(String status) { |
| 111 | try { |
| 112 | return fromValue(Integer.parseInt(checkNotNull(status, "status"))); |
| 113 | } catch (IllegalArgumentException e) { |
| 114 | return UNRECOGNIZED; |
| 115 | } |
| 116 | } |
| 117 | |
| 118 | public static Status fromValue(int v) { |
| 119 | switch (v) { |
| 120 | case 0: |
| 121 | return UNRESOLVED; |
| 122 | case 1: |
| 123 | return RESOLVED; |
| 124 | case 2: |
| 125 | return OFF; |
| 126 | case 3: |
| 127 | return SUSPENDED; |
| 128 | case 4: |
| 129 | return ON; |
| 130 | case 5: |
| 131 | return UNKNOWN; |
| 132 | default: |
| 133 | return UNRECOGNIZED; |
| 134 | } |
| 135 | } |
| 136 | |
| 137 | } |
| 138 | |
| 139 | public static Builder builder() { |
| 140 | return new Builder(); |
| 141 | } |
| 142 | |
| 143 | public static class Builder extends BaseVirtualSystem.Builder<VM> { |
| 144 | protected String type; |
| 145 | protected URI href; |
| 146 | protected Status status; |
| 147 | protected NetworkSection networkSection; |
| 148 | protected Set<NetworkConfigSection> networkConfigSections = Sets.newLinkedHashSet(); |
| 149 | protected Set<NetworkConnectionSection> networkConnectionSections = Sets.newLinkedHashSet(); |
| 150 | |
| 151 | public Builder id(String id) { |
| 152 | this.id = id; |
| 153 | return this; |
| 154 | } |
| 155 | |
| 156 | public Builder name(String name) { |
| 157 | this.name = name; |
| 158 | return this; |
| 159 | } |
| 160 | |
| 161 | public Builder type(String type) { |
| 162 | this.type = type; |
| 163 | return this; |
| 164 | } |
| 165 | |
| 166 | public Builder href(URI href) { |
| 167 | this.href = href; |
| 168 | return this; |
| 169 | } |
| 170 | |
| 171 | public Builder status(Status status) { |
| 172 | this.status = status; |
| 173 | return this; |
| 174 | } |
| 175 | |
| 176 | public Builder networkSection(NetworkSection networkSection) { |
| 177 | this.networkSection = networkSection; |
| 178 | return this; |
| 179 | } |
| 180 | |
| 181 | /** |
| 182 | * @see VM#getNetworkConfigSections |
| 183 | */ |
| 184 | public Builder networkConfigSection(NetworkConfigSection networkConfigSection) { |
| 185 | this.networkConfigSections.add(checkNotNull(networkConfigSection, "networkConfigSection")); |
| 186 | return this; |
| 187 | } |
| 188 | |
| 189 | /** |
| 190 | * @see VM#getNetworkConfigSections |
| 191 | */ |
| 192 | public Builder networkConfigSections(Iterable<NetworkConfigSection> networkConfigSections) { |
| 193 | this.networkConfigSections = ImmutableSet.<NetworkConfigSection> copyOf(checkNotNull(networkConfigSections, |
| 194 | "networkConfigSections")); |
| 195 | return this; |
| 196 | } |
| 197 | |
| 198 | /** |
| 199 | * @see VM#getNetworkConnectionSections |
| 200 | */ |
| 201 | public Builder networkConnectionSection(NetworkConnectionSection networkConnectionSection) { |
| 202 | this.networkConnectionSections.add(checkNotNull(networkConnectionSection, "networkConnectionSection")); |
| 203 | return this; |
| 204 | } |
| 205 | |
| 206 | /** |
| 207 | * @see VM#getNetworkConnectionSections |
| 208 | */ |
| 209 | public Builder networkConnectionSections(Iterable<NetworkConnectionSection> networkConnectionSections) { |
| 210 | this.networkConnectionSections = ImmutableSet.<NetworkConnectionSection> copyOf(checkNotNull( |
| 211 | networkConnectionSections, "networkConnectionSections")); |
| 212 | return this; |
| 213 | } |
| 214 | |
| 215 | @Override |
| 216 | public VM build() { |
| 217 | return new VM(id, info, name, operatingSystem, virtualHardwareSections, productSections, additionalSections, type, |
| 218 | href, status, networkSection, networkConfigSections, networkConnectionSections); |
| 219 | } |
| 220 | |
| 221 | public Builder fromVM(VM in) { |
| 222 | return fromVirtualSystem(in).type(in.getType()).href(in.getHref()).status(in.getStatus()).networkSection( |
| 223 | in.getNetworkSection()).networkConfigSections(in.getNetworkConfigSections()) |
| 224 | .networkConnectionSections(in.getNetworkConnectionSections()); |
| 225 | } |
| 226 | |
| 227 | /** |
| 228 | * {@inheritDoc} |
| 229 | */ |
| 230 | @SuppressWarnings("unchecked") |
| 231 | @Override |
| 232 | public Builder additionalSection(String name, Section additionalSection) { |
| 233 | return Builder.class.cast(super.additionalSection(name, additionalSection)); |
| 234 | } |
| 235 | |
| 236 | /** |
| 237 | * {@inheritDoc} |
| 238 | */ |
| 239 | @SuppressWarnings("unchecked") |
| 240 | @Override |
| 241 | public Builder additionalSections(Multimap<String, Section> additionalSections) { |
| 242 | return Builder.class.cast(super.additionalSections(additionalSections)); |
| 243 | } |
| 244 | |
| 245 | /** |
| 246 | * {@inheritDoc} |
| 247 | */ |
| 248 | @Override |
| 249 | public Builder fromSection(Section<VM> in) { |
| 250 | return Builder.class.cast(super.fromSection(in)); |
| 251 | } |
| 252 | |
| 253 | /** |
| 254 | * {@inheritDoc} |
| 255 | */ |
| 256 | @Override |
| 257 | public Builder fromVirtualSystem(BaseVirtualSystem<VM> in) { |
| 258 | return Builder.class.cast(super.fromVirtualSystem(in)); |
| 259 | } |
| 260 | |
| 261 | /** |
| 262 | * {@inheritDoc} |
| 263 | */ |
| 264 | @Override |
| 265 | public Builder virtualHardwareSection(VirtualHardwareSection virtualHardwareSection) { |
| 266 | return Builder.class.cast(super.virtualHardwareSection(virtualHardwareSection)); |
| 267 | } |
| 268 | |
| 269 | /** |
| 270 | * {@inheritDoc} |
| 271 | */ |
| 272 | @Override |
| 273 | public Builder virtualHardwareSections(Iterable<? extends VirtualHardwareSection> virtualHardwareSections) { |
| 274 | return Builder.class.cast(super.virtualHardwareSections(virtualHardwareSections)); |
| 275 | } |
| 276 | |
| 277 | /** |
| 278 | * {@inheritDoc} |
| 279 | */ |
| 280 | @Override |
| 281 | public Builder info(String info) { |
| 282 | return Builder.class.cast(super.info(info)); |
| 283 | } |
| 284 | |
| 285 | /** |
| 286 | * {@inheritDoc} |
| 287 | */ |
| 288 | @Override |
| 289 | public Builder operatingSystemSection(OperatingSystemSection operatingSystem) { |
| 290 | return Builder.class.cast(super.operatingSystemSection(operatingSystem)); |
| 291 | } |
| 292 | |
| 293 | /** |
| 294 | * {@inheritDoc} |
| 295 | */ |
| 296 | @Override |
| 297 | public Builder productSection(ProductSection productSection) { |
| 298 | return Builder.class.cast(super.productSection(productSection)); |
| 299 | } |
| 300 | |
| 301 | /** |
| 302 | * {@inheritDoc} |
| 303 | */ |
| 304 | @Override |
| 305 | public Builder productSections(Iterable<? extends ProductSection> productSections) { |
| 306 | return Builder.class.cast(super.productSections(productSections)); |
| 307 | } |
| 308 | } |
| 309 | |
| 310 | protected final String type; |
| 311 | protected final URI href; |
| 312 | protected final Status status; |
| 313 | protected final NetworkSection networkSection; |
| 314 | protected final Set<NetworkConfigSection> networkConfigSections; |
| 315 | protected final Set<NetworkConnectionSection> networkConnectionSections; |
| 316 | |
| 317 | @SuppressWarnings("unchecked") |
| 318 | public VM(String id, String info, String name, OperatingSystemSection operatingSystem, |
| 319 | Iterable<? extends VirtualHardwareSection> virtualHardwareSections, |
| 320 | Iterable<? extends ProductSection> productSections, Multimap<String, Section> additionalSections, |
| 321 | String type, URI href, Status status, NetworkSection networkSection, |
| 322 | Iterable<NetworkConfigSection> networkConfigSections, |
| 323 | Iterable<NetworkConnectionSection> networkConnectionSections) { |
| 324 | super(id, info, name, operatingSystem, virtualHardwareSections, productSections, additionalSections); |
| 325 | this.type = type; |
| 326 | this.href = href; |
| 327 | this.status = status; |
| 328 | this.networkSection = networkSection; |
| 329 | this.networkConfigSections = ImmutableSet.copyOf(checkNotNull(networkConfigSections, "networkConfigSections")); |
| 330 | this.networkConnectionSections = ImmutableSet.copyOf(checkNotNull(networkConnectionSections, |
| 331 | "networkConnectionSections")); |
| 332 | } |
| 333 | |
| 334 | public Status getStatus() { |
| 335 | return status; |
| 336 | } |
| 337 | |
| 338 | public NetworkSection getNetworkSection() { |
| 339 | return networkSection; |
| 340 | } |
| 341 | |
| 342 | public Set<NetworkConfigSection> getNetworkConfigSections() { |
| 343 | return networkConfigSections; |
| 344 | } |
| 345 | |
| 346 | public Set<NetworkConnectionSection> getNetworkConnectionSections() { |
| 347 | return networkConnectionSections; |
| 348 | } |
| 349 | |
| 350 | public String getType() { |
| 351 | return type; |
| 352 | } |
| 353 | |
| 354 | public URI getHref() { |
| 355 | return href; |
| 356 | } |
| 357 | |
| 358 | @Override |
| 359 | public String toString() { |
| 360 | return String |
| 361 | .format( |
| 362 | "[id=%s, name=%s, info=%s, href=%s,status=%s, type=%s, virtualHardwareSections=%s, operatingSystem=%s, productSections=%s, networkSection=%s, networkConfigSections=%s, networkConnectionSections=%s, additionalSections=%s]", |
| 363 | id, name, info, href, status, type, virtualHardwareSections, operatingSystem, productSections, |
| 364 | networkSection, networkConfigSections, networkConnectionSections, additionalSections); |
| 365 | } |
| 366 | |
| 367 | @Override |
| 368 | public int compareTo(Resource that) { |
| 369 | return (this == that) ? 0 : getHref().compareTo(that.getHref()); |
| 370 | } |
| 371 | |
| 372 | public Builder toBuilder() { |
| 373 | return builder().fromVM(this); |
| 374 | } |
| 375 | |
| 376 | } |