mirror of https://github.com/apache/jclouds.git
Issue 498:[vcloud] expose IpAddressAllocationMode to compute service
This commit is contained in:
parent
7eef59db02
commit
fb663fceed
|
@ -21,6 +21,7 @@ package org.jclouds.vcloud;
|
|||
|
||||
import static org.jclouds.vcloud.VCloudMediaType.DEPLOYVAPPPARAMS_XML;
|
||||
import static org.jclouds.vcloud.VCloudMediaType.GUESTCUSTOMIZATIONSECTION_XML;
|
||||
import static org.jclouds.vcloud.VCloudMediaType.NETWORKCONNECTIONSECTION_XML;
|
||||
import static org.jclouds.vcloud.VCloudMediaType.TASK_XML;
|
||||
import static org.jclouds.vcloud.VCloudMediaType.UNDEPLOYVAPPPARAMS_XML;
|
||||
import static org.jclouds.vcloud.VCloudMediaType.VAPPTEMPLATE_XML;
|
||||
|
@ -47,9 +48,9 @@ import org.jclouds.rest.annotations.Endpoint;
|
|||
import org.jclouds.rest.annotations.EndpointParam;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
import org.jclouds.rest.annotations.MapBinder;
|
||||
import org.jclouds.rest.annotations.ParamValidators;
|
||||
import org.jclouds.rest.annotations.PayloadParam;
|
||||
import org.jclouds.rest.annotations.PayloadParams;
|
||||
import org.jclouds.rest.annotations.ParamValidators;
|
||||
import org.jclouds.rest.annotations.RequestFilters;
|
||||
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
||||
|
@ -59,8 +60,10 @@ import org.jclouds.vcloud.binders.BindCloneVAppParamsToXmlPayload;
|
|||
import org.jclouds.vcloud.binders.BindDeployVAppParamsToXmlPayload;
|
||||
import org.jclouds.vcloud.binders.BindGuestCustomizationSectionToXmlPayload;
|
||||
import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload;
|
||||
import org.jclouds.vcloud.binders.BindNetworkConnectionSectionToXmlPayload;
|
||||
import org.jclouds.vcloud.binders.BindUndeployVAppParamsToXmlPayload;
|
||||
import org.jclouds.vcloud.domain.GuestCustomizationSection;
|
||||
import org.jclouds.vcloud.domain.NetworkConnectionSection;
|
||||
import org.jclouds.vcloud.domain.ReferenceType;
|
||||
import org.jclouds.vcloud.domain.Task;
|
||||
import org.jclouds.vcloud.domain.VApp;
|
||||
|
@ -140,9 +143,9 @@ public interface VCloudAsyncClient extends CommonVCloudAsyncClient {
|
|||
@XMLResponseParser(VAppTemplateHandler.class)
|
||||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||
ListenableFuture<? extends VAppTemplate> findVAppTemplateInOrgCatalogNamed(
|
||||
@Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String orgName,
|
||||
@Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String catalogName,
|
||||
@EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName);
|
||||
@Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String orgName,
|
||||
@Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String catalogName,
|
||||
@EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName);
|
||||
|
||||
/**
|
||||
* @see VCloudClient#instantiateVAppTemplateInVDC
|
||||
|
@ -154,9 +157,9 @@ public interface VCloudAsyncClient extends CommonVCloudAsyncClient {
|
|||
@XMLResponseParser(VAppHandler.class)
|
||||
@MapBinder(BindInstantiateVAppTemplateParamsToXmlPayload.class)
|
||||
ListenableFuture<? extends VApp> instantiateVAppTemplateInVDC(@EndpointParam URI vdc,
|
||||
@PayloadParam("template") URI template,
|
||||
@PayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName,
|
||||
InstantiateVAppTemplateOptions... options);
|
||||
@PayloadParam("template") URI template,
|
||||
@PayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName,
|
||||
InstantiateVAppTemplateOptions... options);
|
||||
|
||||
/**
|
||||
* @see VCloudClient#cloneVAppInVDC
|
||||
|
@ -168,8 +171,7 @@ public interface VCloudAsyncClient extends CommonVCloudAsyncClient {
|
|||
@XMLResponseParser(TaskHandler.class)
|
||||
@MapBinder(BindCloneVAppParamsToXmlPayload.class)
|
||||
ListenableFuture<? extends Task> cloneVAppInVDC(@EndpointParam URI vdc, @PayloadParam("vApp") URI toClone,
|
||||
@PayloadParam("newName") @ParamValidators(DnsNameValidator.class) String newName,
|
||||
CloneVAppOptions... options);
|
||||
@PayloadParam("newName") @ParamValidators(DnsNameValidator.class) String newName, CloneVAppOptions... options);
|
||||
|
||||
/**
|
||||
* @see VCloudClient#captureVAppInVDC
|
||||
|
@ -181,9 +183,9 @@ public interface VCloudAsyncClient extends CommonVCloudAsyncClient {
|
|||
@XMLResponseParser(VAppTemplateHandler.class)
|
||||
@MapBinder(BindCaptureVAppParamsToXmlPayload.class)
|
||||
ListenableFuture<? extends VAppTemplate> captureVAppInVDC(@EndpointParam URI vdc,
|
||||
@PayloadParam("vApp") URI toCapture,
|
||||
@PayloadParam("templateName") @ParamValidators(DnsNameValidator.class) String templateName,
|
||||
CaptureVAppOptions... options);
|
||||
@PayloadParam("vApp") URI toCapture,
|
||||
@PayloadParam("templateName") @ParamValidators(DnsNameValidator.class) String templateName,
|
||||
CaptureVAppOptions... options);
|
||||
|
||||
/**
|
||||
* @see VCloudClient#findVAppInOrgVDCNamed
|
||||
|
@ -193,9 +195,9 @@ public interface VCloudAsyncClient extends CommonVCloudAsyncClient {
|
|||
@XMLResponseParser(VAppHandler.class)
|
||||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||
ListenableFuture<? extends VApp> findVAppInOrgVDCNamed(
|
||||
@Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName,
|
||||
@Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName,
|
||||
@EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName);
|
||||
@Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName,
|
||||
@Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName,
|
||||
@EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName);
|
||||
|
||||
/**
|
||||
* @see VCloudClient#getVApp
|
||||
|
@ -224,8 +226,19 @@ public interface VCloudAsyncClient extends CommonVCloudAsyncClient {
|
|||
@Path("/guestCustomizationSection")
|
||||
@XMLResponseParser(TaskHandler.class)
|
||||
ListenableFuture<? extends Task> updateGuestCustomizationOfVm(
|
||||
@EndpointParam URI vm,
|
||||
@BinderParam(BindGuestCustomizationSectionToXmlPayload.class) GuestCustomizationSection guestCustomizationSection);
|
||||
@EndpointParam URI vm,
|
||||
@BinderParam(BindGuestCustomizationSectionToXmlPayload.class) GuestCustomizationSection guestCustomizationSection);
|
||||
|
||||
/**
|
||||
* @see VCloudClient#updateNetworkConnectionOfVm
|
||||
*/
|
||||
@PUT
|
||||
@Consumes(TASK_XML)
|
||||
@Produces(NETWORKCONNECTIONSECTION_XML)
|
||||
@Path("/networkConnectionSection")
|
||||
@XMLResponseParser(TaskHandler.class)
|
||||
ListenableFuture<? extends Task> updateNetworkConnectionOfVm(@EndpointParam URI vm,
|
||||
@BinderParam(BindNetworkConnectionSectionToXmlPayload.class) NetworkConnectionSection networkConnectionSection);
|
||||
|
||||
/**
|
||||
* @see VCloudClient#deployVAppOrVm
|
||||
|
|
|
@ -29,6 +29,7 @@ import javax.annotation.Nullable;
|
|||
|
||||
import org.jclouds.concurrent.Timeout;
|
||||
import org.jclouds.vcloud.domain.GuestCustomizationSection;
|
||||
import org.jclouds.vcloud.domain.NetworkConnectionSection;
|
||||
import org.jclouds.vcloud.domain.ReferenceType;
|
||||
import org.jclouds.vcloud.domain.Task;
|
||||
import org.jclouds.vcloud.domain.VApp;
|
||||
|
@ -52,7 +53,8 @@ public interface VCloudClient extends CommonVCloudClient {
|
|||
/**
|
||||
* Get a Screen Thumbnail for a Virtual Machine
|
||||
*
|
||||
* @param vm to snapshot
|
||||
* @param vm
|
||||
* to snapshot
|
||||
*/
|
||||
InputStream getThumbnailOfVm(URI vm);
|
||||
|
||||
|
@ -68,10 +70,8 @@ public interface VCloudClient extends CommonVCloudClient {
|
|||
|
||||
Task cloneVAppInVDC(URI vDC, URI toClone, String newName, CloneVAppOptions... options);
|
||||
|
||||
|
||||
/**
|
||||
* The captureVApp request creates a vApp template from an instantiated vApp.
|
||||
* <h4>Note</h4>
|
||||
* The captureVApp request creates a vApp template from an instantiated vApp. <h4>Note</h4>
|
||||
* Before it can be captured, a vApp must be undeployed
|
||||
*
|
||||
* @param vDC
|
||||
|
@ -97,6 +97,17 @@ public interface VCloudClient extends CommonVCloudClient {
|
|||
*/
|
||||
Task updateGuestCustomizationOfVm(URI vm, GuestCustomizationSection guestCustomizationSection);
|
||||
|
||||
/**
|
||||
* Modify the Network Connection Section of a Virtual Machine
|
||||
*
|
||||
* @param vm
|
||||
* uri to modify
|
||||
* @param updated
|
||||
* networkConnectionSection
|
||||
* @return task in progress
|
||||
*/
|
||||
Task updateNetworkConnectionOfVm(URI vm, NetworkConnectionSection guestCustomizationSection);
|
||||
|
||||
/**
|
||||
* returns the vapp template corresponding to a catalog item in the catalog associated with the
|
||||
* specified name. Note that the org and catalog parameters can be null to choose default.
|
||||
|
@ -112,7 +123,7 @@ public interface VCloudClient extends CommonVCloudClient {
|
|||
* if you specified an org, catalog, or catalog item name that isn't present
|
||||
*/
|
||||
VAppTemplate findVAppTemplateInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName,
|
||||
String itemName);
|
||||
String itemName);
|
||||
|
||||
VApp findVAppInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String vAppName);
|
||||
|
||||
|
|
|
@ -0,0 +1,109 @@
|
|||
/**
|
||||
*
|
||||
* 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.vcloud.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_NAMESPACE;
|
||||
import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_SCHEMA;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.rest.binders.BindToStringPayload;
|
||||
import org.jclouds.vcloud.domain.NetworkConnection;
|
||||
import org.jclouds.vcloud.domain.NetworkConnectionSection;
|
||||
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.inject.Inject;
|
||||
import com.jamesmurty.utils.XMLBuilder;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*
|
||||
*/
|
||||
@Singleton
|
||||
public class BindNetworkConnectionSectionToXmlPayload extends BindToStringPayload {
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
protected final String ns;
|
||||
protected final String schema;
|
||||
|
||||
@Inject
|
||||
public BindNetworkConnectionSectionToXmlPayload(BindToStringPayload stringBinder,
|
||||
@Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema) {
|
||||
this.ns = ns;
|
||||
this.schema = schema;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R extends HttpRequest> R bindToRequest(R request, Object payload) {
|
||||
checkArgument(checkNotNull(payload, "NetworkConnectionSection") instanceof NetworkConnectionSection,
|
||||
"this binder is only valid for NetworkConnectionSection!");
|
||||
NetworkConnectionSection net = NetworkConnectionSection.class.cast(payload);
|
||||
XMLBuilder networkConnectionSection;
|
||||
try {
|
||||
networkConnectionSection = XMLBuilder.create("NetworkConnectionSection").a("xmlns", ns)
|
||||
.a("xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1").a("type", net.getType())
|
||||
.a("href", net.getHref().toASCIIString()).a("ovf:required", "false");
|
||||
networkConnectionSection.e("ovf:Info").t(net.getInfo());
|
||||
|
||||
if (net.getPrimaryNetworkConnectionIndex() != null)
|
||||
networkConnectionSection.e("PrimaryNetworkConnectionIndex").t(
|
||||
net.getPrimaryNetworkConnectionIndex().toString());
|
||||
for (NetworkConnection networkConnection : net.getConnections()) {
|
||||
XMLBuilder networkConnectionSectionChild = networkConnectionSection.e("NetworkConnection").a("network",
|
||||
networkConnection.getNetwork());
|
||||
networkConnectionSectionChild.e("NetworkConnectionIndex").t(
|
||||
networkConnection.getNetworkConnectionIndex() + "");
|
||||
if (networkConnection.getExternalIpAddress() != null)
|
||||
networkConnectionSectionChild.e("ExternalIpAddress").t(networkConnection.getExternalIpAddress());
|
||||
if (networkConnection.getIpAddress() != null)
|
||||
networkConnectionSectionChild.e("IpAddress").t(networkConnection.getIpAddress());
|
||||
networkConnectionSectionChild.e("IsConnected").t(networkConnection.isConnected() + "");
|
||||
if (networkConnection.getMACAddress() != null)
|
||||
networkConnectionSectionChild.e("MACAddress").t(networkConnection.getMACAddress());
|
||||
if (networkConnection.getIpAddressAllocationMode() != null)
|
||||
networkConnectionSectionChild.e("IpAddressAllocationMode").t(
|
||||
networkConnection.getIpAddressAllocationMode().toString());
|
||||
}
|
||||
|
||||
if (net.getEdit() != null)
|
||||
networkConnectionSection.e("Link").a("rel", "edit").a("type", net.getType())
|
||||
.a("href", net.getHref().toASCIIString());
|
||||
|
||||
Properties outputProperties = new Properties();
|
||||
outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
|
||||
request = super.bindToRequest(request, networkConnectionSection.asString(outputProperties));
|
||||
request.getPayload().getContentMetadata().setContentType(net.getType());
|
||||
} catch (Exception e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
return request;
|
||||
}
|
||||
|
||||
}
|
|
@ -24,6 +24,7 @@ import java.util.Arrays;
|
|||
import org.jclouds.compute.options.TemplateOptions;
|
||||
import org.jclouds.io.Payload;
|
||||
import org.jclouds.util.Preconditions2;
|
||||
import org.jclouds.vcloud.domain.network.IpAddressAllocationMode;
|
||||
|
||||
/**
|
||||
* Contains options supported in the {@code ComputeService#runNode} operation on the "vcloud"
|
||||
|
@ -45,6 +46,7 @@ import org.jclouds.util.Preconditions2;
|
|||
public class VCloudTemplateOptions extends TemplateOptions {
|
||||
|
||||
private String customizationScript = null;
|
||||
private IpAddressAllocationMode ipAddressAllocationMode = null;
|
||||
|
||||
public static final VCloudTemplateOptions NONE = new VCloudTemplateOptions();
|
||||
|
||||
|
@ -57,8 +59,15 @@ public class VCloudTemplateOptions extends TemplateOptions {
|
|||
return this;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
/**
|
||||
* Specifies the ipAddressAllocationMode used to for network interfaces on the VMs
|
||||
*/
|
||||
public VCloudTemplateOptions ipAddressAllocationMode(IpAddressAllocationMode ipAddressAllocationMode) {
|
||||
this.ipAddressAllocationMode = ipAddressAllocationMode;
|
||||
return this;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
/**
|
||||
* @see VCloudTemplateOptions#customizationScript
|
||||
*/
|
||||
|
@ -67,6 +76,14 @@ public class VCloudTemplateOptions extends TemplateOptions {
|
|||
return VCloudTemplateOptions.class.cast(options.customizationScript(customizationScript));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see VCloudTemplateOptions#ipAddressAllocationMode
|
||||
*/
|
||||
public static VCloudTemplateOptions ipAddressAllocationMode(IpAddressAllocationMode ipAddressAllocationMode) {
|
||||
VCloudTemplateOptions options = new VCloudTemplateOptions();
|
||||
return VCloudTemplateOptions.class.cast(options.ipAddressAllocationMode(ipAddressAllocationMode));
|
||||
}
|
||||
|
||||
// methods that only facilitate returning the correct object type
|
||||
/**
|
||||
* @see TemplateOptions#inboundPorts
|
||||
|
@ -125,6 +142,13 @@ public class VCloudTemplateOptions extends TemplateOptions {
|
|||
return customizationScript;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return ipAddressAllocationMode on the vms
|
||||
*/
|
||||
public IpAddressAllocationMode getIpAddressAllocationMode() {
|
||||
return ipAddressAllocationMode;
|
||||
}
|
||||
|
||||
// methods that only facilitate returning the correct object type
|
||||
|
||||
/**
|
||||
|
@ -212,6 +236,7 @@ public class VCloudTemplateOptions extends TemplateOptions {
|
|||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + ((customizationScript == null) ? 0 : customizationScript.hashCode());
|
||||
result = prime * result + ((ipAddressAllocationMode == null) ? 0 : ipAddressAllocationMode.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -229,15 +254,17 @@ public class VCloudTemplateOptions extends TemplateOptions {
|
|||
return false;
|
||||
} else if (!customizationScript.equals(other.customizationScript))
|
||||
return false;
|
||||
if (ipAddressAllocationMode != other.ipAddressAllocationMode)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[customizationScript=" + customizationScript + ", inboundPorts=" + Arrays.toString(inboundPorts)
|
||||
+ ", privateKey=" + (privateKey != null) + ", publicKey=" + (publicKey != null) + ", runScript="
|
||||
+ (script != null) + ", port:seconds=" + port + ":" + seconds + ", metadata/details: " + includeMetadata
|
||||
+ "]";
|
||||
return "[customizationScript=" + (customizationScript != null) + ", ipAddressAllocationMode="
|
||||
+ ipAddressAllocationMode + ", inboundPorts=" + Arrays.toString(inboundPorts) + ", privateKey="
|
||||
+ (privateKey != null) + ", publicKey=" + (publicKey != null) + ", runScript=" + (script != null)
|
||||
+ ", port:seconds=" + port + ":" + seconds + ", metadata/details: " + includeMetadata + "]";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -38,11 +38,16 @@ import org.jclouds.logging.Logger;
|
|||
import org.jclouds.vcloud.VCloudClient;
|
||||
import org.jclouds.vcloud.compute.options.VCloudTemplateOptions;
|
||||
import org.jclouds.vcloud.domain.GuestCustomizationSection;
|
||||
import org.jclouds.vcloud.domain.NetworkConnection;
|
||||
import org.jclouds.vcloud.domain.NetworkConnectionSection;
|
||||
import org.jclouds.vcloud.domain.NetworkConnectionSection.Builder;
|
||||
import org.jclouds.vcloud.domain.Task;
|
||||
import org.jclouds.vcloud.domain.VApp;
|
||||
import org.jclouds.vcloud.domain.Vm;
|
||||
import org.jclouds.vcloud.domain.network.IpAddressAllocationMode;
|
||||
import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
|
@ -50,7 +55,8 @@ import com.google.common.collect.Iterables;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn implements CreateNodeWithGroupEncodedIntoName {
|
||||
public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn implements
|
||||
CreateNodeWithGroupEncodedIntoName {
|
||||
@Resource
|
||||
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
@ -60,8 +66,8 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA
|
|||
protected final Predicate<URI> successTester;
|
||||
|
||||
@Inject
|
||||
protected InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn(Predicate<URI> successTester, VCloudClient client,
|
||||
GetNodeMetadataStrategy getNode) {
|
||||
protected InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn(Predicate<URI> successTester,
|
||||
VCloudClient client, GetNodeMetadataStrategy getNode) {
|
||||
this.client = client;
|
||||
this.successTester = successTester;
|
||||
this.getNode = getNode;
|
||||
|
@ -70,13 +76,15 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA
|
|||
@Override
|
||||
public NodeMetadata createNodeWithGroupEncodedIntoName(String tag, String name, Template template) {
|
||||
InstantiateVAppTemplateOptions options = processorCount((int) getCores(template.getHardware())).memory(
|
||||
template.getHardware().getRam()).disk(
|
||||
(long) ((template.getHardware().getVolumes().get(0).getSize()) * 1024 * 1024l));
|
||||
template.getHardware().getRam()).disk(
|
||||
(long) ((template.getHardware().getVolumes().get(0).getSize()) * 1024 * 1024l));
|
||||
|
||||
String customizationScript = null;
|
||||
IpAddressAllocationMode ipAddressAllocationMode = null;
|
||||
if (template.getOptions() instanceof VCloudTemplateOptions) {
|
||||
customizationScript = VCloudTemplateOptions.class.cast(template.getOptions()).getCustomizationScript();
|
||||
if (customizationScript != null) {
|
||||
ipAddressAllocationMode = VCloudTemplateOptions.class.cast(template.getOptions()).getIpAddressAllocationMode();
|
||||
if (customizationScript != null || ipAddressAllocationMode != null) {
|
||||
options.customizeOnInstantiate(false);
|
||||
options.deploy(false);
|
||||
options.powerOn(false);
|
||||
|
@ -96,39 +104,64 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA
|
|||
|
||||
Task task = vAppResponse.getTasks().get(0);
|
||||
|
||||
if (customizationScript == null) {
|
||||
if (customizationScript == null && ipAddressAllocationMode == null) {
|
||||
return blockOnDeployAndPowerOnIfConfigured(options, vAppResponse, task);
|
||||
} else {
|
||||
if (!successTester.apply(task.getHref())) {
|
||||
throw new RuntimeException(String
|
||||
.format("failed to %s %s: %s", "instantiate", vAppResponse.getName(), task));
|
||||
throw new RuntimeException(
|
||||
String.format("failed to %s %s: %s", "instantiate", vAppResponse.getName(), task));
|
||||
}
|
||||
Vm vm = Iterables.get(client.getVApp(vAppResponse.getHref()).getChildren(), 0);
|
||||
GuestCustomizationSection guestConfiguration = vm.getGuestCustomizationSection();
|
||||
// guestConfiguration
|
||||
// .setCustomizationScript(guestConfiguration.getCustomizationScript()
|
||||
// != null ?
|
||||
// guestConfiguration
|
||||
// .getCustomizationScript()
|
||||
// + "\n" + customizationScript : customizationScript);
|
||||
guestConfiguration.setCustomizationScript(customizationScript);
|
||||
task = client.updateGuestCustomizationOfVm(vm.getHref(), guestConfiguration);
|
||||
if (!successTester.apply(task.getHref())) {
|
||||
throw new RuntimeException(String.format("failed to %s %s: %s", "updateGuestCustomizationOfVm", vm
|
||||
.getName(), task));
|
||||
}
|
||||
if (customizationScript != null)
|
||||
updateVmWithCustomizationScript(vm, customizationScript);
|
||||
if (ipAddressAllocationMode != null)
|
||||
updateVmWithIpAddressAllocationMode(vm, ipAddressAllocationMode);
|
||||
task = client.deployAndPowerOnVAppOrVm(vAppResponse.getHref());
|
||||
return blockOnDeployAndPowerOnIfConfigured(options, vAppResponse, task);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void updateVmWithCustomizationScript(Vm vm, String customizationScript) {
|
||||
Task task;
|
||||
GuestCustomizationSection guestConfiguration = vm.getGuestCustomizationSection();
|
||||
// TODO: determine if the server version is beyond 1.0.0, and if so append to, but
|
||||
// not overwrite the customization script. In version 1.0.0, the api returns a script that
|
||||
// loses newlines.
|
||||
guestConfiguration.setCustomizationScript(customizationScript);
|
||||
task = client.updateGuestCustomizationOfVm(vm.getHref(), guestConfiguration);
|
||||
if (!successTester.apply(task.getHref())) {
|
||||
throw new RuntimeException(String.format("failed to %s %s: %s", "updateGuestCustomizationOfVm", vm.getName(),
|
||||
task));
|
||||
}
|
||||
}
|
||||
|
||||
public void updateVmWithIpAddressAllocationMode(Vm vm, final IpAddressAllocationMode ipAddressAllocationMode) {
|
||||
Task task;
|
||||
NetworkConnectionSection net = vm.getNetworkConnectionSection();
|
||||
Builder builder = net.toBuilder();
|
||||
builder.connections(Iterables.transform(net.getConnections(),
|
||||
new Function<NetworkConnection, NetworkConnection>() {
|
||||
|
||||
@Override
|
||||
public NetworkConnection apply(NetworkConnection arg0) {
|
||||
return arg0.toBuilder().connected(true).ipAddressAllocationMode(ipAddressAllocationMode).build();
|
||||
}
|
||||
|
||||
}));
|
||||
task = client.updateNetworkConnectionOfVm(vm.getHref(), builder.build());
|
||||
if (!successTester.apply(task.getHref())) {
|
||||
throw new RuntimeException(String.format("failed to %s %s: %s", "updateNetworkConnectionOfVm", vm.getName(),
|
||||
task));
|
||||
}
|
||||
}
|
||||
|
||||
private NodeMetadata blockOnDeployAndPowerOnIfConfigured(InstantiateVAppTemplateOptions options, VApp vAppResponse,
|
||||
Task task) {
|
||||
Task task) {
|
||||
if (options.shouldBlock()) {
|
||||
if (!successTester.apply(task.getHref())) {
|
||||
throw new RuntimeException(String.format("failed to %s %s: %s", "deploy and power on", vAppResponse
|
||||
.getName(), task));
|
||||
throw new RuntimeException(String.format("failed to %s %s: %s", "deploy and power on",
|
||||
vAppResponse.getName(), task));
|
||||
}
|
||||
logger.debug("<< ready vApp(%s)", vAppResponse.getName());
|
||||
}
|
||||
|
|
|
@ -29,6 +29,67 @@ import org.jclouds.vcloud.domain.network.IpAddressAllocationMode;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
public class NetworkConnection {
|
||||
public static Builder builder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
|
||||
private String network;
|
||||
private int networkConnectionIndex;
|
||||
private String ipAddress;
|
||||
private String externalIpAddress;
|
||||
private boolean connected;
|
||||
private String MACAddress;
|
||||
private IpAddressAllocationMode ipAddressAllocationMode;
|
||||
|
||||
public Builder network(String network) {
|
||||
this.network = network;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder networkConnectionIndex(int networkConnectionIndex) {
|
||||
this.networkConnectionIndex = networkConnectionIndex;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder ipAddress(String ipAddress) {
|
||||
this.ipAddress = ipAddress;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder externalIpAddress(String externalIpAddress) {
|
||||
this.externalIpAddress = externalIpAddress;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder connected(boolean connected) {
|
||||
this.connected = connected;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder MACAddress(String MACAddress) {
|
||||
this.MACAddress = MACAddress;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder ipAddressAllocationMode(IpAddressAllocationMode ipAddressAllocationMode) {
|
||||
this.ipAddressAllocationMode = ipAddressAllocationMode;
|
||||
return this;
|
||||
}
|
||||
|
||||
public NetworkConnection build() {
|
||||
return new NetworkConnection(network, networkConnectionIndex, ipAddress, externalIpAddress, connected,
|
||||
MACAddress, ipAddressAllocationMode);
|
||||
}
|
||||
|
||||
public static Builder fromNetworkConnection(NetworkConnection in) {
|
||||
return new Builder().network(in.getNetwork()).networkConnectionIndex(in.getNetworkConnectionIndex())
|
||||
.ipAddress(in.getIpAddress()).externalIpAddress(in.getExternalIpAddress()).connected(in.isConnected())
|
||||
.MACAddress(in.getMACAddress()).ipAddressAllocationMode(in.getIpAddressAllocationMode());
|
||||
}
|
||||
}
|
||||
|
||||
private final String network;
|
||||
private final int networkConnectionIndex;
|
||||
@Nullable
|
||||
|
@ -41,8 +102,8 @@ public class NetworkConnection {
|
|||
private final IpAddressAllocationMode ipAddressAllocationMode;
|
||||
|
||||
public NetworkConnection(String network, int networkConnectionIndex, @Nullable String ipAddress,
|
||||
@Nullable String externalIpAddress, boolean connected, @Nullable String MACAddress,
|
||||
IpAddressAllocationMode ipAddressAllocationMode) {
|
||||
@Nullable String externalIpAddress, boolean connected, @Nullable String MACAddress,
|
||||
IpAddressAllocationMode ipAddressAllocationMode) {
|
||||
this.network = network;
|
||||
this.networkConnectionIndex = networkConnectionIndex;
|
||||
this.ipAddress = ipAddress;
|
||||
|
@ -162,11 +223,15 @@ public class NetworkConnection {
|
|||
return true;
|
||||
}
|
||||
|
||||
public Builder toBuilder() {
|
||||
return Builder.fromNetworkConnection(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[network=" + network + ", connected=" + connected + ", ipAddress=" + ipAddress + ", externalIpAddress="
|
||||
+ externalIpAddress + ", networkConnectionIndex=" + networkConnectionIndex
|
||||
+ ", ipAddressAllocationMode=" + ipAddressAllocationMode + ", MACAddress=" + MACAddress + "]";
|
||||
+ externalIpAddress + ", networkConnectionIndex=" + networkConnectionIndex + ", ipAddressAllocationMode="
|
||||
+ ipAddressAllocationMode + ", MACAddress=" + MACAddress + "]";
|
||||
}
|
||||
|
||||
}
|
|
@ -24,8 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
|||
import java.net.URI;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
|
||||
/**
|
||||
* The NetworkConnectionSection element specifies how a Vm is connected to a vApp network. It
|
||||
|
@ -36,20 +35,73 @@ import com.google.common.collect.Sets;
|
|||
* values specified in the NetworkConnectionSection override those specified in the NetworkSection.
|
||||
*/
|
||||
public class NetworkConnectionSection {
|
||||
public static Builder builder() {
|
||||
return new Builder();
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
protected String type;
|
||||
protected URI href;
|
||||
protected String info;
|
||||
protected Integer primaryNetworkConnectionIndex;
|
||||
protected Set<NetworkConnection> connections = ImmutableSet.of();
|
||||
protected ReferenceType edit;
|
||||
|
||||
public Builder type(String type) {
|
||||
this.type = type;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder href(URI href) {
|
||||
this.href = href;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder info(String info) {
|
||||
this.info = info;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder primaryNetworkConnectionIndex(Integer primaryNetworkConnectionIndex) {
|
||||
this.primaryNetworkConnectionIndex = primaryNetworkConnectionIndex;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder connections(Iterable<? extends NetworkConnection> connections) {
|
||||
this.connections = ImmutableSet.copyOf(checkNotNull(connections, "connections"));
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder edit(ReferenceType edit) {
|
||||
this.edit = edit;
|
||||
return this;
|
||||
}
|
||||
|
||||
public NetworkConnectionSection build() {
|
||||
return new NetworkConnectionSection(type, href, info, primaryNetworkConnectionIndex, connections, edit);
|
||||
}
|
||||
|
||||
public static Builder fromNetworkConnectionSection(NetworkConnectionSection in) {
|
||||
return new Builder().type(in.getType()).href(in.getHref()).info(in.getInfo())
|
||||
.primaryNetworkConnectionIndex(in.getPrimaryNetworkConnectionIndex()).connections(in.getConnections())
|
||||
.edit(in.getEdit());
|
||||
}
|
||||
}
|
||||
|
||||
protected final String type;
|
||||
protected final URI href;
|
||||
protected final String info;
|
||||
protected final Integer primaryNetworkConnectionIndex;
|
||||
protected final Set<NetworkConnection> connections = Sets.newLinkedHashSet();
|
||||
protected final Set<NetworkConnection> connections;
|
||||
protected final ReferenceType edit;
|
||||
|
||||
public NetworkConnectionSection(String type, URI href, String info, Integer primaryNetworkConnectionIndex,
|
||||
Iterable<NetworkConnection> connections, ReferenceType edit) {
|
||||
Iterable<NetworkConnection> connections, ReferenceType edit) {
|
||||
this.type = type;
|
||||
this.href = href;
|
||||
this.info = info;
|
||||
this.primaryNetworkConnectionIndex = primaryNetworkConnectionIndex;
|
||||
Iterables.addAll(this.connections, checkNotNull(connections, "connections"));
|
||||
this.connections = ImmutableSet.copyOf(checkNotNull(connections, "connections"));
|
||||
this.edit = edit;
|
||||
}
|
||||
|
||||
|
@ -109,7 +161,7 @@ public class NetworkConnectionSection {
|
|||
result = prime * result + ((href == null) ? 0 : href.hashCode());
|
||||
result = prime * result + ((info == null) ? 0 : info.hashCode());
|
||||
result = prime * result
|
||||
+ ((primaryNetworkConnectionIndex == null) ? 0 : primaryNetworkConnectionIndex.hashCode());
|
||||
+ ((primaryNetworkConnectionIndex == null) ? 0 : primaryNetworkConnectionIndex.hashCode());
|
||||
result = prime * result + ((type == null) ? 0 : type.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
@ -156,10 +208,14 @@ public class NetworkConnectionSection {
|
|||
return true;
|
||||
}
|
||||
|
||||
public Builder toBuilder() {
|
||||
return Builder.fromNetworkConnectionSection(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[href=" + href + ", connections=" + connections + ", primaryNetworkConnectionIndex="
|
||||
+ primaryNetworkConnectionIndex + "]";
|
||||
+ primaryNetworkConnectionIndex + "]";
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
/**
|
||||
*
|
||||
* 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.vcloud.binders;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.vcloud.VCloudPropertiesBuilder;
|
||||
import org.jclouds.vcloud.domain.NetworkConnection;
|
||||
import org.jclouds.vcloud.domain.NetworkConnectionSection;
|
||||
import org.jclouds.vcloud.domain.network.IpAddressAllocationMode;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.name.Names;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code BindNetworkConnectionSectionToXmlPayload}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit")
|
||||
public class BindNetworkConnectionSectionToXmlPayloadTest {
|
||||
Injector injector = Guice.createInjector(new AbstractModule() {
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
Properties props = new Properties();
|
||||
Names.bindProperties(binder(), checkNotNull(new VCloudPropertiesBuilder(props).build(), "properties"));
|
||||
}
|
||||
});
|
||||
|
||||
public void testWithIpAllocationModeNONE() throws IOException {
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
HttpRequest request = new HttpRequest.Builder().endpoint(URI.create("http://localhost/key")).method("GET")
|
||||
.build();
|
||||
|
||||
BindNetworkConnectionSectionToXmlPayload binder = injector
|
||||
.getInstance(BindNetworkConnectionSectionToXmlPayload.class);
|
||||
|
||||
binder.bindToRequest(
|
||||
request,
|
||||
NetworkConnectionSection
|
||||
.builder()
|
||||
.type("application/vnd.vmware.vcloud.networkConnectionSection+xml")
|
||||
.info("Specifies the available VM network connections")
|
||||
.href(URI.create("https://1.1.1.1/api/v1.0/vApp/vm-1/networkConnectionSection/"))
|
||||
.connections(
|
||||
ImmutableSet.<NetworkConnection> of(NetworkConnection.builder().network("none")
|
||||
.ipAddressAllocationMode(IpAddressAllocationMode.NONE).build())).build());
|
||||
assertEquals(request.getPayload().getContentMetadata().getContentType(),
|
||||
"application/vnd.vmware.vcloud.networkConnectionSection+xml");
|
||||
|
||||
assertEquals(
|
||||
request.getPayload().getRawContent(),
|
||||
"<NetworkConnectionSection xmlns=\"http://www.vmware.com/vcloud/v1\" xmlns:ovf=\"http://schemas.dmtf.org/ovf/envelope/1\" href=\"https://1.1.1.1/api/v1.0/vApp/vm-1/networkConnectionSection/\" ovf:required=\"false\" type=\"application/vnd.vmware.vcloud.networkConnectionSection+xml\"><ovf:Info>Specifies the available VM network connections</ovf:Info><NetworkConnection network=\"none\"><NetworkConnectionIndex>0</NetworkConnectionIndex><IsConnected>false</IsConnected><IpAddressAllocationMode>NONE</IpAddressAllocationMode></NetworkConnection></NetworkConnectionSection>");
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -24,12 +24,14 @@ import static org.jclouds.vcloud.compute.options.VCloudTemplateOptions.Builder.b
|
|||
import static org.jclouds.vcloud.compute.options.VCloudTemplateOptions.Builder.customizationScript;
|
||||
import static org.jclouds.vcloud.compute.options.VCloudTemplateOptions.Builder.inboundPorts;
|
||||
import static org.jclouds.vcloud.compute.options.VCloudTemplateOptions.Builder.installPrivateKey;
|
||||
import static org.jclouds.vcloud.compute.options.VCloudTemplateOptions.Builder.ipAddressAllocationMode;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.jclouds.compute.options.TemplateOptions;
|
||||
import org.jclouds.io.Payloads;
|
||||
import org.jclouds.vcloud.domain.network.IpAddressAllocationMode;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
|
@ -38,6 +40,18 @@ import org.testng.annotations.Test;
|
|||
* @author Adrian Cole
|
||||
*/
|
||||
public class VCloudTemplateOptionsTest {
|
||||
@Test
|
||||
public void testipAddressAllocationMode() {
|
||||
VCloudTemplateOptions options = new VCloudTemplateOptions();
|
||||
options.ipAddressAllocationMode(IpAddressAllocationMode.NONE);
|
||||
assertEquals(options.getIpAddressAllocationMode(), IpAddressAllocationMode.NONE);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testipAddressAllocationModeStatic() {
|
||||
VCloudTemplateOptions options = ipAddressAllocationMode(IpAddressAllocationMode.NONE);
|
||||
assertEquals(options.getIpAddressAllocationMode(), IpAddressAllocationMode.NONE);
|
||||
}
|
||||
|
||||
public void testAs() {
|
||||
TemplateOptions options = new VCloudTemplateOptions();
|
||||
|
@ -50,6 +64,12 @@ public class VCloudTemplateOptionsTest {
|
|||
options.customizationScript("");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNullcustomizationScript() {
|
||||
VCloudTemplateOptions options = new VCloudTemplateOptions();
|
||||
assertEquals(options.getCustomizationScript(), null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testcustomizationScript() {
|
||||
VCloudTemplateOptions options = new VCloudTemplateOptions();
|
||||
|
@ -57,12 +77,6 @@ public class VCloudTemplateOptionsTest {
|
|||
assertEquals(options.getCustomizationScript(), "mykeypair");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNullcustomizationScript() {
|
||||
VCloudTemplateOptions options = new VCloudTemplateOptions();
|
||||
assertEquals(options.getCustomizationScript(), null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testcustomizationScriptStatic() {
|
||||
VCloudTemplateOptions options = customizationScript("mykeypair");
|
||||
|
|
Loading…
Reference in New Issue