mirror of https://github.com/apache/jclouds.git
Merge branch 'master' of git://github.com/jclouds/jclouds into large-blob
This commit is contained in:
commit
e62fac9d64
|
@ -42,8 +42,8 @@ import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
import org.jclouds.ovf.OvfEnvelope;
|
import org.jclouds.ovf.Envelope;
|
||||||
import org.jclouds.ovf.xml.OvfEnvelopeHandler;
|
import org.jclouds.ovf.xml.EnvelopeHandler;
|
||||||
import org.jclouds.predicates.validators.DnsNameValidator;
|
import org.jclouds.predicates.validators.DnsNameValidator;
|
||||||
import org.jclouds.rest.annotations.BinderParam;
|
import org.jclouds.rest.annotations.BinderParam;
|
||||||
import org.jclouds.rest.annotations.Endpoint;
|
import org.jclouds.rest.annotations.Endpoint;
|
||||||
|
@ -131,9 +131,9 @@ public interface VCloudAsyncClient extends CommonVCloudAsyncClient {
|
||||||
@GET
|
@GET
|
||||||
@Consumes(MediaType.TEXT_XML)
|
@Consumes(MediaType.TEXT_XML)
|
||||||
@Path("/ovf")
|
@Path("/ovf")
|
||||||
@XMLResponseParser(OvfEnvelopeHandler.class)
|
@XMLResponseParser(EnvelopeHandler.class)
|
||||||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||||
ListenableFuture<? extends OvfEnvelope> getOvfEnvelopeForVAppTemplate(@EndpointParam URI vAppTemplate);
|
ListenableFuture<? extends Envelope> getOvfEnvelopeForVAppTemplate(@EndpointParam URI vAppTemplate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see VCloudClient#findVAppTemplateInOrgCatalogNamed
|
* @see VCloudClient#findVAppTemplateInOrgCatalogNamed
|
||||||
|
|
|
@ -28,7 +28,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.jclouds.concurrent.Timeout;
|
import org.jclouds.concurrent.Timeout;
|
||||||
import org.jclouds.ovf.OvfEnvelope;
|
import org.jclouds.ovf.Envelope;
|
||||||
import org.jclouds.vcloud.domain.GuestCustomizationSection;
|
import org.jclouds.vcloud.domain.GuestCustomizationSection;
|
||||||
import org.jclouds.vcloud.domain.NetworkConnectionSection;
|
import org.jclouds.vcloud.domain.NetworkConnectionSection;
|
||||||
import org.jclouds.vcloud.domain.ReferenceType;
|
import org.jclouds.vcloud.domain.ReferenceType;
|
||||||
|
@ -84,7 +84,7 @@ public interface VCloudClient extends CommonVCloudClient {
|
||||||
|
|
||||||
VAppTemplate getVAppTemplate(URI vAppTemplate);
|
VAppTemplate getVAppTemplate(URI vAppTemplate);
|
||||||
|
|
||||||
OvfEnvelope getOvfEnvelopeForVAppTemplate(URI vAppTemplate);
|
Envelope getOvfEnvelopeForVAppTemplate(URI vAppTemplate);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modify the Guest Customization Section of a Virtual Machine
|
* Modify the Guest Customization Section of a Virtual Machine
|
||||||
|
|
|
@ -28,7 +28,7 @@ import org.jclouds.compute.domain.Hardware;
|
||||||
import org.jclouds.compute.domain.HardwareBuilder;
|
import org.jclouds.compute.domain.HardwareBuilder;
|
||||||
import org.jclouds.compute.predicates.ImagePredicates;
|
import org.jclouds.compute.predicates.ImagePredicates;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
import org.jclouds.ovf.OvfEnvelope;
|
import org.jclouds.ovf.Envelope;
|
||||||
import org.jclouds.ovf.VirtualHardwareSection;
|
import org.jclouds.ovf.VirtualHardwareSection;
|
||||||
import org.jclouds.vcloud.VCloudClient;
|
import org.jclouds.vcloud.VCloudClient;
|
||||||
import org.jclouds.vcloud.domain.ReferenceType;
|
import org.jclouds.vcloud.domain.ReferenceType;
|
||||||
|
@ -73,19 +73,19 @@ public class HardwareForVAppTemplate implements Function<VAppTemplate, Hardware>
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
OvfEnvelope ovf = client.getOvfEnvelopeForVAppTemplate(from.getHref());
|
Envelope ovf = client.getOvfEnvelopeForVAppTemplate(from.getHref());
|
||||||
if (ovf == null) {
|
if (ovf == null) {
|
||||||
logger.warn("cannot parse hardware as no ovf envelope found for %s", from);
|
logger.warn("cannot parse hardware as no ovf envelope found for %s", from);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (ovf.getVirtualSystem().getHardware().size() == 0) {
|
if (ovf.getVirtualSystem().getVirtualHardwareSections().size() == 0) {
|
||||||
logger.warn("cannot parse hardware for %s as no hardware sections exist in ovf %s", ovf);
|
logger.warn("cannot parse hardware for %s as no hardware sections exist in ovf %s", ovf);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (ovf.getVirtualSystem().getHardware().size() > 1) {
|
if (ovf.getVirtualSystem().getVirtualHardwareSections().size() > 1) {
|
||||||
logger.warn("multiple hardware choices found. using first", ovf);
|
logger.warn("multiple hardware choices found. using first", ovf);
|
||||||
}
|
}
|
||||||
VirtualHardwareSection hardware = Iterables.get(ovf.getVirtualSystem().getHardware(), 0);
|
VirtualHardwareSection hardware = Iterables.get(ovf.getVirtualSystem().getVirtualHardwareSections(), 0);
|
||||||
HardwareBuilder builder = rasdToHardwareBuilder.apply(hardware.getResourceAllocations());
|
HardwareBuilder builder = rasdToHardwareBuilder.apply(hardware.getResourceAllocations());
|
||||||
builder.location(findLocationForResource.apply(checkNotNull(parent, "parent")));
|
builder.location(findLocationForResource.apply(checkNotNull(parent, "parent")));
|
||||||
builder.ids(from.getHref().toASCIIString()).name(from.getName()).supportsImage(
|
builder.ids(from.getHref().toASCIIString()).name(from.getName()).supportsImage(
|
||||||
|
|
|
@ -27,7 +27,7 @@ import org.jclouds.compute.domain.CIMOperatingSystem;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.ImageBuilder;
|
import org.jclouds.compute.domain.ImageBuilder;
|
||||||
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
|
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
|
||||||
import org.jclouds.ovf.OvfEnvelope;
|
import org.jclouds.ovf.Envelope;
|
||||||
import org.jclouds.vcloud.VCloudClient;
|
import org.jclouds.vcloud.VCloudClient;
|
||||||
import org.jclouds.vcloud.domain.ReferenceType;
|
import org.jclouds.vcloud.domain.ReferenceType;
|
||||||
import org.jclouds.vcloud.domain.VAppTemplate;
|
import org.jclouds.vcloud.domain.VAppTemplate;
|
||||||
|
@ -64,7 +64,7 @@ public class ImageForVAppTemplate implements Function<VAppTemplate, Image> {
|
||||||
builder.name(from.getName());
|
builder.name(from.getName());
|
||||||
builder.location(findLocationForResource.apply(checkNotNull(parent, "parent")));
|
builder.location(findLocationForResource.apply(checkNotNull(parent, "parent")));
|
||||||
builder.description(from.getDescription() != null ? from.getDescription() : from.getName());
|
builder.description(from.getDescription() != null ? from.getDescription() : from.getName());
|
||||||
OvfEnvelope ovf = client.getOvfEnvelopeForVAppTemplate(from.getHref());
|
Envelope ovf = client.getOvfEnvelopeForVAppTemplate(from.getHref());
|
||||||
builder.operatingSystem(CIMOperatingSystem.toComputeOs(ovf));
|
builder.operatingSystem(CIMOperatingSystem.toComputeOs(ovf));
|
||||||
builder.defaultCredentials(credentialsProvider.execute(from));
|
builder.defaultCredentials(credentialsProvider.execute(from));
|
||||||
return builder.build();
|
return builder.build();
|
||||||
|
|
|
@ -32,9 +32,10 @@ public class VCloudVirtualHardwareSection extends VirtualHardwareSection {
|
||||||
protected final String type;
|
protected final String type;
|
||||||
protected final URI href;
|
protected final URI href;
|
||||||
|
|
||||||
public VCloudVirtualHardwareSection(String type, URI href, String info, VirtualSystemSettingData virtualSystem,
|
public VCloudVirtualHardwareSection(String type, URI href, String info, Iterable<String> transports,
|
||||||
|
VirtualSystemSettingData virtualSystem,
|
||||||
Iterable<? extends ResourceAllocationSettingData> resourceAllocations) {
|
Iterable<? extends ResourceAllocationSettingData> resourceAllocations) {
|
||||||
super(info, virtualSystem, resourceAllocations);
|
super(info, transports, virtualSystem, resourceAllocations);
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.href = href;
|
this.href = href;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ public class VCloudVirtualHardwareHandler extends ParseSax.HandlerWithResult<VCl
|
||||||
public VCloudVirtualHardwareSection getResult() {
|
public VCloudVirtualHardwareSection getResult() {
|
||||||
VirtualHardwareSection hardware = hardwareHandler.getResult();
|
VirtualHardwareSection hardware = hardwareHandler.getResult();
|
||||||
return new VCloudVirtualHardwareSection(this.hardware.getType(), this.hardware.getHref(), hardware.getInfo(), hardware
|
return new VCloudVirtualHardwareSection(this.hardware.getType(), this.hardware.getHref(), hardware.getInfo(), hardware
|
||||||
.getSystem(), hardware.getResourceAllocations());
|
.getTransports(), hardware.getSystem(), hardware.getResourceAllocations());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startElement(String uri, String localName, String qName, Attributes attrs) {
|
public void startElement(String uri, String localName, String qName, Attributes attrs) {
|
||||||
|
|
|
@ -42,7 +42,7 @@ import org.jclouds.http.RequiresHttp;
|
||||||
import org.jclouds.http.functions.ParseSax;
|
import org.jclouds.http.functions.ParseSax;
|
||||||
import org.jclouds.http.functions.ReleasePayloadAndReturn;
|
import org.jclouds.http.functions.ReleasePayloadAndReturn;
|
||||||
import org.jclouds.http.functions.ReturnInputStream;
|
import org.jclouds.http.functions.ReturnInputStream;
|
||||||
import org.jclouds.ovf.xml.OvfEnvelopeHandler;
|
import org.jclouds.ovf.xml.EnvelopeHandler;
|
||||||
import org.jclouds.rest.ConfiguresRestClient;
|
import org.jclouds.rest.ConfiguresRestClient;
|
||||||
import org.jclouds.rest.RestClientTest;
|
import org.jclouds.rest.RestClientTest;
|
||||||
import org.jclouds.rest.RestContextFactory;
|
import org.jclouds.rest.RestContextFactory;
|
||||||
|
@ -442,7 +442,7 @@ public class VCloudAsyncClientTest extends RestClientTest<VCloudAsyncClient> {
|
||||||
assertPayloadEquals(request, null, null, false);
|
assertPayloadEquals(request, null, null, false);
|
||||||
|
|
||||||
assertResponseParserClassEquals(method, request, ParseSax.class);
|
assertResponseParserClassEquals(method, request, ParseSax.class);
|
||||||
assertSaxResponseParserClassEquals(method, OvfEnvelopeHandler.class);
|
assertSaxResponseParserClassEquals(method, EnvelopeHandler.class);
|
||||||
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
|
assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class);
|
||||||
|
|
||||||
checkFilters(request);
|
checkFilters(request);
|
||||||
|
|
|
@ -31,7 +31,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
* />
|
* />
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public abstract class SettingData {
|
public abstract class SettingData implements Comparable<SettingData> {
|
||||||
|
|
||||||
public static Builder builder() {
|
public static Builder builder() {
|
||||||
return new Builder();
|
return new Builder();
|
||||||
|
@ -123,4 +123,14 @@ public abstract class SettingData {
|
||||||
return String.format("[elementName=%s, instanceID=%s]", elementName, instanceID);
|
return String.format("[elementName=%s, instanceID=%s]", elementName, instanceID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int compareTo(SettingData o) {
|
||||||
|
if (instanceID == null)
|
||||||
|
return -1;
|
||||||
|
return (this == o) ? 0 : instanceID.compareTo(o.instanceID);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -22,7 +22,7 @@ package org.jclouds.compute.domain;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import org.jclouds.cim.OSType;
|
import org.jclouds.cim.OSType;
|
||||||
import org.jclouds.ovf.OvfEnvelope;
|
import org.jclouds.ovf.Envelope;
|
||||||
|
|
||||||
import com.google.common.annotations.Beta;
|
import com.google.common.annotations.Beta;
|
||||||
|
|
||||||
|
@ -123,8 +123,8 @@ public class CIMOperatingSystem extends OperatingSystem {
|
||||||
return new CIMOperatingSystem(OSType.fromValue(os.getId()), "", null, os.getDescription());
|
return new CIMOperatingSystem(OSType.fromValue(os.getId()), "", null, os.getDescription());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CIMOperatingSystem toComputeOs(OvfEnvelope ovf) {
|
public static CIMOperatingSystem toComputeOs(Envelope ovf) {
|
||||||
return toComputeOs(ovf.getVirtualSystem().getOperatingSystem());
|
return toComputeOs(ovf.getVirtualSystem().getOperatingSystemSection());
|
||||||
}
|
}
|
||||||
|
|
||||||
private OSType osType;
|
private OSType osType;
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <description@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class Configuration {
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
protected String id;
|
||||||
|
protected String label;
|
||||||
|
protected String description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Configuration#getId
|
||||||
|
*/
|
||||||
|
public Builder id(String id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Section#getLabel
|
||||||
|
*/
|
||||||
|
public Builder label(String label) {
|
||||||
|
this.label = label;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Section#getDescription
|
||||||
|
*/
|
||||||
|
public Builder description(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Configuration build() {
|
||||||
|
return new Configuration(id, label, description);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromNetwork(Configuration in) {
|
||||||
|
return id(in.getId()).description(in.getDescription()).label(in.getLabel());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String id;
|
||||||
|
private final String label;
|
||||||
|
private final String description;
|
||||||
|
|
||||||
|
public Configuration(String id, String label, String description) {
|
||||||
|
this.id = id;
|
||||||
|
this.label = label;
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
Configuration other = (Configuration) obj;
|
||||||
|
if (id == null) {
|
||||||
|
if (other.id != null)
|
||||||
|
return false;
|
||||||
|
} else if (!id.equals(other.id))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("Configuration [id=%s, label=%s, description=%s]", id, label, description);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLabel() {
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,144 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The DeploymentOptionSection specifies a discrete set of intended resource configurations. The
|
||||||
|
* author of an OVF package can include sizing metadata for different configurations. A consumer of
|
||||||
|
* the OVF shall select a configuration, for example, by prompting the user. The selected
|
||||||
|
* configuration is visible in the OVF environment, enabling guest software to adapt to the selected
|
||||||
|
* configuration.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class DeploymentOptionSection extends Section<DeploymentOptionSection> {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return builder().fromDeploymentOptionSection(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder extends Section.Builder<DeploymentOptionSection> {
|
||||||
|
protected Set<Configuration> configurations = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DeploymentOptionSection#getConfigurations
|
||||||
|
*/
|
||||||
|
public Builder configuration(Configuration configuration) {
|
||||||
|
this.configurations.add(checkNotNull(configuration, "configuration"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DeploymentOptionSection#getConfigurations
|
||||||
|
*/
|
||||||
|
public Builder configurations(Iterable<Configuration> configurations) {
|
||||||
|
this.configurations = ImmutableSet.<Configuration> copyOf(checkNotNull(configurations, "configurations"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DeploymentOptionSection build() {
|
||||||
|
return new DeploymentOptionSection(info, configurations);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromDeploymentOptionSection(DeploymentOptionSection in) {
|
||||||
|
return info(in.getInfo()).configurations(in.getConfigurations());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder fromSection(Section<DeploymentOptionSection> in) {
|
||||||
|
return Builder.class.cast(super.fromSection(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder info(String info) {
|
||||||
|
return Builder.class.cast(super.info(info));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final Set<Configuration> configurations;
|
||||||
|
|
||||||
|
public DeploymentOptionSection(String info, Iterable<Configuration> configurations) {
|
||||||
|
super(info);
|
||||||
|
this.configurations = ImmutableSet.<Configuration> copyOf(checkNotNull(configurations, "configurations"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = super.hashCode();
|
||||||
|
result = prime * result + ((configurations == null) ? 0 : configurations.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (!super.equals(obj))
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
DeploymentOptionSection other = (DeploymentOptionSection) obj;
|
||||||
|
if (configurations == null) {
|
||||||
|
if (other.configurations != null)
|
||||||
|
return false;
|
||||||
|
} else if (!configurations.equals(other.configurations))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("[info=%s, configurations=%s]", info, configurations);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<Configuration> getConfigurations() {
|
||||||
|
return configurations;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,237 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <description@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class Disk implements Comparable<Disk>{
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
private String id;
|
||||||
|
private Long capacity;
|
||||||
|
private String parentRef;
|
||||||
|
private String fileRef;
|
||||||
|
private URI format;
|
||||||
|
private Long populatedSize;
|
||||||
|
private String capacityAllocationUnits;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Disk#getId
|
||||||
|
*/
|
||||||
|
public Builder id(String id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Disk#getCapacity
|
||||||
|
*/
|
||||||
|
public Builder capacity(Long capacity) {
|
||||||
|
this.capacity = capacity;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Disk#getParentRef
|
||||||
|
*/
|
||||||
|
public Builder parentRef(String parentRef) {
|
||||||
|
this.parentRef = parentRef;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Disk#getFileRef
|
||||||
|
*/
|
||||||
|
public Builder fileRef(String fileRef) {
|
||||||
|
this.fileRef = fileRef;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Disk#getFormat
|
||||||
|
*/
|
||||||
|
public Builder format(URI format) {
|
||||||
|
this.format = format;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Disk#getPopulatedSize
|
||||||
|
*/
|
||||||
|
public Builder populatedSize(Long populatedSize) {
|
||||||
|
this.populatedSize = populatedSize;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Disk#getCapacityAllocationUnits
|
||||||
|
*/
|
||||||
|
public Builder capacityAllocationUnits(String capacityAllocationUnits) {
|
||||||
|
this.capacityAllocationUnits = capacityAllocationUnits;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Disk build() {
|
||||||
|
return new Disk(id, capacity, parentRef, fileRef, format, populatedSize, capacityAllocationUnits);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromDisk(Disk in) {
|
||||||
|
return id(in.getId()).capacity(in.getCapacity()).parentRef(in.getParentRef()).fileRef(in.getFileRef()).format(
|
||||||
|
in.getFormat()).populatedSize(in.getPopulatedSize()).capacityAllocationUnits(
|
||||||
|
in.getCapacityAllocationUnits());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String id;
|
||||||
|
private final Long capacity;
|
||||||
|
private final String parentRef;
|
||||||
|
private final String fileRef;
|
||||||
|
private final URI format;
|
||||||
|
private final Long populatedSize;
|
||||||
|
private final String capacityAllocationUnits;
|
||||||
|
|
||||||
|
public Disk(String id, Long capacity, String parentRef, String fileRef, URI format, Long populatedSize,
|
||||||
|
String capacityAllocationUnits) {
|
||||||
|
this.id = id;
|
||||||
|
this.capacity = capacity;
|
||||||
|
this.parentRef = parentRef;
|
||||||
|
this.fileRef = fileRef;
|
||||||
|
this.format = format;
|
||||||
|
this.populatedSize = populatedSize;
|
||||||
|
this.capacityAllocationUnits = capacityAllocationUnits;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Each virtual disk is represented by a Disk element that shall be given a identifier using the
|
||||||
|
* {@code id} attribute, the identifier shall be unique within the {@link DiskSection}.
|
||||||
|
*/
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The capacity of a virtual disk shall be specified by the {@code capacity} attribute with an
|
||||||
|
* xs:long integer value. The default unit of allocation shall be bytes.
|
||||||
|
*/
|
||||||
|
public Long getCapacity() {
|
||||||
|
return capacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OVF allows a disk image to be represented as a set of modified blocks in comparison to a
|
||||||
|
* parent image. The use of parent disks can often significantly reduce the size of an OVF
|
||||||
|
* package, if it contains multiple disks with similar content. For a Disk element, a parent disk
|
||||||
|
* may optionally be specified using the {@code parentRef} attribute, which shall contain a valid
|
||||||
|
* ovf:id reference to a different Disk element. If a disk block does not exist locally, lookup
|
||||||
|
* for that disk block then occurs in the parent disk. In {@link DiskSection}, parent Disk
|
||||||
|
* elements shall occur before child Disk elements that refer to them.
|
||||||
|
*/
|
||||||
|
public String getParentRef() {
|
||||||
|
return parentRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ovf:fileRef attribute denotes the virtual disk content by identifying an existing File
|
||||||
|
* element in the References element, the File element is identified by matching its {@code id}
|
||||||
|
* attribute value with the {@code fileRef} attribute value. Omitting the {@code fileRef}
|
||||||
|
* attribute shall indicate an empty disk. In this case, the disk shall be created and the entire
|
||||||
|
* disk content zeroed at installation time. The guest software will typically format empty disks
|
||||||
|
* in some file system format.
|
||||||
|
*/
|
||||||
|
public String getFileRef() {
|
||||||
|
return fileRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The format URI of a non-empty virtual disk shall be specified by the {@code format} attribute.
|
||||||
|
*/
|
||||||
|
public URI getFormat() {
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For non-empty disks, the actual used size of the disk may optionally be specified using the
|
||||||
|
* {@code populatedSize} attribute. The unit of this attribute is always bytes. {@code
|
||||||
|
* populatedSize} is allowed to be an estimate of used disk size but shall not be larger than
|
||||||
|
* {@code capacity}.
|
||||||
|
*/
|
||||||
|
public Long getPopulatedSize() {
|
||||||
|
return populatedSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The optional string attribute {@code ovf:capacityAllocationUnits} may be used to specify a
|
||||||
|
* particular unit of allocation. Values for {@code ovf:capacityAllocationUnits} shall match the
|
||||||
|
* format for programmatic units defined in DSP0004.
|
||||||
|
*/
|
||||||
|
public String getCapacityAllocationUnits() {
|
||||||
|
return capacityAllocationUnits;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
Disk other = (Disk) obj;
|
||||||
|
if (id == null) {
|
||||||
|
if (other.id != null)
|
||||||
|
return false;
|
||||||
|
} else if (!id.equals(other.id))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String
|
||||||
|
.format(
|
||||||
|
"[id=%s, capacity=%s, capacityAllocationUnits=%s, fileRef=%s, format=%s, parentRef=%s, populatedSize=%s]",
|
||||||
|
id, capacity, capacityAllocationUnits, fileRef, format, parentRef, populatedSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int compareTo(Disk o) {
|
||||||
|
if (id == null)
|
||||||
|
return -1;
|
||||||
|
return (this == o) ? 0 : id.compareTo(o.id);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,153 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A DiskSection describes meta-information about virtual disks in the OVF package. Virtual disks
|
||||||
|
* and their metadata are described outside the virtual hardware to facilitate sharing between
|
||||||
|
* virtual machines within an OVF package.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class DiskSection extends Section<DiskSection> {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return new Builder().fromDiskSection(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder extends Section.Builder<DiskSection> {
|
||||||
|
protected Set<Disk> disks = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DiskSection#getDisks
|
||||||
|
*/
|
||||||
|
public Builder disk(Disk disk) {
|
||||||
|
this.disks.add(checkNotNull(disk, "disk"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DiskSection#getDisks
|
||||||
|
*/
|
||||||
|
public Builder disks(Iterable<Disk> disks) {
|
||||||
|
this.disks = ImmutableSet.<Disk> copyOf(checkNotNull(disks, "disks"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public DiskSection build() {
|
||||||
|
return new DiskSection(info, disks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromDiskSection(DiskSection in) {
|
||||||
|
return disks(in.getDisks()).info(in.getInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder fromSection(Section<DiskSection> in) {
|
||||||
|
return (Builder) super.fromSection(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder info(String info) {
|
||||||
|
return (Builder) super.info(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Set<Disk> disks;
|
||||||
|
|
||||||
|
public DiskSection(String info, Iterable<Disk> disks) {
|
||||||
|
super(info);
|
||||||
|
this.disks = ImmutableSet.<Disk> copyOf(checkNotNull(disks, "disks"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All disks referred to from Connection elements in all {@link VirtualHardwareSection} elements
|
||||||
|
* shall be defined in the DiskSection.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Set<Disk> getDisks() {
|
||||||
|
return disks;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((info == null) ? 0 : info.hashCode());
|
||||||
|
result = prime * result + ((disks == null) ? 0 : disks.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
DiskSection other = (DiskSection) obj;
|
||||||
|
if (info == null) {
|
||||||
|
if (other.info != null)
|
||||||
|
return false;
|
||||||
|
} else if (!info.equals(other.info))
|
||||||
|
return false;
|
||||||
|
if (disks == null) {
|
||||||
|
if (other.disks != null)
|
||||||
|
return false;
|
||||||
|
} else if (!disks.equals(other.disks))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("[info=%s, disks=%s]", info, disks);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,208 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMultimap;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.LinkedHashMultimap;
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class Envelope {
|
||||||
|
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return new Builder().fromEnvelope(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
protected Set<DiskSection> diskSections = Sets.newLinkedHashSet();
|
||||||
|
protected Set<NetworkSection> networkSections = Sets.newLinkedHashSet();
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected Multimap<String, Section> additionalSections = LinkedHashMultimap.create();
|
||||||
|
protected VirtualSystem virtualSystem;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Envelope#getDiskSections
|
||||||
|
*/
|
||||||
|
public Builder diskSection(DiskSection diskSection) {
|
||||||
|
this.diskSections.add(checkNotNull(diskSection, "diskSection"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Envelope#getDiskSections
|
||||||
|
*/
|
||||||
|
public Builder diskSections(Iterable<? extends DiskSection> diskSections) {
|
||||||
|
this.diskSections = ImmutableSet.<DiskSection> copyOf(checkNotNull(diskSections, "diskSections"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Envelope#getNetworkSections
|
||||||
|
*/
|
||||||
|
public Builder networkSection(NetworkSection networkSection) {
|
||||||
|
this.networkSections.add(checkNotNull(networkSection, "networkSection"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Envelope#getNetworkSections
|
||||||
|
*/
|
||||||
|
public Builder networkSections(Iterable<? extends NetworkSection> networkSections) {
|
||||||
|
this.networkSections = ImmutableSet.<NetworkSection> copyOf(checkNotNull(networkSections, "networkSections"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Envelope#getAdditionalSections
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Builder additionalSection(String name, Section additionalSection) {
|
||||||
|
this.additionalSections.put(checkNotNull(name, "name"), checkNotNull(additionalSection, "additionalSection"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Envelope#getAdditionalSections
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Builder additionalSections(Multimap<String, Section> additionalSections) {
|
||||||
|
this.additionalSections = ImmutableMultimap.<String, Section> copyOf(checkNotNull(additionalSections,
|
||||||
|
"additionalSections"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Envelope#getVirtualSystem
|
||||||
|
*/
|
||||||
|
public Builder virtualSystem(VirtualSystem virtualSystem) {
|
||||||
|
this.virtualSystem = virtualSystem;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
public Envelope build() {
|
||||||
|
return new Envelope(diskSections, networkSections, additionalSections, virtualSystem);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromEnvelope(Envelope in) {
|
||||||
|
return virtualSystem(in.getVirtualSystem()).diskSections(in.getDiskSections())
|
||||||
|
.networkSections(networkSections).additionalSections(in.getAdditionalSections());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Set<DiskSection> diskSections;
|
||||||
|
private final Set<NetworkSection> networkSections;
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private final Multimap<String, Section> additionalSections;
|
||||||
|
private final VirtualSystem virtualSystem;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Envelope(Iterable<? extends DiskSection> diskSections, Iterable<? extends NetworkSection> networkSections,
|
||||||
|
Multimap<String, Section> additionalSections, VirtualSystem virtualSystem) {
|
||||||
|
this.diskSections = ImmutableSet.copyOf(checkNotNull(diskSections, "diskSections"));
|
||||||
|
this.networkSections = ImmutableSet.copyOf(checkNotNull(networkSections, "networkSections"));
|
||||||
|
this.additionalSections = ImmutableMultimap.copyOf(checkNotNull(additionalSections, "additionalSections"));
|
||||||
|
this.virtualSystem = checkNotNull(virtualSystem, "virtualSystem");
|
||||||
|
}
|
||||||
|
|
||||||
|
public VirtualSystem getVirtualSystem() {
|
||||||
|
return virtualSystem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<? extends DiskSection> getDiskSections() {
|
||||||
|
return diskSections;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Multimap<String, Section> getAdditionalSections() {
|
||||||
|
return additionalSections;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ((additionalSections == null) ? 0 : additionalSections.hashCode());
|
||||||
|
result = prime * result + ((diskSections == null) ? 0 : diskSections.hashCode());
|
||||||
|
result = prime * result + ((networkSections == null) ? 0 : networkSections.hashCode());
|
||||||
|
result = prime * result + ((virtualSystem == null) ? 0 : virtualSystem.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
Envelope other = (Envelope) obj;
|
||||||
|
if (additionalSections == null) {
|
||||||
|
if (other.additionalSections != null)
|
||||||
|
return false;
|
||||||
|
} else if (!additionalSections.equals(other.additionalSections))
|
||||||
|
return false;
|
||||||
|
if (diskSections == null) {
|
||||||
|
if (other.diskSections != null)
|
||||||
|
return false;
|
||||||
|
} else if (!diskSections.equals(other.diskSections))
|
||||||
|
return false;
|
||||||
|
if (networkSections == null) {
|
||||||
|
if (other.networkSections != null)
|
||||||
|
return false;
|
||||||
|
} else if (!networkSections.equals(other.networkSections))
|
||||||
|
return false;
|
||||||
|
if (virtualSystem == null) {
|
||||||
|
if (other.virtualSystem != null)
|
||||||
|
return false;
|
||||||
|
} else if (!virtualSystem.equals(other.virtualSystem))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("[diskSections=%s, networkSections=%s, additionalSections=%s, virtualSystem=%s]",
|
||||||
|
diskSections, networkSections, additionalSections, virtualSystem);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<NetworkSection> getNetworkSections() {
|
||||||
|
return networkSections;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
* Copyright (C) 2010 Cloud Conscious, LLC. <description@cloudconscious.com>
|
||||||
*
|
*
|
||||||
* ====================================================================
|
* ====================================================================
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@ -19,11 +19,45 @@
|
||||||
|
|
||||||
package org.jclouds.ovf;
|
package org.jclouds.ovf;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class Network {
|
public class Network {
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder {
|
||||||
|
protected String name;
|
||||||
|
protected String description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Network#getName
|
||||||
|
*/
|
||||||
|
public Builder name(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Section#getDescription
|
||||||
|
*/
|
||||||
|
public Builder description(String description) {
|
||||||
|
this.description = description;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Network build() {
|
||||||
|
return new Network(name, description);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromNetwork(Network in) {
|
||||||
|
return name(in.getName()).description(in.getDescription());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final String description;
|
private final String description;
|
||||||
|
|
||||||
|
@ -65,7 +99,7 @@ public class Network {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Network [name=" + name + ", description=" + description + "]";
|
return "[name=" + name + ", description=" + description + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
|
|
|
@ -19,31 +19,92 @@
|
||||||
|
|
||||||
package org.jclouds.ovf;
|
package org.jclouds.ovf;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The NetworkSection element shall list all logical networks used in the OVF package.
|
* The NetworkSection element shall list all logical networks used in the OVF package.
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class NetworkSection {
|
public class NetworkSection extends Section<NetworkSection> {
|
||||||
private final String info;
|
|
||||||
private final Set<Network> networks;
|
|
||||||
|
|
||||||
public NetworkSection(String info, Iterable<Network> networks) {
|
@SuppressWarnings("unchecked")
|
||||||
this.info = info;
|
public static Builder builder() {
|
||||||
this.networks = ImmutableSet.<Network> copyOf(networks);
|
return new Builder();
|
||||||
}
|
|
||||||
|
|
||||||
public String getInfo() {
|
|
||||||
return info;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All networks referred to from Connection elements in all {@link VirtualHardwareSection} elements shall
|
* {@inheritDoc}
|
||||||
* be defined in the NetworkSection.
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return builder().fromNetworkSection(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder extends Section.Builder<NetworkSection> {
|
||||||
|
protected Set<Network> networks = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkSection#getNetworks
|
||||||
|
*/
|
||||||
|
public Builder network(Network network) {
|
||||||
|
this.networks.add(checkNotNull(network, "network"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see NetworkSection#getNetworks
|
||||||
|
*/
|
||||||
|
public Builder networks(Iterable<Network> networks) {
|
||||||
|
this.networks = ImmutableSet.<Network> copyOf(checkNotNull(networks, "networks"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public NetworkSection build() {
|
||||||
|
return new NetworkSection(info, networks);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromNetworkSection(NetworkSection in) {
|
||||||
|
return networks(in.getNetworks()).info(in.getInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder fromSection(Section<NetworkSection> in) {
|
||||||
|
return Builder.class.cast(super.fromSection(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder info(String info) {
|
||||||
|
return Builder.class.cast(super.info(info));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private final Set<Network> networks;
|
||||||
|
|
||||||
|
public NetworkSection(String info, Iterable<Network> networks) {
|
||||||
|
super(info);
|
||||||
|
this.networks = ImmutableSet.<Network> copyOf(checkNotNull(networks, "networks"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All networks referred to from Connection elements in all {@link VirtualHardwareSection}
|
||||||
|
* elements shall be defined in the NetworkSection.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
@ -84,7 +145,7 @@ public class NetworkSection {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "[info=" + info + ", networks=" + networks + "]";
|
return String.format("[info=%s, networks=%s]", info, networks);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -28,15 +28,23 @@ import org.jclouds.cim.OSType;
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class OperatingSystemSection {
|
public class OperatingSystemSection extends Section<OperatingSystemSection> {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public static Builder builder() {
|
public static Builder builder() {
|
||||||
return new Builder();
|
return new Builder();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Builder {
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return builder().fromOperatingSystemSection(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder extends Section.Builder<OperatingSystemSection> {
|
||||||
protected Integer id;
|
protected Integer id;
|
||||||
protected String info;
|
|
||||||
protected String description;
|
protected String description;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -47,14 +55,6 @@ public class OperatingSystemSection {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @see OperatingSystemSection#getInfo
|
|
||||||
*/
|
|
||||||
public Builder info(String info) {
|
|
||||||
this.info = info;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see OperatingSystemSection#getDescription
|
* @see OperatingSystemSection#getDescription
|
||||||
*/
|
*/
|
||||||
|
@ -63,6 +63,10 @@ public class OperatingSystemSection {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
public OperatingSystemSection build() {
|
public OperatingSystemSection build() {
|
||||||
return new OperatingSystemSection(id, info, description);
|
return new OperatingSystemSection(id, info, description);
|
||||||
}
|
}
|
||||||
|
@ -70,15 +74,31 @@ public class OperatingSystemSection {
|
||||||
public Builder fromOperatingSystemSection(OperatingSystemSection in) {
|
public Builder fromOperatingSystemSection(OperatingSystemSection in) {
|
||||||
return id(in.getId()).info(in.getInfo()).description(in.getDescription());
|
return id(in.getId()).info(in.getInfo()).description(in.getDescription());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder fromSection(Section<OperatingSystemSection> in) {
|
||||||
|
return Builder.class.cast(super.fromSection(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder info(String info) {
|
||||||
|
return Builder.class.cast(super.info(info));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final Integer id;
|
protected final Integer id;
|
||||||
protected final String info;
|
|
||||||
protected final String description;
|
protected final String description;
|
||||||
|
|
||||||
public OperatingSystemSection(@Nullable Integer id, @Nullable String info, @Nullable String description) {
|
public OperatingSystemSection(@Nullable Integer id, @Nullable String info, @Nullable String description) {
|
||||||
|
super(info);
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.info = info;
|
|
||||||
this.description = description;
|
this.description = description;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,14 +111,6 @@ public class OperatingSystemSection {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return ovf info
|
|
||||||
*/
|
|
||||||
public String getInfo() {
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return description or null
|
* @return description or null
|
||||||
|
@ -144,13 +156,9 @@ public class OperatingSystemSection {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder toBuilder() {
|
|
||||||
return builder().fromOperatingSystemSection(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "[id=" + getId() + ", info=" + getInfo() + ", description=" + getDescription() + "]";
|
return String.format("[info=%s, id=%s, description=%s]", info, id, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -19,29 +19,62 @@
|
||||||
|
|
||||||
package org.jclouds.ovf;
|
package org.jclouds.ovf;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* Metadata about a virtual machine or grouping of them
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class OvfEnvelope {
|
public class Section<T extends Section<T>> {
|
||||||
private final VirtualSystem virtualSystem;
|
|
||||||
|
|
||||||
public OvfEnvelope(VirtualSystem virtualSystem) {
|
public static <T extends Section<T>> Builder<T> builder() {
|
||||||
this.virtualSystem = checkNotNull(virtualSystem, "virtualSystem");
|
return new Builder<T>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public VirtualSystem getVirtualSystem() {
|
public Builder<T> toBuilder() {
|
||||||
return virtualSystem;
|
return new Builder<T>().fromSection(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder<T extends Section<T>> {
|
||||||
|
protected String info;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Section#getInfo
|
||||||
|
*/
|
||||||
|
public Builder<T> info(String info) {
|
||||||
|
this.info = info;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Section<T> build() {
|
||||||
|
return new Section<T>(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder<T> fromSection(Section<T> in) {
|
||||||
|
return info(in.getInfo());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final String info;
|
||||||
|
|
||||||
|
public Section(@Nullable String info) {
|
||||||
|
this.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return ovf info
|
||||||
|
*/
|
||||||
|
public String getInfo() {
|
||||||
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = prime * result + ((virtualSystem == null) ? 0 : virtualSystem.hashCode());
|
result = prime * result + ((info == null) ? 0 : info.hashCode());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,17 +86,18 @@ public class OvfEnvelope {
|
||||||
return false;
|
return false;
|
||||||
if (getClass() != obj.getClass())
|
if (getClass() != obj.getClass())
|
||||||
return false;
|
return false;
|
||||||
OvfEnvelope other = (OvfEnvelope) obj;
|
Section<?> other = (Section<?>) obj;
|
||||||
if (virtualSystem == null) {
|
if (info == null) {
|
||||||
if (other.virtualSystem != null)
|
if (other.info != null)
|
||||||
return false;
|
return false;
|
||||||
} else if (!virtualSystem.equals(other.virtualSystem))
|
} else if (!info.equals(other.info))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "[virtualSystem=" + virtualSystem + "]";
|
return "[info=" + getInfo() + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -27,30 +27,141 @@ import org.jclouds.cim.ResourceAllocationSettingData;
|
||||||
import org.jclouds.cim.VirtualSystemSettingData;
|
import org.jclouds.cim.VirtualSystemSettingData;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
|
||||||
* The virtual hardware required by a virtual machine is specified in VirtualHardwareSection.
|
* The virtual hardware required by a virtual machine is specified in VirtualHardwareSection.
|
||||||
* <p/>
|
* <p/>
|
||||||
* This specification supports abstract or incomplete hardware descriptions in which only the major
|
* This specification supports abstract or incomplete hardware descriptions in which only the major
|
||||||
* devices are described. The hypervisor is allowed to create additional virtual hardware
|
* devices are described. The hypervisor is allowed to create additional virtual hardware
|
||||||
* controllers and devices, as long as the required devices listed in the descriptor are realized.
|
* controllers and devices, as long as the required devices listed in the descriptor are realized.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class VirtualHardwareSection {
|
public class VirtualHardwareSection extends Section<VirtualHardwareSection> {
|
||||||
|
|
||||||
protected final String info;
|
@SuppressWarnings("unchecked")
|
||||||
protected final VirtualSystemSettingData virtualSystem;
|
public static Builder builder() {
|
||||||
protected final Set<ResourceAllocationSettingData> resourceAllocations;
|
return new Builder();
|
||||||
|
|
||||||
public VirtualHardwareSection(String info, VirtualSystemSettingData virtualSystem,
|
|
||||||
Iterable<? extends ResourceAllocationSettingData> resourceAllocations) {
|
|
||||||
this.info = info;
|
|
||||||
this.virtualSystem = virtualSystem;
|
|
||||||
this.resourceAllocations = ImmutableSet.copyOf(checkNotNull(resourceAllocations, "resourceAllocations"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getInfo() {
|
/**
|
||||||
return info;
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return builder().fromVirtualHardwareSection(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder extends Section.Builder<VirtualHardwareSection> {
|
||||||
|
protected VirtualSystemSettingData virtualSystem;
|
||||||
|
protected Set<String> transports = Sets.newLinkedHashSet();
|
||||||
|
protected Set<ResourceAllocationSettingData> resourceAllocations = Sets.newLinkedHashSet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualHardwareSection#getSystem
|
||||||
|
*/
|
||||||
|
public Builder system(VirtualSystemSettingData virtualSystem) {
|
||||||
|
this.virtualSystem = virtualSystem;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualHardwareSection#getTransports
|
||||||
|
*/
|
||||||
|
public Builder transport(String transport) {
|
||||||
|
this.transports.add(checkNotNull(transport, "transport"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualHardwareSection#getTransports
|
||||||
|
*/
|
||||||
|
public Builder transports(Iterable<String> transports) {
|
||||||
|
this.transports = ImmutableSet.<String> copyOf(checkNotNull(transports, "transports"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualHardwareSection#getResourceAllocations
|
||||||
|
*/
|
||||||
|
public Builder resourceAllocation(ResourceAllocationSettingData resourceAllocation) {
|
||||||
|
this.resourceAllocations.add(checkNotNull(resourceAllocation, "resourceAllocation"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualHardwareSection#getResourceAllocations
|
||||||
|
*/
|
||||||
|
public Builder resourceAllocations(Iterable<? extends ResourceAllocationSettingData> resourceAllocations) {
|
||||||
|
this.resourceAllocations = ImmutableSet.<ResourceAllocationSettingData> copyOf(checkNotNull(
|
||||||
|
resourceAllocations, "resourceAllocations"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public VirtualHardwareSection build() {
|
||||||
|
return new VirtualHardwareSection(info, transports, virtualSystem, resourceAllocations);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromVirtualHardwareSection(VirtualHardwareSection in) {
|
||||||
|
return resourceAllocations(in.getResourceAllocations()).transports(in.getTransports()).system(
|
||||||
|
in.getSystem()).info(in.getInfo());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder fromSection(Section<VirtualHardwareSection> in) {
|
||||||
|
return Builder.class.cast(super.fromSection(in));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder info(String info) {
|
||||||
|
return Builder.class.cast(super.info(info));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final VirtualSystemSettingData virtualSystem;
|
||||||
|
protected final Set<String> transports;
|
||||||
|
protected final Set<ResourceAllocationSettingData> resourceAllocations;
|
||||||
|
|
||||||
|
public VirtualHardwareSection(String info, Iterable<String> transports, VirtualSystemSettingData virtualSystem,
|
||||||
|
Iterable<? extends ResourceAllocationSettingData> resourceAllocations) {
|
||||||
|
super(info);
|
||||||
|
this.virtualSystem = virtualSystem;
|
||||||
|
this.transports = ImmutableSet.<String> copyOf(checkNotNull(transports, "transports"));
|
||||||
|
this.resourceAllocations = ImmutableSet.<ResourceAllocationSettingData> copyOf(checkNotNull(resourceAllocations,
|
||||||
|
"resourceAllocations"));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* transport types define methods by which the environment document is communicated from the
|
||||||
|
* deployment platform to the guest software.
|
||||||
|
* <p/>
|
||||||
|
* To enable interoperability, this specification defines an "iso" transport type which all
|
||||||
|
* implementations that support CD-ROM devices are required to support. The iso transport
|
||||||
|
* communicates the environment 1346 document by making a dynamically generated ISO image
|
||||||
|
* available to the guest software. To support the iso transport type, prior to booting a virtual
|
||||||
|
* machine, an implementation shall make an ISO 9660 read-only disk image available as backing
|
||||||
|
* for a disconnected CD-ROM. If the iso transport is selected for a VirtualHardwareSection, at
|
||||||
|
* least one disconnected CD-ROM device shall be present in this section.
|
||||||
|
* <p/>
|
||||||
|
* Support for the "iso" transport type is not a requirement for virtual hardware architectures
|
||||||
|
* or guest 1351 operating systems which do not have CD-ROM device support.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Set<String> getTransports() {
|
||||||
|
return transports;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VirtualSystemSettingData getSystem() {
|
public VirtualSystemSettingData getSystem() {
|
||||||
|
@ -61,17 +172,12 @@ public class VirtualHardwareSection {
|
||||||
return resourceAllocations;
|
return resourceAllocations;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "[info=" + getInfo() + ", virtualSystem=" + getSystem() + "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = super.hashCode();
|
||||||
result = prime * result + ((info == null) ? 0 : info.hashCode());
|
|
||||||
result = prime * result + ((resourceAllocations == null) ? 0 : resourceAllocations.hashCode());
|
result = prime * result + ((resourceAllocations == null) ? 0 : resourceAllocations.hashCode());
|
||||||
|
result = prime * result + ((transports == null) ? 0 : transports.hashCode());
|
||||||
result = prime * result + ((virtualSystem == null) ? 0 : virtualSystem.hashCode());
|
result = prime * result + ((virtualSystem == null) ? 0 : virtualSystem.hashCode());
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -80,21 +186,21 @@ public class VirtualHardwareSection {
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (this == obj)
|
if (this == obj)
|
||||||
return true;
|
return true;
|
||||||
if (obj == null)
|
if (!super.equals(obj))
|
||||||
return false;
|
return false;
|
||||||
if (getClass() != obj.getClass())
|
if (getClass() != obj.getClass())
|
||||||
return false;
|
return false;
|
||||||
VirtualHardwareSection other = (VirtualHardwareSection) obj;
|
VirtualHardwareSection other = (VirtualHardwareSection) obj;
|
||||||
if (info == null) {
|
|
||||||
if (other.info != null)
|
|
||||||
return false;
|
|
||||||
} else if (!info.equals(other.info))
|
|
||||||
return false;
|
|
||||||
if (resourceAllocations == null) {
|
if (resourceAllocations == null) {
|
||||||
if (other.resourceAllocations != null)
|
if (other.resourceAllocations != null)
|
||||||
return false;
|
return false;
|
||||||
} else if (!resourceAllocations.equals(other.resourceAllocations))
|
} else if (!resourceAllocations.equals(other.resourceAllocations))
|
||||||
return false;
|
return false;
|
||||||
|
if (transports == null) {
|
||||||
|
if (other.transports != null)
|
||||||
|
return false;
|
||||||
|
} else if (!transports.equals(other.transports))
|
||||||
|
return false;
|
||||||
if (virtualSystem == null) {
|
if (virtualSystem == null) {
|
||||||
if (other.virtualSystem != null)
|
if (other.virtualSystem != null)
|
||||||
return false;
|
return false;
|
||||||
|
@ -103,4 +209,10 @@ public class VirtualHardwareSection {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return String.format("[info=%s, resourceAllocations=%s, transports=%s, virtualSystem=%s]", info,
|
||||||
|
resourceAllocations, transports, virtualSystem);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -23,63 +23,178 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMultimap;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.LinkedHashMultimap;
|
||||||
|
import com.google.common.collect.Multimap;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class VirtualSystem {
|
public class VirtualSystem extends Section<VirtualSystem> {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static Builder builder() {
|
||||||
|
return new Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder toBuilder() {
|
||||||
|
return new Builder().fromVirtualSystem(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Builder extends Section.Builder<VirtualSystem> {
|
||||||
|
protected String id;
|
||||||
|
protected String name;
|
||||||
|
protected OperatingSystemSection operatingSystem;
|
||||||
|
protected Set<VirtualHardwareSection> hardwareSections = Sets.newLinkedHashSet();
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected Multimap<String, Section> additionalSections = LinkedHashMultimap.create();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualSystem#getName
|
||||||
|
*/
|
||||||
|
public Builder name(String name) {
|
||||||
|
this.name = name;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualSystem#getId
|
||||||
|
*/
|
||||||
|
public Builder id(String id) {
|
||||||
|
this.id = id;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualSystem#getOperatingSystemSection
|
||||||
|
*/
|
||||||
|
public Builder operatingSystemSection(OperatingSystemSection operatingSystem) {
|
||||||
|
this.operatingSystem = operatingSystem;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualSystem#getVirtualHardwareSections
|
||||||
|
*/
|
||||||
|
public Builder hardwareSection(VirtualHardwareSection hardwareSection) {
|
||||||
|
this.hardwareSections.add(checkNotNull(hardwareSection, "hardwareSection"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualSystem#getVirtualHardwareSections
|
||||||
|
*/
|
||||||
|
public Builder hardwareSections(Iterable<? extends VirtualHardwareSection> hardwareSections) {
|
||||||
|
this.hardwareSections = ImmutableSet.<VirtualHardwareSection> copyOf(checkNotNull(hardwareSections,
|
||||||
|
"hardwareSections"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualSystem#getAdditionalSections
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Builder additionalSection(String name, Section additionalSection) {
|
||||||
|
this.additionalSections.put(checkNotNull(name, "name"), checkNotNull(additionalSection, "additionalSection"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see VirtualSystem#getAdditionalSections
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Builder additionalSections(Multimap<String, Section> additionalSections) {
|
||||||
|
this.additionalSections = ImmutableMultimap.<String, Section> copyOf(checkNotNull(additionalSections,
|
||||||
|
"additionalSections"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public VirtualSystem build() {
|
||||||
|
return new VirtualSystem(id, info, name, operatingSystem, hardwareSections, additionalSections);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder fromVirtualSystem(VirtualSystem in) {
|
||||||
|
return fromSection(in).id(in.getId()).name(in.getName())
|
||||||
|
.operatingSystemSection(in.getOperatingSystemSection()).hardwareSections(
|
||||||
|
in.getVirtualHardwareSections()).additionalSections(in.getAdditionalSections());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder fromSection(Section<VirtualSystem> in) {
|
||||||
|
return (Builder) super.fromSection(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Builder info(String info) {
|
||||||
|
return (Builder) super.info(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private final String id;
|
private final String id;
|
||||||
private final String info;
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final OperatingSystemSection operatingSystem;
|
private final OperatingSystemSection operatingSystem;
|
||||||
private final Set<VirtualHardwareSection> hardware = Sets.newLinkedHashSet();
|
private final Set<VirtualHardwareSection> hardwareSections;
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private final Multimap<String, Section> additionalSections;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
public VirtualSystem(String id, String info, String name, OperatingSystemSection operatingSystem,
|
public VirtualSystem(String id, String info, String name, OperatingSystemSection operatingSystem,
|
||||||
Iterable<? extends VirtualHardwareSection> hardware) {
|
Iterable<? extends VirtualHardwareSection> hardwareSections, Multimap<String, Section> additionalSections) {
|
||||||
|
super(info);
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.info = info;
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.operatingSystem = checkNotNull(operatingSystem, "operatingSystem");
|
this.operatingSystem = checkNotNull(operatingSystem, "operatingSystem");
|
||||||
Iterables.addAll(this.hardware, checkNotNull(hardware, "hardware"));
|
this.hardwareSections = ImmutableSet.copyOf(checkNotNull(hardwareSections, "hardwareSections"));
|
||||||
|
this.additionalSections = ImmutableMultimap.copyOf(checkNotNull(additionalSections, "additionalSections"));
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getId() {
|
public String getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getInfo() {
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
public OperatingSystemSection getOperatingSystem() {
|
public OperatingSystemSection getOperatingSystemSection() {
|
||||||
return operatingSystem;
|
return operatingSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Each VirtualSystem element may contain one or more VirtualHardwareSection elements, each of
|
* Each VirtualSystem element may contain one or more VirtualHardwareSection elements, each of
|
||||||
* which describes the virtual hardware required by the virtual system.
|
* which describes the virtual hardwareSections required by the virtual system.
|
||||||
* */
|
* */
|
||||||
public Set<? extends VirtualHardwareSection> getHardware() {
|
public Set<? extends VirtualHardwareSection> getVirtualHardwareSections() {
|
||||||
return hardware;
|
return hardwareSections;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Multimap<String, Section> getAdditionalSections() {
|
||||||
|
return additionalSections;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
result = prime * result + ((hardware == null) ? 0 : hardware.hashCode());
|
|
||||||
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
result = prime * result + ((id == null) ? 0 : id.hashCode());
|
||||||
result = prime * result + ((info == null) ? 0 : info.hashCode());
|
|
||||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
|
||||||
result = prime * result + ((operatingSystem == null) ? 0 : operatingSystem.hashCode());
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,37 +207,17 @@ public class VirtualSystem {
|
||||||
if (getClass() != obj.getClass())
|
if (getClass() != obj.getClass())
|
||||||
return false;
|
return false;
|
||||||
VirtualSystem other = (VirtualSystem) obj;
|
VirtualSystem other = (VirtualSystem) obj;
|
||||||
if (hardware == null) {
|
|
||||||
if (other.hardware != null)
|
|
||||||
return false;
|
|
||||||
} else if (!hardware.equals(other.hardware))
|
|
||||||
return false;
|
|
||||||
if (id == null) {
|
if (id == null) {
|
||||||
if (other.id != null)
|
if (other.id != null)
|
||||||
return false;
|
return false;
|
||||||
} else if (!id.equals(other.id))
|
} else if (!id.equals(other.id))
|
||||||
return false;
|
return false;
|
||||||
if (info == null) {
|
|
||||||
if (other.info != null)
|
|
||||||
return false;
|
|
||||||
} else if (!info.equals(other.info))
|
|
||||||
return false;
|
|
||||||
if (name == null) {
|
|
||||||
if (other.name != null)
|
|
||||||
return false;
|
|
||||||
} else if (!name.equals(other.name))
|
|
||||||
return false;
|
|
||||||
if (operatingSystem == null) {
|
|
||||||
if (other.operatingSystem != null)
|
|
||||||
return false;
|
|
||||||
} else if (!operatingSystem.equals(other.operatingSystem))
|
|
||||||
return false;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "[id=" + getId() + ", name=" + getName() + ", info=" + getInfo() + ", os=" + getOperatingSystem()
|
return String.format("[id=%s, name=%s, info=%s, operatingSystem=%s, hardwareSections=%s, additionalSections=%s]",
|
||||||
+ ", hardware=" + getHardware() + "]";
|
id, name, info, operatingSystem, hardwareSections, additionalSections);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf.xml;
|
||||||
|
|
||||||
|
import static org.jclouds.util.SaxUtils.currentOrNull;
|
||||||
|
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Provider;
|
||||||
|
|
||||||
|
import org.jclouds.ovf.Configuration;
|
||||||
|
import org.jclouds.ovf.DeploymentOptionSection;
|
||||||
|
import org.jclouds.util.SaxUtils;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class DeploymentOptionSectionHandler extends
|
||||||
|
SectionHandler<DeploymentOptionSection, DeploymentOptionSection.Builder> {
|
||||||
|
protected Configuration.Builder configBuilder = Configuration.builder();
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public DeploymentOptionSectionHandler(Provider<DeploymentOptionSection.Builder> builderProvider) {
|
||||||
|
super(builderProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attrs) {
|
||||||
|
Map<String, String> attributes = SaxUtils.cleanseAttributes(attrs);
|
||||||
|
if (equalsOrSuffix(qName, "Configuration")) {
|
||||||
|
configBuilder.id(attributes.get("id"));
|
||||||
|
// TODO default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) {
|
||||||
|
if (equalsOrSuffix(qName, "Info")) {
|
||||||
|
builder.info(currentOrNull(currentText));
|
||||||
|
} else if (equalsOrSuffix(qName, "Label")) {
|
||||||
|
configBuilder.label(currentOrNull(currentText));
|
||||||
|
} else if (equalsOrSuffix(qName, "Description")) {
|
||||||
|
configBuilder.description(currentOrNull(currentText));
|
||||||
|
} else if (equalsOrSuffix(qName, "Configuration")) {
|
||||||
|
try {
|
||||||
|
builder.configuration(configBuilder.build());
|
||||||
|
} finally {
|
||||||
|
configBuilder = Configuration.builder();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.endElement(uri, localName, qName);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf.xml;
|
||||||
|
|
||||||
|
import static org.jclouds.util.SaxUtils.currentOrNull;
|
||||||
|
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Provider;
|
||||||
|
|
||||||
|
import org.jclouds.logging.Logger;
|
||||||
|
import org.jclouds.ovf.Disk;
|
||||||
|
import org.jclouds.ovf.DiskSection;
|
||||||
|
import org.jclouds.util.SaxUtils;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class DiskSectionHandler extends SectionHandler<DiskSection, DiskSection.Builder> {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
protected Logger logger = Logger.NULL;
|
||||||
|
protected Disk.Builder diskBuilder = Disk.builder();
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public DiskSectionHandler(Provider<DiskSection.Builder> builderProvider) {
|
||||||
|
super(builderProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attrs) {
|
||||||
|
Map<String, String> attributes = SaxUtils.cleanseAttributes(attrs);
|
||||||
|
if (equalsOrSuffix(qName, "Disk")) {
|
||||||
|
diskBuilder.id(attributes.get("diskId"));
|
||||||
|
diskBuilder.capacity(attemptToParse(attributes.get("capacity"), "capacity", attributes.get("diskId")));
|
||||||
|
diskBuilder.parentRef(attributes.get("parentRef"));
|
||||||
|
diskBuilder.fileRef(attributes.get("fileRef"));
|
||||||
|
if (attributes.containsKey("format"))
|
||||||
|
diskBuilder.format(URI.create(attributes.get("format")));
|
||||||
|
diskBuilder.populatedSize(attemptToParse(attributes.get("populatedSize"), "populatedSize", attributes
|
||||||
|
.get("diskId")));
|
||||||
|
diskBuilder.capacityAllocationUnits(attributes.get("capacityAllocationUnits"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Long attemptToParse(String toParse, String key, String diskId) {
|
||||||
|
Long val = null;
|
||||||
|
if (toParse != null) {
|
||||||
|
try {
|
||||||
|
val = new Long(toParse);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
logger.warn("%s for disk %s not a number [%s]", key, diskId, toParse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) {
|
||||||
|
if (equalsOrSuffix(qName, "Info")) {
|
||||||
|
builder.info(currentOrNull(currentText));
|
||||||
|
} else if (equalsOrSuffix(qName, "Disk")) {
|
||||||
|
try {
|
||||||
|
builder.disk(diskBuilder.build());
|
||||||
|
} finally {
|
||||||
|
diskBuilder = Disk.builder();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.endElement(uri, localName, qName);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,165 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf.xml;
|
||||||
|
|
||||||
|
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.inject.Named;
|
||||||
|
import javax.inject.Provider;
|
||||||
|
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.ovf.Envelope;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class EnvelopeHandler extends ParseSax.HandlerWithResult<Envelope> {
|
||||||
|
|
||||||
|
protected Envelope.Builder builder = Envelope.builder();
|
||||||
|
|
||||||
|
public Envelope getResult() {
|
||||||
|
try {
|
||||||
|
return builder.build();
|
||||||
|
} finally {
|
||||||
|
builder = Envelope.builder();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final VirtualSystemHandler virtualSystemHandler;
|
||||||
|
private final DiskSectionHandler diskHandler;
|
||||||
|
private final NetworkSectionHandler networkHandler;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public EnvelopeHandler(DiskSectionHandler diskHandler, NetworkSectionHandler networkHandler,
|
||||||
|
VirtualSystemHandler osHandler) {
|
||||||
|
this.virtualSystemHandler = osHandler;
|
||||||
|
this.diskHandler = diskHandler;
|
||||||
|
this.networkHandler = networkHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected SectionHandler defaultSectionHandler = SectionHandler.create();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Inject(optional = true)
|
||||||
|
@Named("VirtualSystem")
|
||||||
|
Map<String, Provider<? extends SectionHandler>> extensionHandlers = ImmutableMap
|
||||||
|
.<String, Provider<? extends SectionHandler>> of();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected SectionHandler extensionHandler;
|
||||||
|
|
||||||
|
private boolean inDisk;
|
||||||
|
private boolean inNetwork;
|
||||||
|
private boolean inVirtualSystem;
|
||||||
|
private boolean inSection;
|
||||||
|
private boolean inExtensionSection;
|
||||||
|
|
||||||
|
private int depth = 0;
|
||||||
|
|
||||||
|
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
|
||||||
|
depth++;
|
||||||
|
if (depth == 2) {
|
||||||
|
if (equalsOrSuffix(qName, "DiskSection")) {
|
||||||
|
inDisk = true;
|
||||||
|
} else if (equalsOrSuffix(qName, "NetworkSection")) {
|
||||||
|
inNetwork = true;
|
||||||
|
} else if (equalsOrSuffix(qName, "VirtualSystem")) {
|
||||||
|
inVirtualSystem = true;
|
||||||
|
} else if (extensionHandlers.containsKey(qName)) {
|
||||||
|
inExtensionSection = true;
|
||||||
|
extensionHandler = extensionHandlers.get(qName).get();
|
||||||
|
} else if (qName.endsWith("Section")) {
|
||||||
|
inSection = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inDisk) {
|
||||||
|
diskHandler.startElement(uri, localName, qName, attrs);
|
||||||
|
} else if (inNetwork) {
|
||||||
|
networkHandler.startElement(uri, localName, qName, attrs);
|
||||||
|
} else if (inVirtualSystem) {
|
||||||
|
virtualSystemHandler.startElement(uri, localName, qName, attrs);
|
||||||
|
} else if (inExtensionSection) {
|
||||||
|
extensionHandler.startElement(uri, localName, qName, attrs);
|
||||||
|
} else if (inSection) {
|
||||||
|
defaultSectionHandler.startElement(uri, localName, qName, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) {
|
||||||
|
depth--;
|
||||||
|
if (depth == 1) {
|
||||||
|
if (equalsOrSuffix(qName, "DiskSection")) {
|
||||||
|
inDisk = false;
|
||||||
|
builder.diskSection(diskHandler.getResult());
|
||||||
|
} else if (equalsOrSuffix(qName, "NetworkSection")) {
|
||||||
|
inNetwork = false;
|
||||||
|
builder.networkSection(networkHandler.getResult());
|
||||||
|
} else if (equalsOrSuffix(qName, "VirtualSystem")) {
|
||||||
|
inVirtualSystem = false;
|
||||||
|
builder.virtualSystem(virtualSystemHandler.getResult());
|
||||||
|
} else if (extensionHandlers.containsKey(qName)) {
|
||||||
|
builder.additionalSection(qName, extensionHandler.getResult());
|
||||||
|
inExtensionSection = false;
|
||||||
|
} else if (qName.endsWith("Section")) {
|
||||||
|
builder.additionalSection(qName, defaultSectionHandler.getResult());
|
||||||
|
inSection = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inDisk) {
|
||||||
|
diskHandler.endElement(uri, localName, qName);
|
||||||
|
} else if (inNetwork) {
|
||||||
|
networkHandler.endElement(uri, localName, qName);
|
||||||
|
} else if (inVirtualSystem) {
|
||||||
|
virtualSystemHandler.endElement(uri, localName, qName);
|
||||||
|
} else if (inExtensionSection) {
|
||||||
|
extensionHandler.endElement(uri, localName, qName);
|
||||||
|
} else if (inSection) {
|
||||||
|
defaultSectionHandler.endElement(uri, localName, qName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void characters(char ch[], int start, int length) {
|
||||||
|
if (inDisk) {
|
||||||
|
diskHandler.characters(ch, start, length);
|
||||||
|
} else if (inNetwork) {
|
||||||
|
networkHandler.characters(ch, start, length);
|
||||||
|
} else if (inVirtualSystem) {
|
||||||
|
virtualSystemHandler.characters(ch, start, length);
|
||||||
|
} else if (inExtensionSection) {
|
||||||
|
extensionHandler.characters(ch, start, length);
|
||||||
|
} else if (inSection) {
|
||||||
|
defaultSectionHandler.characters(ch, start, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -23,56 +23,46 @@ import static org.jclouds.util.SaxUtils.currentOrNull;
|
||||||
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.jclouds.http.functions.ParseSax;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Provider;
|
||||||
|
|
||||||
import org.jclouds.ovf.Network;
|
import org.jclouds.ovf.Network;
|
||||||
import org.jclouds.ovf.NetworkSection;
|
import org.jclouds.ovf.NetworkSection;
|
||||||
import org.jclouds.util.SaxUtils;
|
import org.jclouds.util.SaxUtils;
|
||||||
import org.xml.sax.Attributes;
|
import org.xml.sax.Attributes;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class NetworkSectionHandler extends ParseSax.HandlerWithResult<NetworkSection> {
|
public class NetworkSectionHandler extends SectionHandler<NetworkSection, NetworkSection.Builder> {
|
||||||
protected StringBuilder currentText = new StringBuilder();
|
protected Network.Builder networkBuilder = Network.builder();
|
||||||
|
|
||||||
protected String info;
|
@Inject
|
||||||
protected String name;
|
public NetworkSectionHandler(Provider<NetworkSection.Builder> builderProvider) {
|
||||||
protected String description;
|
super(builderProvider);
|
||||||
|
|
||||||
protected Set<Network> networks = Sets.newLinkedHashSet();
|
|
||||||
|
|
||||||
public NetworkSection getResult() {
|
|
||||||
NetworkSection system = new NetworkSection(info, networks);
|
|
||||||
this.info = null;
|
|
||||||
this.networks = Sets.newLinkedHashSet();
|
|
||||||
return system;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startElement(String uri, String localName, String qName, Attributes attrs) {
|
public void startElement(String uri, String localName, String qName, Attributes attrs) {
|
||||||
Map<String, String> attributes = SaxUtils.cleanseAttributes(attrs);
|
Map<String, String> attributes = SaxUtils.cleanseAttributes(attrs);
|
||||||
if (equalsOrSuffix(qName, "Network")) {
|
if (equalsOrSuffix(qName, "Network")) {
|
||||||
name = attributes.get("name");
|
networkBuilder.name(attributes.get("name"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void endElement(String uri, String localName, String qName) {
|
public void endElement(String uri, String localName, String qName) {
|
||||||
if (equalsOrSuffix(qName, "Info")) {
|
if (equalsOrSuffix(qName, "Info")) {
|
||||||
this.info = currentOrNull(currentText);
|
builder.info(currentOrNull(currentText));
|
||||||
} else if (equalsOrSuffix(qName, "Description")) {
|
} else if (equalsOrSuffix(qName, "Description")) {
|
||||||
this.description = currentOrNull(currentText);
|
networkBuilder.description(currentOrNull(currentText));
|
||||||
} else if (equalsOrSuffix(qName, "Network")) {
|
} else if (equalsOrSuffix(qName, "Network")) {
|
||||||
this.networks.add(new Network(name, description));
|
try {
|
||||||
|
builder.network(networkBuilder.build());
|
||||||
|
} finally {
|
||||||
|
networkBuilder = Network.builder();
|
||||||
}
|
}
|
||||||
currentText = new StringBuilder();
|
|
||||||
}
|
}
|
||||||
|
super.endElement(uri, localName, qName);
|
||||||
public void characters(char ch[], int start, int length) {
|
|
||||||
currentText.append(ch, start, length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,26 +25,20 @@ import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jclouds.http.functions.ParseSax;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Provider;
|
||||||
|
|
||||||
import org.jclouds.ovf.OperatingSystemSection;
|
import org.jclouds.ovf.OperatingSystemSection;
|
||||||
import org.xml.sax.Attributes;
|
import org.xml.sax.Attributes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class OperatingSystemSectionHandler extends ParseSax.HandlerWithResult<OperatingSystemSection> {
|
public class OperatingSystemSectionHandler extends
|
||||||
private StringBuilder currentText = new StringBuilder();
|
SectionHandler<OperatingSystemSection, OperatingSystemSection.Builder> {
|
||||||
|
@Inject
|
||||||
protected Integer id;
|
public OperatingSystemSectionHandler(Provider<OperatingSystemSection.Builder> builderProvider) {
|
||||||
protected String info;
|
super(builderProvider);
|
||||||
protected String description;
|
|
||||||
|
|
||||||
public OperatingSystemSection getResult() {
|
|
||||||
OperatingSystemSection system = new OperatingSystemSection(id, info, description);
|
|
||||||
id = null;
|
|
||||||
info = null;
|
|
||||||
description = null;
|
|
||||||
return system;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -52,21 +46,17 @@ public class OperatingSystemSectionHandler extends ParseSax.HandlerWithResult<Op
|
||||||
Map<String, String> attributes = cleanseAttributes(attrs);
|
Map<String, String> attributes = cleanseAttributes(attrs);
|
||||||
if (equalsOrSuffix(qName, "OperatingSystemSection")) {
|
if (equalsOrSuffix(qName, "OperatingSystemSection")) {
|
||||||
if (attributes.containsKey("id"))
|
if (attributes.containsKey("id"))
|
||||||
this.id = Integer.parseInt(attributes.get("id"));
|
builder.id(Integer.parseInt(attributes.get("id")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void endElement(String uri, String localName, String qName) {
|
public void endElement(String uri, String localName, String qName) {
|
||||||
if (equalsOrSuffix(qName, "Info")) {
|
if (equalsOrSuffix(qName, "Info")) {
|
||||||
this.info = currentOrNull(currentText);
|
builder.info(currentOrNull(currentText));
|
||||||
} else if (equalsOrSuffix(qName, "Description")) {
|
} else if (equalsOrSuffix(qName, "Description")) {
|
||||||
this.description = currentOrNull(currentText);
|
builder.description(currentOrNull(currentText));
|
||||||
}
|
}
|
||||||
currentText = new StringBuilder();
|
super.endElement(uri, localName, qName);
|
||||||
}
|
|
||||||
|
|
||||||
public void characters(char ch[], int start, int length) {
|
|
||||||
currentText.append(ch, start, length);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,87 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
|
||||||
*
|
|
||||||
* ====================================================================
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.vdc/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
* ====================================================================
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jclouds.ovf.xml;
|
|
||||||
|
|
||||||
//import static org.jclouds.vcloud.util.Utils.cleanseAttributes;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import org.jclouds.http.functions.ParseSax;
|
|
||||||
import org.jclouds.ovf.OvfEnvelope;
|
|
||||||
import org.jclouds.ovf.VirtualSystem;
|
|
||||||
import org.xml.sax.Attributes;
|
|
||||||
import org.xml.sax.SAXException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Adrian Cole
|
|
||||||
*/
|
|
||||||
public class OvfEnvelopeHandler extends ParseSax.HandlerWithResult<OvfEnvelope> {
|
|
||||||
|
|
||||||
protected final VirtualSystemHandler virtualSystemHandler;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public OvfEnvelopeHandler(VirtualSystemHandler virtualSystemHandler) {
|
|
||||||
this.virtualSystemHandler = virtualSystemHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected StringBuilder currentText = new StringBuilder();
|
|
||||||
|
|
||||||
private VirtualSystem virtualSystem;
|
|
||||||
|
|
||||||
private boolean inVirtualSystem;
|
|
||||||
|
|
||||||
public OvfEnvelope getResult() {
|
|
||||||
return new OvfEnvelope(virtualSystem);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
|
|
||||||
// Map<String, String> attributes = cleanseAttributes(attrs);
|
|
||||||
if (qName.endsWith("VirtualSystem")) {
|
|
||||||
inVirtualSystem = true;
|
|
||||||
}
|
|
||||||
if (inVirtualSystem) {
|
|
||||||
virtualSystemHandler.startElement(uri, localName, qName, attrs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void endElement(String uri, String name, String qName) {
|
|
||||||
if (qName.endsWith("VirtualSystem")) {
|
|
||||||
inVirtualSystem = false;
|
|
||||||
virtualSystem = virtualSystemHandler.getResult();
|
|
||||||
}
|
|
||||||
if (inVirtualSystem) {
|
|
||||||
virtualSystemHandler.endElement(uri, name, qName);
|
|
||||||
}
|
|
||||||
currentText = new StringBuilder();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void characters(char ch[], int start, int length) {
|
|
||||||
if (inVirtualSystem)
|
|
||||||
virtualSystemHandler.characters(ch, start, length);
|
|
||||||
else
|
|
||||||
currentText.append(ch, start, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String currentOrNull() {
|
|
||||||
String returnVal = currentText.toString().trim();
|
|
||||||
return returnVal.equals("") ? null : returnVal;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf.xml;
|
||||||
|
|
||||||
|
import static org.jclouds.util.SaxUtils.currentOrNull;
|
||||||
|
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
||||||
|
|
||||||
|
import javax.inject.Provider;
|
||||||
|
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.ovf.Section;
|
||||||
|
import org.jclouds.ovf.Section.Builder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
public class SectionHandler<T extends Section<T>, B extends Section.Builder<T>> extends ParseSax.HandlerWithResult<T> {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static SectionHandler create() {
|
||||||
|
return new SectionHandler(new Provider<Section.Builder>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Builder get() {
|
||||||
|
return new Section.Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final Provider<? extends Section.Builder<T>> builderProvider;
|
||||||
|
protected StringBuilder currentText = new StringBuilder();
|
||||||
|
protected B builder;
|
||||||
|
|
||||||
|
public SectionHandler(Provider<B> builderProvider) {
|
||||||
|
this.builderProvider = builderProvider;
|
||||||
|
this.builder = builderProvider.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public T getResult() {
|
||||||
|
try {
|
||||||
|
return (T) builder.build();
|
||||||
|
} finally {
|
||||||
|
builder = (B) builderProvider.get();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void endElement(String uri, String localName, String qName) {
|
||||||
|
if (equalsOrSuffix(qName, "Info")) {
|
||||||
|
builder.info(currentOrNull(currentText));
|
||||||
|
}
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void characters(char ch[], int start, int length) {
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
}
|
|
@ -19,53 +19,53 @@
|
||||||
|
|
||||||
package org.jclouds.ovf.xml;
|
package org.jclouds.ovf.xml;
|
||||||
|
|
||||||
import java.util.Set;
|
import static org.jclouds.util.SaxUtils.cleanseAttributes;
|
||||||
|
import static org.jclouds.util.SaxUtils.currentOrNull;
|
||||||
|
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Provider;
|
||||||
|
|
||||||
import org.jclouds.cim.ResourceAllocationSettingData;
|
|
||||||
import org.jclouds.cim.VirtualSystemSettingData;
|
|
||||||
import org.jclouds.cim.xml.ResourceAllocationSettingDataHandler;
|
import org.jclouds.cim.xml.ResourceAllocationSettingDataHandler;
|
||||||
import org.jclouds.cim.xml.VirtualSystemSettingDataHandler;
|
import org.jclouds.cim.xml.VirtualSystemSettingDataHandler;
|
||||||
import org.jclouds.http.functions.ParseSax;
|
|
||||||
import org.jclouds.ovf.VirtualHardwareSection;
|
import org.jclouds.ovf.VirtualHardwareSection;
|
||||||
import org.xml.sax.Attributes;
|
import org.xml.sax.Attributes;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.base.Splitter;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class VirtualHardwareSectionHandler extends ParseSax.HandlerWithResult<VirtualHardwareSection> {
|
public class VirtualHardwareSectionHandler extends
|
||||||
protected StringBuilder currentText = new StringBuilder();
|
SectionHandler<VirtualHardwareSection, VirtualHardwareSection.Builder> {
|
||||||
|
|
||||||
private final VirtualSystemSettingDataHandler systemHandler;
|
private final VirtualSystemSettingDataHandler systemHandler;
|
||||||
private final ResourceAllocationSettingDataHandler allocationHandler;
|
private final ResourceAllocationSettingDataHandler allocationHandler;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public VirtualHardwareSectionHandler(VirtualSystemSettingDataHandler systemHandler,
|
public VirtualHardwareSectionHandler(Provider<VirtualHardwareSection.Builder> builderProvider,
|
||||||
ResourceAllocationSettingDataHandler allocationHandler) {
|
VirtualSystemSettingDataHandler systemHandler, ResourceAllocationSettingDataHandler allocationHandler) {
|
||||||
|
super(builderProvider);
|
||||||
this.systemHandler = systemHandler;
|
this.systemHandler = systemHandler;
|
||||||
this.allocationHandler = allocationHandler;
|
this.allocationHandler = allocationHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String info;
|
|
||||||
protected VirtualSystemSettingData system;
|
|
||||||
protected Set<ResourceAllocationSettingData> allocations = Sets.newLinkedHashSet();
|
|
||||||
|
|
||||||
private boolean inItem;
|
private boolean inItem;
|
||||||
private boolean inSystem;
|
private boolean inSystem;
|
||||||
|
|
||||||
public VirtualHardwareSection getResult() {
|
|
||||||
return new VirtualHardwareSection(info, system, allocations);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startElement(String uri, String localName, String qName, Attributes attrs) {
|
public void startElement(String uri, String localName, String qName, Attributes attrs) {
|
||||||
if (qName.endsWith("System")) {
|
Map<String, String> attributes = cleanseAttributes(attrs);
|
||||||
|
if (equalsOrSuffix(qName, "VirtualHardwareSection")) {
|
||||||
|
if (attributes.containsKey("transport"))
|
||||||
|
builder.transports(Splitter.on(' ').split(attributes.get("transport")));
|
||||||
|
} else if (equalsOrSuffix(qName, "System")) {
|
||||||
inSystem = true;
|
inSystem = true;
|
||||||
} else if (!inSystem && qName.endsWith("Item")) {
|
} else if (!inSystem && equalsOrSuffix(qName, "Item")) {
|
||||||
inItem = true;
|
inItem = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inSystem) {
|
if (inSystem) {
|
||||||
systemHandler.startElement(uri, localName, qName, attrs);
|
systemHandler.startElement(uri, localName, qName, attrs);
|
||||||
} else if (inItem) {
|
} else if (inItem) {
|
||||||
|
@ -75,30 +75,33 @@ public class VirtualHardwareSectionHandler extends ParseSax.HandlerWithResult<Vi
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void endElement(String uri, String localName, String qName) {
|
public void endElement(String uri, String localName, String qName) {
|
||||||
if (qName.endsWith("System")) {
|
if (equalsOrSuffix(qName, "System")) {
|
||||||
inSystem = false;
|
inSystem = false;
|
||||||
system = systemHandler.getResult();
|
builder.system(systemHandler.getResult());
|
||||||
} else if (qName.endsWith("Item")) {
|
} else if (equalsOrSuffix(qName, "Item")) {
|
||||||
inItem = false;
|
inItem = false;
|
||||||
allocations.add(allocationHandler.getResult());
|
builder.resourceAllocation(allocationHandler.getResult());
|
||||||
}
|
}
|
||||||
if (inSystem) {
|
if (inSystem) {
|
||||||
systemHandler.endElement(uri, localName, qName);
|
systemHandler.endElement(uri, localName, qName);
|
||||||
} else if (inItem) {
|
} else if (inItem) {
|
||||||
allocationHandler.endElement(uri, localName, qName);
|
allocationHandler.endElement(uri, localName, qName);
|
||||||
} else if (qName.endsWith("Info")) {
|
} else {
|
||||||
this.info = currentText.toString().trim();
|
if (equalsOrSuffix(qName, "Info"))
|
||||||
|
builder.info(currentOrNull(currentText));
|
||||||
|
super.endElement(uri, localName, qName);
|
||||||
}
|
}
|
||||||
currentText = new StringBuilder();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void characters(char ch[], int start, int length) {
|
public void characters(char ch[], int start, int length) {
|
||||||
currentText.append(ch, start, length);
|
if (inSystem) {
|
||||||
if (inSystem)
|
|
||||||
systemHandler.characters(ch, start, length);
|
systemHandler.characters(ch, start, length);
|
||||||
if (inItem)
|
} else if (inItem) {
|
||||||
allocationHandler.characters(ch, start, length);
|
allocationHandler.characters(ch, start, length);
|
||||||
|
} else {
|
||||||
|
super.characters(ch, start, length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,122 +20,134 @@
|
||||||
package org.jclouds.ovf.xml;
|
package org.jclouds.ovf.xml;
|
||||||
|
|
||||||
import static org.jclouds.util.SaxUtils.cleanseAttributes;
|
import static org.jclouds.util.SaxUtils.cleanseAttributes;
|
||||||
|
import static org.jclouds.util.SaxUtils.currentOrNull;
|
||||||
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
import static org.jclouds.util.SaxUtils.equalsOrSuffix;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Named;
|
||||||
|
import javax.inject.Provider;
|
||||||
|
|
||||||
import org.jclouds.http.functions.ParseSax;
|
|
||||||
import org.jclouds.ovf.OperatingSystemSection;
|
|
||||||
import org.jclouds.ovf.VirtualHardwareSection;
|
|
||||||
import org.jclouds.ovf.VirtualSystem;
|
import org.jclouds.ovf.VirtualSystem;
|
||||||
import org.xml.sax.Attributes;
|
import org.xml.sax.Attributes;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public class VirtualSystemHandler extends ParseSax.HandlerWithResult<VirtualSystem> {
|
public class VirtualSystemHandler extends SectionHandler<VirtualSystem, VirtualSystem.Builder> {
|
||||||
protected StringBuilder currentText = new StringBuilder();
|
|
||||||
private final OperatingSystemSectionHandler osHandler;
|
private final OperatingSystemSectionHandler osHandler;
|
||||||
private final VirtualHardwareSectionHandler hardwareHandler;
|
private final VirtualHardwareSectionHandler hardwareHandler;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public VirtualSystemHandler(OperatingSystemSectionHandler osHandler, VirtualHardwareSectionHandler hardwareHandler) {
|
public VirtualSystemHandler(Provider<VirtualSystem.Builder> builderProvider,
|
||||||
|
OperatingSystemSectionHandler osHandler, VirtualHardwareSectionHandler hardwareHandler) {
|
||||||
|
super(builderProvider);
|
||||||
this.osHandler = osHandler;
|
this.osHandler = osHandler;
|
||||||
this.hardwareHandler = hardwareHandler;
|
this.hardwareHandler = hardwareHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String id;
|
@SuppressWarnings("unchecked")
|
||||||
protected String info;
|
protected SectionHandler defaultSectionHandler = SectionHandler.create();
|
||||||
protected String name;
|
|
||||||
protected OperatingSystemSection operatingSystem;
|
@SuppressWarnings("unchecked")
|
||||||
protected Set<VirtualHardwareSection> hardware = Sets.newLinkedHashSet();
|
@Inject(optional = true)
|
||||||
|
@Named("VirtualSystem")
|
||||||
|
Map<String, Provider<? extends SectionHandler>> extensionHandlers = ImmutableMap
|
||||||
|
.<String, Provider<? extends SectionHandler>> of();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
protected SectionHandler extensionHandler;
|
||||||
|
|
||||||
private boolean inHardware;
|
private boolean inHardware;
|
||||||
private boolean inOs;
|
private boolean inOs;
|
||||||
private boolean inNetwork;
|
private boolean inSection;
|
||||||
private boolean inGuest;
|
private boolean inExtensionSection;
|
||||||
|
private int depth;
|
||||||
|
|
||||||
public VirtualSystem getResult() {
|
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
|
||||||
VirtualSystem vs = new VirtualSystem(id, info, name, operatingSystem, hardware);
|
|
||||||
id = null;
|
|
||||||
info = null;
|
|
||||||
name = null;
|
|
||||||
operatingSystem = null;
|
|
||||||
hardware = Sets.newLinkedHashSet();
|
|
||||||
return vs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startElement(String uri, String localName, String qName, Attributes attrs) {
|
|
||||||
Map<String, String> attributes = cleanseAttributes(attrs);
|
Map<String, String> attributes = cleanseAttributes(attrs);
|
||||||
|
depth++;
|
||||||
|
if (depth == 2) {
|
||||||
if (equalsOrSuffix(qName, "VirtualHardwareSection")) {
|
if (equalsOrSuffix(qName, "VirtualHardwareSection")) {
|
||||||
inHardware = true;
|
inHardware = true;
|
||||||
} else if (equalsOrSuffix(qName, "OperatingSystemSection")) {
|
} else if (equalsOrSuffix(qName, "OperatingSystemSection")) {
|
||||||
inOs = true;
|
inOs = true;
|
||||||
} else if (equalsOrSuffix(qName, "NetworkConnectionSection")) {
|
} else if (extensionHandlers.containsKey(qName)) {
|
||||||
inNetwork = true;
|
inExtensionSection = true;
|
||||||
} else if (equalsOrSuffix(qName, "GuestCustomizationSection")) {
|
extensionHandler = extensionHandlers.get(qName).get();
|
||||||
inGuest = true;
|
} else if (qName.endsWith("Section")) {
|
||||||
|
inSection = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inHardware) {
|
if (inHardware) {
|
||||||
hardwareHandler.startElement(uri, localName, qName, attrs);
|
hardwareHandler.startElement(uri, localName, qName, attrs);
|
||||||
} else if (inOs) {
|
} else if (inOs) {
|
||||||
osHandler.startElement(uri, localName, qName, attrs);
|
osHandler.startElement(uri, localName, qName, attrs);
|
||||||
} else if (inNetwork) {
|
} else if (inExtensionSection) {
|
||||||
// TODO
|
extensionHandler.startElement(uri, localName, qName, attrs);
|
||||||
} else if (inGuest) {
|
} else if (inSection) {
|
||||||
// TODO
|
defaultSectionHandler.startElement(uri, localName, qName, attrs);
|
||||||
} else if (equalsOrSuffix(qName, "VirtualSystem")) {
|
} else if (equalsOrSuffix(qName, "VirtualSystem")) {
|
||||||
id = attributes.get("id");
|
builder.id(attributes.get("id"));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void endElement(String uri, String localName, String qName) {
|
public void endElement(String uri, String localName, String qName) {
|
||||||
|
depth--;
|
||||||
|
if (depth == 1) {
|
||||||
if (equalsOrSuffix(qName, "VirtualHardwareSection")) {
|
if (equalsOrSuffix(qName, "VirtualHardwareSection")) {
|
||||||
inHardware = false;
|
inHardware = false;
|
||||||
hardware.add(hardwareHandler.getResult());
|
builder.hardwareSection(hardwareHandler.getResult());
|
||||||
} else if (equalsOrSuffix(qName, "OperatingSystemSection")) {
|
} else if (equalsOrSuffix(qName, "OperatingSystemSection")) {
|
||||||
inOs = false;
|
inOs = false;
|
||||||
operatingSystem = osHandler.getResult();
|
builder.operatingSystemSection(osHandler.getResult());
|
||||||
} else if (equalsOrSuffix(qName, "NetworkConnectionSection")) {
|
} else if (extensionHandlers.containsKey(qName)) {
|
||||||
inNetwork = false;
|
builder.additionalSection(qName, extensionHandler.getResult());
|
||||||
// TODO
|
inExtensionSection = false;
|
||||||
} else if (equalsOrSuffix(qName, "GuestCustomizationSection")) {
|
} else if (qName.endsWith("Section")) {
|
||||||
inNetwork = false;
|
builder.additionalSection(qName, defaultSectionHandler.getResult());
|
||||||
// TODO
|
inSection = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (inHardware) {
|
if (inHardware) {
|
||||||
hardwareHandler.endElement(uri, localName, qName);
|
hardwareHandler.endElement(uri, localName, qName);
|
||||||
} else if (inOs) {
|
} else if (inOs) {
|
||||||
osHandler.endElement(uri, localName, qName);
|
osHandler.endElement(uri, localName, qName);
|
||||||
} else if (inNetwork) {
|
} else if (inExtensionSection) {
|
||||||
// TODO
|
extensionHandler.endElement(uri, localName, qName);
|
||||||
} else if (inGuest) {
|
} else if (inSection) {
|
||||||
// TODO
|
defaultSectionHandler.endElement(uri, localName, qName);
|
||||||
} else if (equalsOrSuffix(qName, "Info")) {
|
} else {
|
||||||
info = currentText.toString().trim();
|
if (equalsOrSuffix(qName, "Info")) {
|
||||||
|
builder.info(currentOrNull(currentText));
|
||||||
} else if (equalsOrSuffix(qName, "Name")) {
|
} else if (equalsOrSuffix(qName, "Name")) {
|
||||||
name = currentText.toString().trim();
|
builder.name(currentOrNull(currentText));
|
||||||
|
}
|
||||||
|
super.endElement(uri, localName, qName);
|
||||||
}
|
}
|
||||||
currentText = new StringBuilder();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void characters(char ch[], int start, int length) {
|
public void characters(char ch[], int start, int length) {
|
||||||
if (inHardware)
|
if (inHardware) {
|
||||||
hardwareHandler.characters(ch, start, length);
|
hardwareHandler.characters(ch, start, length);
|
||||||
else if (inOs)
|
} else if (inOs) {
|
||||||
osHandler.characters(ch, start, length);
|
osHandler.characters(ch, start, length);
|
||||||
else
|
} else if (inExtensionSection) {
|
||||||
currentText.append(ch, start, length);
|
extensionHandler.characters(ch, start, length);
|
||||||
|
} else if (inSection) {
|
||||||
|
defaultSectionHandler.characters(ch, start, length);
|
||||||
|
} else {
|
||||||
|
super.characters(ch, start, length);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,8 +75,8 @@ public class VirtualSystemSettingDataHandlerTest extends BaseHandlerTest {
|
||||||
assertEquals(result.getId(), "Ubuntu1004");
|
assertEquals(result.getId(), "Ubuntu1004");
|
||||||
assertEquals(result.getName(), "Ubuntu1004");
|
assertEquals(result.getName(), "Ubuntu1004");
|
||||||
assertEquals(result.getInfo(), "A virtual machine:");
|
assertEquals(result.getInfo(), "A virtual machine:");
|
||||||
checkHardware(Iterables.get(result.getHardware(), 0));
|
checkHardware(Iterables.get(result.getVirtualHardwareSections(), 0));
|
||||||
checkOs(result.getOperatingSystem());
|
checkOs(result.getOperatingSystemSection());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(enabled = false)
|
@Test(enabled = false)
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf.xml;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URI;
|
||||||
|
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.http.functions.ParseSax.Factory;
|
||||||
|
import org.jclouds.http.functions.config.SaxParserModule;
|
||||||
|
import org.jclouds.ovf.Disk;
|
||||||
|
import org.jclouds.ovf.DiskSection;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code DiskSectionHandler}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit")
|
||||||
|
public class DiskSectionHandlerTest {
|
||||||
|
public void test() {
|
||||||
|
InputStream is = getClass().getResourceAsStream("/disksection.xml");
|
||||||
|
Injector injector = Guice.createInjector(new SaxParserModule());
|
||||||
|
Factory factory = injector.getInstance(ParseSax.Factory.class);
|
||||||
|
DiskSection result = factory.create(injector.getInstance(DiskSectionHandler.class)).parse(is);
|
||||||
|
assertEquals(result.toString(), DiskSection.builder().info("Describes the set of virtual disks").disk(
|
||||||
|
Disk.builder().id("vmdisk1")
|
||||||
|
|
||||||
|
.fileRef("file1").capacity(8589934592l).populatedSize(3549324972l).format(
|
||||||
|
URI.create("http://www.vmware.com/interfaces/specifications/vmdk.html#sparse")).build()).disk(
|
||||||
|
Disk.builder().id("vmdisk2").capacity(536870912l).build()).disk(
|
||||||
|
Disk.builder().id("vmdisk3").capacityAllocationUnits("byte * 2^30").build())
|
||||||
|
|
||||||
|
.build().toString()
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -25,29 +25,28 @@ import org.jclouds.cim.xml.VirtualSystemSettingDataHandlerTest;
|
||||||
import org.jclouds.http.functions.ParseSax;
|
import org.jclouds.http.functions.ParseSax;
|
||||||
import org.jclouds.http.functions.ParseSax.Factory;
|
import org.jclouds.http.functions.ParseSax.Factory;
|
||||||
import org.jclouds.http.functions.config.SaxParserModule;
|
import org.jclouds.http.functions.config.SaxParserModule;
|
||||||
import org.jclouds.ovf.OvfEnvelope;
|
import org.jclouds.ovf.Envelope;
|
||||||
import org.jclouds.ovf.xml.OvfEnvelopeHandler;
|
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.inject.Guice;
|
import com.google.inject.Guice;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests behavior of {@code OvfEnvelopeHandler}
|
* Tests behavior of {@code EnvelopeHandler}
|
||||||
*
|
*
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(groups = "unit")
|
@Test(groups = "unit")
|
||||||
public class OvfEnvelopeHandlerTest {
|
public class EnvelopeHandlerTest {
|
||||||
public void testVCloud1_0() {
|
public void testVCloud1_0() {
|
||||||
InputStream is = getClass().getResourceAsStream("/ovf.xml");
|
InputStream is = getClass().getResourceAsStream("/ovf.xml");
|
||||||
Injector injector = Guice.createInjector(new SaxParserModule());
|
Injector injector = Guice.createInjector(new SaxParserModule());
|
||||||
Factory factory = injector.getInstance(ParseSax.Factory.class);
|
Factory factory = injector.getInstance(ParseSax.Factory.class);
|
||||||
OvfEnvelope result = factory.create(injector.getInstance(OvfEnvelopeHandler.class)).parse(is);
|
Envelope result = factory.create(injector.getInstance(EnvelopeHandler.class)).parse(is);
|
||||||
checkOvfEnvelope(result);
|
checkOvfEnvelope(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void checkOvfEnvelope(OvfEnvelope result) {
|
static void checkOvfEnvelope(Envelope result) {
|
||||||
VirtualSystemSettingDataHandlerTest.checkVirtualSystem(result.getVirtualSystem());
|
VirtualSystemSettingDataHandlerTest.checkVirtualSystem(result.getVirtualSystem());
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf.xml;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.http.functions.ParseSax.Factory;
|
||||||
|
import org.jclouds.http.functions.config.SaxParserModule;
|
||||||
|
import org.jclouds.ovf.Network;
|
||||||
|
import org.jclouds.ovf.NetworkSection;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code NetworkSectionHandler}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit")
|
||||||
|
public class NetworkSectionHandlerTest {
|
||||||
|
public void test() {
|
||||||
|
InputStream is = getClass().getResourceAsStream("/networksection.xml");
|
||||||
|
Injector injector = Guice.createInjector(new SaxParserModule());
|
||||||
|
Factory factory = injector.getInstance(ParseSax.Factory.class);
|
||||||
|
NetworkSection result = factory.create(injector.getInstance(NetworkSectionHandler.class)).parse(is);
|
||||||
|
assertEquals(result.toString(), NetworkSection.builder().info("List of logical networks used in the package")
|
||||||
|
.network(
|
||||||
|
Network.builder().name("red").description("The network the Red service is available on")
|
||||||
|
.build()).network(
|
||||||
|
Network.builder().name("blue").description("The network the Blue service is available on")
|
||||||
|
.build())
|
||||||
|
.build().toString()
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,53 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.ovf.xml;
|
||||||
|
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.http.functions.ParseSax.Factory;
|
||||||
|
import org.jclouds.http.functions.config.SaxParserModule;
|
||||||
|
import org.jclouds.ovf.OperatingSystemSection;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code OperatingSystemSectionHandler}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit")
|
||||||
|
public class OperatingSystemSectionHandlerTest {
|
||||||
|
public void test() {
|
||||||
|
InputStream is = getClass().getResourceAsStream("/operatingsystemsection.xml");
|
||||||
|
Injector injector = Guice.createInjector(new SaxParserModule());
|
||||||
|
Factory factory = injector.getInstance(ParseSax.Factory.class);
|
||||||
|
OperatingSystemSection result = factory.create(injector.getInstance(OperatingSystemSectionHandler.class)).parse(
|
||||||
|
is);
|
||||||
|
assertEquals(result.toString(), OperatingSystemSection.builder().info("Specifies the operating system installed")
|
||||||
|
.description("Microsoft Windows Server 2008").id(76).build().toString()
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
<DiskSection>
|
||||||
|
<Info>Describes the set of virtual disks</Info>
|
||||||
|
<Disk ovf:diskId="vmdisk1" ovf:fileRef="file1" ovf:capacity="8589934592"
|
||||||
|
ovf:populatedSize="3549324972"
|
||||||
|
ovf:format="http://www.vmware.com/interfaces/specifications/vmdk.html#sparse">
|
||||||
|
</Disk>
|
||||||
|
<Disk ovf:diskId="vmdisk2" ovf:capacity="536870912" />
|
||||||
|
<Disk ovf:diskId="vmdisk3" ovf:capacity="${disk.size}"
|
||||||
|
ovf:capacityAllocationUnits="byte * 2^30" />
|
||||||
|
</DiskSection>
|
|
@ -0,0 +1,11 @@
|
||||||
|
<NetworkSection>
|
||||||
|
<Info>List of logical networks used in the package</Info>
|
||||||
|
<Network ovf:name="red">
|
||||||
|
<Description>The network the Red service is available on
|
||||||
|
</Description>
|
||||||
|
</Network>
|
||||||
|
<Network ovf:name="blue">
|
||||||
|
<Description>The network the Blue service is available on
|
||||||
|
</Description>
|
||||||
|
</Network>
|
||||||
|
</NetworkSection>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<OperatingSystemSection ovf:id="76">
|
||||||
|
<Info>Specifies the operating system installed</Info>
|
||||||
|
<Description>Microsoft Windows Server 2008</Description>
|
||||||
|
</OperatingSystemSection>
|
|
@ -132,7 +132,7 @@ public class CreateKeyPairPlacementAndSecurityGroupsAsNeededAndReturnRunOptions
|
||||||
credentialsMap.put(key, pair);
|
credentialsMap.put(key, pair);
|
||||||
} else {
|
} else {
|
||||||
if (hasPublicKeyMaterial.apply(options)) {
|
if (hasPublicKeyMaterial.apply(options)) {
|
||||||
logger.warn("to avoid creating extra keys in aws-ec2, use templateOption overrideLoginCredentialWith(id_rsa)");
|
logger.warn("to avoid creating temporary keys in aws-ec2, use templateOption overrideLoginCredentialWith(id_rsa)");
|
||||||
}
|
}
|
||||||
return createUniqueKeyPairAndPutIntoMap(region, group);
|
return createUniqueKeyPairAndPutIntoMap(region, group);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,209 +0,0 @@
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Copyright (C) 2010 Cloud Conscious, LLC. <name@cloudconscious.com>
|
|
||||||
*
|
|
||||||
* ====================================================================
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
* ====================================================================
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jclouds.savvis.vpdc.domain;
|
|
||||||
|
|
||||||
import org.jclouds.cim.OSType;
|
|
||||||
import org.jclouds.compute.domain.OsFamily;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Savvis Operating System Specification
|
|
||||||
*
|
|
||||||
* @see <a href="https://api.sandbox.symphonyvpdc.savvis.net/doc/spec/api/addSingleVM.html" />
|
|
||||||
* @author Adrian Cole
|
|
||||||
*/
|
|
||||||
public class SavvisOperatingSystemSpecification {
|
|
||||||
|
|
||||||
public static Builder builder() {
|
|
||||||
return new Builder();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Builder {
|
|
||||||
private int savvisId;
|
|
||||||
private int typeId;
|
|
||||||
private String name;
|
|
||||||
private OsFamily family;
|
|
||||||
private String description;
|
|
||||||
private boolean supportedBySavvis;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SavvisOperatingSystemSpecification#getSavvisId
|
|
||||||
*/
|
|
||||||
public Builder savvisId(int savvisId) {
|
|
||||||
this.savvisId = savvisId;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SavvisOperatingSystemSpecification#getTypeId
|
|
||||||
*/
|
|
||||||
public Builder typeId(int typeId) {
|
|
||||||
this.typeId = typeId;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SavvisOperatingSystemSpecification#getOsFamily
|
|
||||||
*/
|
|
||||||
public Builder family(OsFamily family) {
|
|
||||||
this.family = family;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SavvisOperatingSystemSpecification#getInfo
|
|
||||||
*/
|
|
||||||
public Builder name(String name) {
|
|
||||||
this.name = name;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SavvisOperatingSystemSpecification#getDescription
|
|
||||||
*/
|
|
||||||
public Builder description(String description) {
|
|
||||||
this.description = description;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SavvisOperatingSystemSpecification#isSupportedBySavvis
|
|
||||||
*/
|
|
||||||
public Builder supportedBySavvis(boolean supportedBySavvis) {
|
|
||||||
this.supportedBySavvis = supportedBySavvis;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public SavvisOperatingSystemSpecification build() {
|
|
||||||
return new SavvisOperatingSystemSpecification(savvisId, typeId, family, name, description, supportedBySavvis);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder fromSavvisOperatingSystemSpecification(SavvisOperatingSystemSpecification in) {
|
|
||||||
return savvisId(in.getSavvisId()).typeId(in.getTypeId()).family(in.getFamily()).name(in.getName())
|
|
||||||
.description(in.getDescription()).supportedBySavvis(in.isSupportedBySavvis());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final int savvisId;
|
|
||||||
private final int typeId;
|
|
||||||
private final OsFamily family;
|
|
||||||
private final String name;
|
|
||||||
private final String description;
|
|
||||||
private final boolean supportedBySavvis;
|
|
||||||
|
|
||||||
public SavvisOperatingSystemSpecification(int savvisId, int typeId, OsFamily family, String name,
|
|
||||||
String description, boolean supportedBySavvis) {
|
|
||||||
this.savvisId = savvisId;
|
|
||||||
this.typeId = typeId;
|
|
||||||
this.family = family;
|
|
||||||
this.name = name;
|
|
||||||
this.description = description;
|
|
||||||
this.supportedBySavvis = supportedBySavvis;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return Internal name used by Savvis
|
|
||||||
*/
|
|
||||||
public int getSavvisId() {
|
|
||||||
return savvisId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return CIM OS Type Id
|
|
||||||
* @see OSType#getCode()
|
|
||||||
*/
|
|
||||||
public int getTypeId() {
|
|
||||||
return typeId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return the name of the OS
|
|
||||||
*/
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return the operating system family
|
|
||||||
*/
|
|
||||||
public OsFamily getFamily() {
|
|
||||||
return family;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return description
|
|
||||||
*/
|
|
||||||
public String getDescription() {
|
|
||||||
return description;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return whether or not this operating system is supported by Savvis
|
|
||||||
*/
|
|
||||||
public boolean isSupportedBySavvis() {
|
|
||||||
return supportedBySavvis;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
final int prime = 31;
|
|
||||||
int result = 1;
|
|
||||||
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
|
||||||
result = prime * result + typeId;
|
|
||||||
result = prime * result + savvisId;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (this == obj)
|
|
||||||
return true;
|
|
||||||
if (obj == null)
|
|
||||||
return false;
|
|
||||||
if (getClass() != obj.getClass())
|
|
||||||
return false;
|
|
||||||
SavvisOperatingSystemSpecification other = (SavvisOperatingSystemSpecification) obj;
|
|
||||||
if (name == null) {
|
|
||||||
if (other.name != null)
|
|
||||||
return false;
|
|
||||||
} else if (!name.equals(other.name))
|
|
||||||
return false;
|
|
||||||
if (typeId != other.typeId)
|
|
||||||
return false;
|
|
||||||
if (savvisId != other.savvisId)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder toBuilder() {
|
|
||||||
return builder().fromSavvisOperatingSystemSpecification(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return String.format("[description=%s, family=%s, name=%s, typeId=%s, savvisId=%s, supportedBySavvis=%s]",
|
|
||||||
description, family, name, typeId, savvisId, supportedBySavvis);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,3 +1,22 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
package org.jclouds.savvis.vpdc.domain.vapp;
|
package org.jclouds.savvis.vpdc.domain.vapp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue