mirror of https://github.com/apache/jclouds.git
Configuration to deploy VMs from the Marketplace
This commit is contained in:
parent
25656f5f63
commit
43eb65938c
|
@ -24,6 +24,7 @@ import static org.jclouds.azurecompute.arm.compute.extensions.AzureComputeImageE
|
||||||
import static org.jclouds.azurecompute.arm.compute.extensions.AzureComputeImageExtension.CUSTOM_IMAGE_OFFER;
|
import static org.jclouds.azurecompute.arm.compute.extensions.AzureComputeImageExtension.CUSTOM_IMAGE_OFFER;
|
||||||
import static org.jclouds.azurecompute.arm.compute.functions.VMImageToImage.decodeFieldsFromUniqueId;
|
import static org.jclouds.azurecompute.arm.compute.functions.VMImageToImage.decodeFieldsFromUniqueId;
|
||||||
import static org.jclouds.azurecompute.arm.compute.functions.VMImageToImage.encodeFieldsToUniqueIdCustom;
|
import static org.jclouds.azurecompute.arm.compute.functions.VMImageToImage.encodeFieldsToUniqueIdCustom;
|
||||||
|
import static org.jclouds.azurecompute.arm.compute.functions.VMImageToImage.getMarketplacePlanFromImageMetadata;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.metadataAndTagsAsCommaDelimitedValue;
|
import static org.jclouds.compute.util.ComputeServiceUtils.metadataAndTagsAsCommaDelimitedValue;
|
||||||
import static org.jclouds.util.Closeables2.closeQuietly;
|
import static org.jclouds.util.Closeables2.closeQuietly;
|
||||||
|
|
||||||
|
@ -52,6 +53,7 @@ import org.jclouds.azurecompute.arm.domain.NetworkProfile;
|
||||||
import org.jclouds.azurecompute.arm.domain.OSDisk;
|
import org.jclouds.azurecompute.arm.domain.OSDisk;
|
||||||
import org.jclouds.azurecompute.arm.domain.OSProfile;
|
import org.jclouds.azurecompute.arm.domain.OSProfile;
|
||||||
import org.jclouds.azurecompute.arm.domain.Offer;
|
import org.jclouds.azurecompute.arm.domain.Offer;
|
||||||
|
import org.jclouds.azurecompute.arm.domain.Plan;
|
||||||
import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
|
import org.jclouds.azurecompute.arm.domain.PublicIPAddress;
|
||||||
import org.jclouds.azurecompute.arm.domain.PublicIPAddressProperties;
|
import org.jclouds.azurecompute.arm.domain.PublicIPAddressProperties;
|
||||||
import org.jclouds.azurecompute.arm.domain.RegionAndId;
|
import org.jclouds.azurecompute.arm.domain.RegionAndId;
|
||||||
|
@ -144,9 +146,10 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Virtual
|
||||||
.networkProfile(networkProfile).build();
|
.networkProfile(networkProfile).build();
|
||||||
|
|
||||||
Map<String, String> metadataAndTags = metadataAndTagsAsCommaDelimitedValue(template.getOptions());
|
Map<String, String> metadataAndTags = metadataAndTagsAsCommaDelimitedValue(template.getOptions());
|
||||||
|
Plan plan = getMarketplacePlanFromImageMetadata(template.getImage());
|
||||||
|
|
||||||
VirtualMachine virtualMachine = api.getVirtualMachineApi(azureGroup).create(name, template.getLocation().getId(),
|
VirtualMachine virtualMachine = api.getVirtualMachineApi(azureGroup).create(name, template.getLocation().getId(),
|
||||||
virtualMachineProperties, metadataAndTags);
|
virtualMachineProperties, metadataAndTags, plan);
|
||||||
|
|
||||||
// Safe to pass null credentials here, as jclouds will default populate
|
// Safe to pass null credentials here, as jclouds will default populate
|
||||||
// the node with the default credentials from the image, or the ones in
|
// the node with the default credentials from the image, or the ones in
|
||||||
|
@ -182,8 +185,9 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Virtual
|
||||||
for (SKU sku : skuList) {
|
for (SKU sku : skuList) {
|
||||||
Iterable<Version> versionList = osImageApi.listVersions(publisherName, offer.name(), sku.name());
|
Iterable<Version> versionList = osImageApi.listVersions(publisherName, offer.name(), sku.name());
|
||||||
for (Version version : versionList) {
|
for (Version version : versionList) {
|
||||||
|
Version versionDetails = osImageApi.getVersion(publisherName, offer.name(), sku.name(), version.name());
|
||||||
VMImage vmImage = VMImage.azureImage().publisher(publisherName).offer(offer.name()).sku(sku.name())
|
VMImage vmImage = VMImage.azureImage().publisher(publisherName).offer(offer.name()).sku(sku.name())
|
||||||
.version(version.name()).location(location).build();
|
.version(versionDetails.name()).location(location).versionProperties(version.properties()).build();
|
||||||
osImagesRef.add(vmImage);
|
osImagesRef.add(vmImage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -275,8 +279,9 @@ public class AzureComputeServiceAdapter implements ComputeServiceAdapter<Virtual
|
||||||
OSImageApi osImageApi = api.getOSImageApi(location);
|
OSImageApi osImageApi = api.getOSImageApi(location);
|
||||||
List<Version> versions = osImageApi.listVersions(publisher, offer, sku);
|
List<Version> versions = osImageApi.listVersions(publisher, offer, sku);
|
||||||
if (!versions.isEmpty()) {
|
if (!versions.isEmpty()) {
|
||||||
return VMImage.azureImage().publisher(publisher).offer(offer).sku(sku).version(versions.get(0).name())
|
Version version = osImageApi.getVersion(publisher, offer, sku, versions.get(0).name());
|
||||||
.location(location).build();
|
return VMImage.azureImage().publisher(publisher).offer(offer).sku(sku).version(version.name())
|
||||||
|
.location(location).versionProperties(version.properties()).build();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,9 +16,13 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.azurecompute.arm.compute.functions;
|
package org.jclouds.azurecompute.arm.compute.functions;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.jclouds.azurecompute.arm.domain.ImageReference;
|
import org.jclouds.azurecompute.arm.domain.ImageReference;
|
||||||
|
import org.jclouds.azurecompute.arm.domain.Plan;
|
||||||
import org.jclouds.azurecompute.arm.domain.VMImage;
|
import org.jclouds.azurecompute.arm.domain.VMImage;
|
||||||
import org.jclouds.collect.Memoized;
|
import org.jclouds.collect.Memoized;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
|
@ -26,17 +30,19 @@ import org.jclouds.compute.domain.ImageBuilder;
|
||||||
import org.jclouds.compute.domain.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
import org.jclouds.compute.domain.OsFamily;
|
import org.jclouds.compute.domain.OsFamily;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
import org.jclouds.location.predicates.LocationPredicates;
|
import org.jclouds.location.predicates.LocationPredicates;
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.collect.FluentIterable;
|
import com.google.common.collect.FluentIterable;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
|
||||||
|
|
||||||
public class VMImageToImage implements Function<VMImage, Image> {
|
public class VMImageToImage implements Function<VMImage, Image> {
|
||||||
|
|
||||||
|
public static final String MARKETPLACE_TAG = "marketplace";
|
||||||
|
|
||||||
private static final String UBUNTU = "Ubuntu";
|
private static final String UBUNTU = "Ubuntu";
|
||||||
private static final String WINDOWS = "Windows";
|
private static final String WINDOWS = "Windows";
|
||||||
private static final String OPENLOGIC = "openLogic";
|
private static final String OPENLOGIC = "openLogic";
|
||||||
|
@ -50,16 +56,20 @@ public class VMImageToImage implements Function<VMImage, Image> {
|
||||||
|
|
||||||
private final Supplier<Set<? extends org.jclouds.domain.Location>> locations;
|
private final Supplier<Set<? extends org.jclouds.domain.Location>> locations;
|
||||||
|
|
||||||
public static String encodeFieldsToUniqueId(boolean globallyAvailable, String locatioName, ImageReference imageReference){
|
public static String encodeFieldsToUniqueId(boolean globallyAvailable, String locatioName,
|
||||||
return (globallyAvailable ? "global" : locatioName) + "/" + imageReference.publisher() + "/" + imageReference.offer() + "/" + imageReference.sku();
|
ImageReference imageReference) {
|
||||||
|
return (globallyAvailable ? "global" : locatioName) + "/" + imageReference.publisher() + "/"
|
||||||
|
+ imageReference.offer() + "/" + imageReference.sku();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String encodeFieldsToUniqueId(VMImage imageReference){
|
public static String encodeFieldsToUniqueId(VMImage imageReference) {
|
||||||
return (imageReference.globallyAvailable() ? "global" : imageReference.location()) + "/" + imageReference.publisher() + "/" + imageReference.offer() + "/" + imageReference.sku();
|
return (imageReference.globallyAvailable() ? "global" : imageReference.location()) + "/"
|
||||||
|
+ imageReference.publisher() + "/" + imageReference.offer() + "/" + imageReference.sku();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String encodeFieldsToUniqueIdCustom(VMImage imageReference){
|
public static String encodeFieldsToUniqueIdCustom(VMImage imageReference) {
|
||||||
return (imageReference.globallyAvailable() ? "global" : imageReference.location()) + "/" + imageReference.group() + "/" + imageReference.storage() + "/" + imageReference.offer() + "/" + imageReference.name();
|
return (imageReference.globallyAvailable() ? "global" : imageReference.location()) + "/" + imageReference.group()
|
||||||
|
+ "/" + imageReference.storage() + "/" + imageReference.offer() + "/" + imageReference.name();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static VMImage decodeFieldsFromUniqueId(final String id) {
|
public static VMImage decodeFieldsFromUniqueId(final String id) {
|
||||||
|
@ -74,7 +84,8 @@ public class VMImageToImage implements Function<VMImage, Image> {
|
||||||
3: imageReference.offer + "/" +
|
3: imageReference.offer + "/" +
|
||||||
4: imageReference.name
|
4: imageReference.name
|
||||||
*/
|
*/
|
||||||
vmImage = VMImage.customImage().location(fields[0]).group(fields[1]).storage(fields[2]).vhd1(fields[3]).offer(fields[4]).build();
|
vmImage = VMImage.customImage().location(fields[0]).group(fields[1]).storage(fields[2]).vhd1(fields[3])
|
||||||
|
.offer(fields[4]).build();
|
||||||
} else {
|
} else {
|
||||||
/* id fields indexes
|
/* id fields indexes
|
||||||
0: imageReference.location) + "/" +
|
0: imageReference.location) + "/" +
|
||||||
|
@ -82,7 +93,8 @@ public class VMImageToImage implements Function<VMImage, Image> {
|
||||||
2: imageReference.offer + "/" +
|
2: imageReference.offer + "/" +
|
||||||
3: imageReference.sku + "/" +
|
3: imageReference.sku + "/" +
|
||||||
*/
|
*/
|
||||||
vmImage = VMImage.azureImage().location(fields[0]).publisher(fields[1]).offer(fields[2]).sku(fields[3]).build();
|
vmImage = VMImage.azureImage().location(fields[0]).publisher(fields[1]).offer(fields[2]).sku(fields[3])
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
return vmImage;
|
return vmImage;
|
||||||
}
|
}
|
||||||
|
@ -94,37 +106,49 @@ public class VMImageToImage implements Function<VMImage, Image> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Image apply(final VMImage image) {
|
public Image apply(final VMImage image) {
|
||||||
|
final ImageBuilder builder = new ImageBuilder();
|
||||||
|
addMarketplacePlanToMetadataIfPresent(builder, image);
|
||||||
if (image.custom()) {
|
if (image.custom()) {
|
||||||
final ImageBuilder builder = new ImageBuilder()
|
builder.location(
|
||||||
.location(FluentIterable.from(locations.get())
|
FluentIterable.from(locations.get()).firstMatch(LocationPredicates.idEquals(image.location()))
|
||||||
.firstMatch(LocationPredicates.idEquals(image.location()))
|
.get()).name(image.name()).description(image.group()).status(Image.Status.AVAILABLE)
|
||||||
.get())
|
.version("latest").providerId(image.vhd1()).id(encodeFieldsToUniqueIdCustom(image));
|
||||||
.name(image.name())
|
|
||||||
.description(image.group())
|
|
||||||
.status(Image.Status.AVAILABLE)
|
|
||||||
.version("latest")
|
|
||||||
.providerId(image.vhd1())
|
|
||||||
.id(encodeFieldsToUniqueIdCustom(image));
|
|
||||||
|
|
||||||
final OperatingSystem.Builder osBuilder = osFamily().apply(image);
|
final OperatingSystem.Builder osBuilder = osFamily().apply(image);
|
||||||
Image retimage = builder.operatingSystem(osBuilder.build()).build();
|
builder.operatingSystem(osBuilder.build());
|
||||||
return retimage;
|
} else {
|
||||||
}
|
builder
|
||||||
else {
|
|
||||||
final ImageBuilder builder = new ImageBuilder()
|
|
||||||
.name(image.offer())
|
.name(image.offer())
|
||||||
.description(image.sku())
|
.description(image.sku())
|
||||||
.status(Image.Status.AVAILABLE)
|
.status(Image.Status.AVAILABLE)
|
||||||
.version(image.sku())
|
.version(image.sku())
|
||||||
.id(encodeFieldsToUniqueId(image))
|
.id(encodeFieldsToUniqueId(image))
|
||||||
.providerId(image.publisher())
|
.providerId(image.publisher())
|
||||||
.location(image.globallyAvailable() ? null : FluentIterable.from(locations.get())
|
.location(
|
||||||
.firstMatch(LocationPredicates.idEquals(image.location()))
|
image.globallyAvailable() ? null : FluentIterable.from(locations.get())
|
||||||
.get());
|
.firstMatch(LocationPredicates.idEquals(image.location())).get());
|
||||||
|
|
||||||
final OperatingSystem.Builder osBuilder = osFamily().apply(image);
|
final OperatingSystem.Builder osBuilder = osFamily().apply(image);
|
||||||
return builder.operatingSystem(osBuilder.build()).build();
|
builder.operatingSystem(osBuilder.build());
|
||||||
}
|
}
|
||||||
|
return builder.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addMarketplacePlanToMetadataIfPresent(ImageBuilder builder, VMImage image) {
|
||||||
|
if (image.versionProperties() != null && image.versionProperties().plan() != null) {
|
||||||
|
// Store the plan information in the metadata so the adapter can
|
||||||
|
// properly configure it when deploying images from the marketplace
|
||||||
|
Plan plan = image.versionProperties().plan();
|
||||||
|
builder.userMetadata(ImmutableMap.of("publisher", plan.publisher(), "name", plan.name(), "product",
|
||||||
|
plan.product()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
public static Plan getMarketplacePlanFromImageMetadata(Image image) {
|
||||||
|
Map<String, String> imageMetadata = image.getUserMetadata();
|
||||||
|
return imageMetadata.containsKey("product") ? Plan.create(imageMetadata.get("publisher"),
|
||||||
|
imageMetadata.get("name"), imageMetadata.get("product")) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Function<VMImage, OperatingSystem.Builder> osFamily() {
|
public static Function<VMImage, OperatingSystem.Builder> osFamily() {
|
||||||
|
@ -151,12 +175,17 @@ public class VMImageToImage implements Function<VMImage, Image> {
|
||||||
family = OsFamily.RHEL;
|
family = OsFamily.RHEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fallback to generic operating system type
|
||||||
|
if (OsFamily.UNRECOGNIZED == family && image.versionProperties() != null
|
||||||
|
&& image.versionProperties().osDiskImage() != null
|
||||||
|
&& image.versionProperties().osDiskImage().operatingSystem() != null) {
|
||||||
|
family = OsFamily.fromValue(image.versionProperties().osDiskImage().operatingSystem().toUpperCase());
|
||||||
|
}
|
||||||
|
|
||||||
// only 64bit OS images are supported by Azure ARM
|
// only 64bit OS images are supported by Azure ARM
|
||||||
return OperatingSystem.builder().
|
return OperatingSystem.builder().family(family).is64Bit(true)
|
||||||
family(family).
|
.description(image.custom() ? image.vhd1() : image.sku())
|
||||||
is64Bit(true).
|
.version(image.custom() ? "latest" : image.sku());
|
||||||
description(image.custom() ? image.vhd1() : image.sku()).
|
|
||||||
version(image.custom() ? "latest" : image.sku());
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You 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.azurecompute.arm.domain;
|
||||||
|
|
||||||
|
import org.jclouds.json.SerializedNames;
|
||||||
|
|
||||||
|
import com.google.auto.value.AutoValue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plan
|
||||||
|
*/
|
||||||
|
@AutoValue
|
||||||
|
public abstract class Plan {
|
||||||
|
/**
|
||||||
|
* The publisher of the Plan
|
||||||
|
*/
|
||||||
|
public abstract String publisher();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the Plan
|
||||||
|
*/
|
||||||
|
public abstract String name();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The product of the Plan
|
||||||
|
*/
|
||||||
|
public abstract String product();
|
||||||
|
|
||||||
|
@SerializedNames({"publisher", "name", "product"})
|
||||||
|
public static Plan create(final String publisher, final String name, final String product) {
|
||||||
|
return new AutoValue_Plan(publisher, name, product);
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,6 +16,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.azurecompute.arm.domain;
|
package org.jclouds.azurecompute.arm.domain;
|
||||||
|
|
||||||
|
import org.jclouds.azurecompute.arm.domain.Version.VersionProperties;
|
||||||
import org.jclouds.javax.annotation.Nullable;
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
|
|
||||||
import com.google.auto.value.AutoValue;
|
import com.google.auto.value.AutoValue;
|
||||||
|
@ -92,6 +93,12 @@ public abstract class VMImage {
|
||||||
*/
|
*/
|
||||||
public abstract boolean custom();
|
public abstract boolean custom();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extended version properties.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public abstract VersionProperties versionProperties();
|
||||||
|
|
||||||
public static Builder builder() {
|
public static Builder builder() {
|
||||||
return new AutoValue_VMImage.Builder();
|
return new AutoValue_VMImage.Builder();
|
||||||
}
|
}
|
||||||
|
@ -119,6 +126,7 @@ public abstract class VMImage {
|
||||||
public abstract Builder vhd2(String vhd2);
|
public abstract Builder vhd2(String vhd2);
|
||||||
public abstract Builder name(String name);
|
public abstract Builder name(String name);
|
||||||
public abstract Builder custom(boolean custom);
|
public abstract Builder custom(boolean custom);
|
||||||
|
public abstract Builder versionProperties(VersionProperties versionProperties);
|
||||||
|
|
||||||
public abstract VMImage build();
|
public abstract VMImage build();
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,9 +16,11 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.azurecompute.arm.domain;
|
package org.jclouds.azurecompute.arm.domain;
|
||||||
|
|
||||||
import com.google.auto.value.AutoValue;
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
import org.jclouds.json.SerializedNames;
|
import org.jclouds.json.SerializedNames;
|
||||||
|
|
||||||
|
import com.google.auto.value.AutoValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Version
|
* Version
|
||||||
*/
|
*/
|
||||||
|
@ -40,10 +42,49 @@ public abstract class Version {
|
||||||
*/
|
*/
|
||||||
public abstract String id();
|
public abstract String id();
|
||||||
|
|
||||||
@SerializedNames({"location", "name", "id"})
|
/**
|
||||||
public static Version create(final String location, final String name, final String id) {
|
* The plan for the Version if this image is from the marketplace.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public abstract VersionProperties properties();
|
||||||
|
|
||||||
return new AutoValue_Version(location, name, id);
|
Version() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@SerializedNames({"location", "name", "id", "properties"})
|
||||||
|
public static Version create(final String location, final String name, final String id,
|
||||||
|
final VersionProperties properties) {
|
||||||
|
return new AutoValue_Version(location, name, id, properties);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AutoValue
|
||||||
|
public abstract static class VersionProperties {
|
||||||
|
@Nullable public abstract Plan plan();
|
||||||
|
public abstract OSDiskImage osDiskImage();
|
||||||
|
|
||||||
|
VersionProperties() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@SerializedNames({"plan", "osDiskImage"})
|
||||||
|
public static VersionProperties create(Plan plan, OSDiskImage osDiskImage) {
|
||||||
|
return new AutoValue_Version_VersionProperties(plan, osDiskImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AutoValue
|
||||||
|
public abstract static class OSDiskImage {
|
||||||
|
public abstract String operatingSystem();
|
||||||
|
|
||||||
|
OSDiskImage() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@SerializedNames({"operatingSystem"})
|
||||||
|
public static OSDiskImage create(String operatingSystem) {
|
||||||
|
return new AutoValue_Version_VersionProperties_OSDiskImage(operatingSystem);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,10 +61,41 @@ public abstract class VirtualMachine {
|
||||||
*/
|
*/
|
||||||
public abstract VirtualMachineProperties properties();
|
public abstract VirtualMachineProperties properties();
|
||||||
|
|
||||||
@SerializedNames({"id", "name", "type", "location", "tags", "properties"})
|
/**
|
||||||
public static VirtualMachine create(final String id, final String name, final String type, final String location,
|
* Specifies the plan, for marketplace images
|
||||||
@Nullable final Map<String, String> tags, VirtualMachineProperties properties) {
|
*/
|
||||||
|
@Nullable
|
||||||
|
public abstract Plan plan();
|
||||||
|
|
||||||
return new AutoValue_VirtualMachine(id, name, type, location, tags == null ? null : ImmutableMap.copyOf(tags), properties);
|
@SerializedNames({"id", "name", "type", "location", "tags", "properties", "plan"})
|
||||||
|
public static VirtualMachine create(final String id, final String name, final String type, final String location,
|
||||||
|
@Nullable final Map<String, String> tags, VirtualMachineProperties properties, @Nullable Plan plan) {
|
||||||
|
return builder().id(id).name(name).type(type).location(location).tags(tags).properties(properties).plan(plan)
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Builder builder() {
|
||||||
|
return new AutoValue_VirtualMachine.Builder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@AutoValue.Builder
|
||||||
|
public abstract static class Builder {
|
||||||
|
|
||||||
|
public abstract Builder id(String id);
|
||||||
|
public abstract Builder name(String name);
|
||||||
|
public abstract Builder type(String type);
|
||||||
|
public abstract Builder location(String location);
|
||||||
|
public abstract Builder tags(Map<String, String> tags);
|
||||||
|
public abstract Builder properties(VirtualMachineProperties properties);
|
||||||
|
public abstract Builder plan(Plan plan);
|
||||||
|
|
||||||
|
abstract Map<String, String> tags();
|
||||||
|
|
||||||
|
abstract VirtualMachine autoBuild();
|
||||||
|
|
||||||
|
public VirtualMachine build() {
|
||||||
|
tags(tags() != null ? ImmutableMap.copyOf(tags()) : null);
|
||||||
|
return autoBuild();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,4 +80,14 @@ public interface OSImageApi {
|
||||||
@Fallback(EmptyListOnNotFoundOr404.class)
|
@Fallback(EmptyListOnNotFoundOr404.class)
|
||||||
List<Version> listVersions(@PathParam("publisher") String publisher, @PathParam("offer") String offer,
|
List<Version> listVersions(@PathParam("publisher") String publisher, @PathParam("offer") String offer,
|
||||||
@PathParam("sku") String sku);
|
@PathParam("sku") String sku);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the details of a Version
|
||||||
|
*/
|
||||||
|
@Named("version:get")
|
||||||
|
@GET
|
||||||
|
@Path("/publishers/{publisher}/artifacttypes/vmimage/offers/{offer}/skus/{sku}/versions/{version}")
|
||||||
|
@Fallback(EmptyListOnNotFoundOr404.class)
|
||||||
|
Version getVersion(@PathParam("publisher") String publisher, @PathParam("offer") String offer,
|
||||||
|
@PathParam("sku") String sku, @PathParam("version") String version);
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,11 +32,13 @@ import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
|
||||||
import org.jclouds.Fallbacks;
|
import org.jclouds.Fallbacks;
|
||||||
|
import org.jclouds.azurecompute.arm.domain.Plan;
|
||||||
import org.jclouds.azurecompute.arm.domain.VirtualMachine;
|
import org.jclouds.azurecompute.arm.domain.VirtualMachine;
|
||||||
import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
|
import org.jclouds.azurecompute.arm.domain.VirtualMachineInstance;
|
||||||
import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
|
import org.jclouds.azurecompute.arm.domain.VirtualMachineProperties;
|
||||||
import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
|
import org.jclouds.azurecompute.arm.filters.ApiVersionFilter;
|
||||||
import org.jclouds.azurecompute.arm.functions.URIParser;
|
import org.jclouds.azurecompute.arm.functions.URIParser;
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
import org.jclouds.oauth.v2.filters.OAuthFilter;
|
import org.jclouds.oauth.v2.filters.OAuthFilter;
|
||||||
import org.jclouds.rest.annotations.Fallback;
|
import org.jclouds.rest.annotations.Fallback;
|
||||||
import org.jclouds.rest.annotations.MapBinder;
|
import org.jclouds.rest.annotations.MapBinder;
|
||||||
|
@ -81,7 +83,7 @@ public interface VirtualMachineApi {
|
||||||
*/
|
*/
|
||||||
@Named("CreateVirtualMachine")
|
@Named("CreateVirtualMachine")
|
||||||
@PUT
|
@PUT
|
||||||
@Payload("%7B\"location\":\"{location}\",\"tags\":{tags},\"properties\":{properties}%7D")
|
@Payload("%7B\"location\":\"{location}\",\"tags\":{tags},\"properties\":{properties},\"plan\":{plan}%7D")
|
||||||
@MapBinder(BindToJsonPayload.class)
|
@MapBinder(BindToJsonPayload.class)
|
||||||
@Path("/{vmname}")
|
@Path("/{vmname}")
|
||||||
@QueryParams(keys = "validating", values = "false")
|
@QueryParams(keys = "validating", values = "false")
|
||||||
|
@ -89,7 +91,8 @@ public interface VirtualMachineApi {
|
||||||
VirtualMachine create(@PathParam("vmname") String vmname,
|
VirtualMachine create(@PathParam("vmname") String vmname,
|
||||||
@PayloadParam("location") String location,
|
@PayloadParam("location") String location,
|
||||||
@PayloadParam("properties") VirtualMachineProperties properties,
|
@PayloadParam("properties") VirtualMachineProperties properties,
|
||||||
@PayloadParam("tags") Map<String, String> tags);
|
@PayloadParam("tags") Map<String, String> tags,
|
||||||
|
@Nullable @PayloadParam("plan") Plan plan);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The List Virtual Machines operation
|
* The List Virtual Machines operation
|
||||||
|
|
|
@ -113,7 +113,7 @@ public class VirtualMachineApiLiveTest extends BaseAzureComputeApiLiveTest {
|
||||||
String blob = storageService.storageServiceProperties().primaryEndpoints().get("blob");
|
String blob = storageService.storageServiceProperties().primaryEndpoints().get("blob");
|
||||||
|
|
||||||
VirtualMachine vm = api().create(vmName, LOCATION, getProperties(blob, nicName),
|
VirtualMachine vm = api().create(vmName, LOCATION, getProperties(blob, nicName),
|
||||||
Collections.<String, String> emptyMap());
|
Collections.<String, String> emptyMap(), null);
|
||||||
assertTrue(!vm.name().isEmpty());
|
assertTrue(!vm.name().isEmpty());
|
||||||
|
|
||||||
//Poll until resource is ready to be used
|
//Poll until resource is ready to be used
|
||||||
|
|
|
@ -37,6 +37,7 @@ import org.jclouds.azurecompute.arm.domain.ImageReference;
|
||||||
import org.jclouds.azurecompute.arm.domain.NetworkProfile;
|
import org.jclouds.azurecompute.arm.domain.NetworkProfile;
|
||||||
import org.jclouds.azurecompute.arm.domain.OSDisk;
|
import org.jclouds.azurecompute.arm.domain.OSDisk;
|
||||||
import org.jclouds.azurecompute.arm.domain.OSProfile;
|
import org.jclouds.azurecompute.arm.domain.OSProfile;
|
||||||
|
import org.jclouds.azurecompute.arm.domain.Plan;
|
||||||
import org.jclouds.azurecompute.arm.domain.StorageProfile;
|
import org.jclouds.azurecompute.arm.domain.StorageProfile;
|
||||||
import org.jclouds.azurecompute.arm.domain.VHD;
|
import org.jclouds.azurecompute.arm.domain.VHD;
|
||||||
import org.jclouds.azurecompute.arm.domain.VirtualMachine;
|
import org.jclouds.azurecompute.arm.domain.VirtualMachine;
|
||||||
|
@ -55,16 +56,18 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
public void testGet() throws Exception {
|
public void testGet() throws Exception {
|
||||||
server.enqueue(jsonResponse("/virtualmachine.json"));
|
server.enqueue(jsonResponse("/virtualmachine.json"));
|
||||||
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
assertEquals(vmAPI.get("windowsmachine"), getVM());
|
assertEquals(vmAPI.get("windowsmachine"),
|
||||||
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
getVM(Plan.create("thinkboxsoftware", "deadline-slave-7-2", "deadline7-2")));
|
||||||
"/virtualMachines/windowsmachine?api-version=2016-03-30");
|
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
|
+ "/virtualMachines/windowsmachine?api-version=2016-03-30");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetEmpty() throws Exception {
|
public void testGetEmpty() throws Exception {
|
||||||
server.enqueue(new MockResponse().setResponseCode(404));
|
server.enqueue(new MockResponse().setResponseCode(404));
|
||||||
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
assertNull(vmAPI.get("windowsmachine"));
|
assertNull(vmAPI.get("windowsmachine"));
|
||||||
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/windowsmachine?api-version=2016-03-30");
|
+ "/virtualMachines/windowsmachine?api-version=2016-03-30");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetInstanceDetails() throws Exception {
|
public void testGetInstanceDetails() throws Exception {
|
||||||
|
@ -76,52 +79,80 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
assertEquals(actual.statuses().get(0).code(), expected.statuses().get(0).code());
|
assertEquals(actual.statuses().get(0).code(), expected.statuses().get(0).code());
|
||||||
assertEquals(actual.statuses().get(0).displayStatus(), expected.statuses().get(0).displayStatus());
|
assertEquals(actual.statuses().get(0).displayStatus(), expected.statuses().get(0).displayStatus());
|
||||||
assertEquals(actual.statuses().get(0).level(), expected.statuses().get(0).level());
|
assertEquals(actual.statuses().get(0).level(), expected.statuses().get(0).level());
|
||||||
//assertEquals(actual.statuses().get(0).time().toString(), expected.statuses().get(0).time().toString());
|
// assertEquals(actual.statuses().get(0).time().toString(),
|
||||||
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
// expected.statuses().get(0).time().toString());
|
||||||
"/virtualMachines/windowsmachine/instanceView?api-version=2016-03-30");
|
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
|
+ "/virtualMachines/windowsmachine/instanceView?api-version=2016-03-30");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetInstanceDetailsEmpty() throws Exception {
|
public void testGetInstanceDetailsEmpty() throws Exception {
|
||||||
server.enqueue(new MockResponse().setResponseCode(404));
|
server.enqueue(new MockResponse().setResponseCode(404));
|
||||||
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
assertNull(vmAPI.getInstanceDetails("windowsmachine"));
|
assertNull(vmAPI.getInstanceDetails("windowsmachine"));
|
||||||
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/windowsmachine/instanceView?api-version=2016-03-30");
|
+ "/virtualMachines/windowsmachine/instanceView?api-version=2016-03-30");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testList() throws Exception {
|
public void testList() throws Exception {
|
||||||
server.enqueue(jsonResponse("/virtualmachines.json"));
|
server.enqueue(jsonResponse("/virtualmachines.json"));
|
||||||
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
assertEquals(vmAPI.list(), getVMList());
|
assertEquals(vmAPI.list(), getVMList());
|
||||||
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines?api-version=2015-06-15");
|
+ "/virtualMachines?api-version=2015-06-15");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testListEmpty() throws Exception {
|
public void testListEmpty() throws Exception {
|
||||||
server.enqueue(new MockResponse().setResponseCode(404));
|
server.enqueue(new MockResponse().setResponseCode(404));
|
||||||
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
assertTrue(isEmpty(vmAPI.list()));
|
assertTrue(isEmpty(vmAPI.list()));
|
||||||
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "GET", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines?api-version=2015-06-15");
|
+ "/virtualMachines?api-version=2015-06-15");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCreateWithPlan() throws Exception {
|
||||||
|
server.enqueue(jsonResponse("/createvirtualmachineresponse.json"));
|
||||||
|
Plan plan = Plan.create("thinkboxsoftware", "deadline-slave-7-2", "deadline7-2");
|
||||||
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
|
VirtualMachine vm = vmAPI
|
||||||
|
.create("windowsmachine", "westus", getProperties(), ImmutableMap.of("foo", "bar"), plan);
|
||||||
|
assertEquals(vm, getVM(plan));
|
||||||
|
assertSent(
|
||||||
|
server,
|
||||||
|
"PUT",
|
||||||
|
"/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
|
+ "/virtualMachines/windowsmachine?validating=false&api-version=2016-03-30",
|
||||||
|
"{\"location\":\"westus\",\"tags\":{\"foo\":\"bar\"},\"properties\":"
|
||||||
|
+ "{\"vmId\":\"27ee085b-d707-xxxx-yyyy-2370e2eb1cc1\","
|
||||||
|
+ "\"hardwareProfile\":{\"vmSize\":\"Standard_D1\"},"
|
||||||
|
+ "\"storageProfile\":{\"imageReference\":{\"publisher\":\"publisher\",\"offer\":\"offer\",\"sku\":\"sku\",\"version\":\"ver\"},"
|
||||||
|
+ "\"osDisk\":{\"osType\":\"Windows\",\"name\":\"windowsmachine\","
|
||||||
|
+ "\"vhd\":{\"uri\":\"https://groupname2760.blob.core.windows.net/vhds/windowsmachine201624102936.vhd\"},\"caching\":\"ReadWrite\",\"createOption\":\"FromImage\"},\"dataDisks\":[]},"
|
||||||
|
+ "\"osProfile\":{\"computerName\":\"windowsmachine\",\"adminUsername\":\"azureuser\",\"windowsConfiguration\":{\"provisionVMAgent\":false,\"enableAutomaticUpdates\":true}},"
|
||||||
|
+ "\"networkProfile\":{\"networkInterfaces\":[{\"id\":\"/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/windowsmachine167\"}]},"
|
||||||
|
+ "\"diagnosticsProfile\":{\"bootDiagnostics\":{\"enabled\":true,\"storageUri\":\"https://groupname2760.blob.core.windows.net/\"}},\"provisioningState\":\"CREATING\"},"
|
||||||
|
+ "\"plan\":{\"name\":\"deadline-slave-7-2\",\"publisher\":\"thinkboxsoftware\",\"product\":\"deadline7-2\"}}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCreate() throws Exception {
|
public void testCreate() throws Exception {
|
||||||
server.enqueue(jsonResponse("/createvirtualmachineresponse.json"));
|
server.enqueue(jsonResponse("/createvirtualmachineresponse.json"));
|
||||||
|
|
||||||
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
VirtualMachine vm = vmAPI.create("windowsmachine", "westus", getProperties(), ImmutableMap.of("foo", "bar"));
|
VirtualMachine vm = vmAPI.create("windowsmachine", "westus", getProperties(), ImmutableMap.of("foo", "bar"), null);
|
||||||
assertEquals(vm, getVM());
|
assertEquals(vm, getVM());
|
||||||
assertSent(server, "PUT", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(
|
||||||
"/virtualMachines/windowsmachine?validating=false&api-version=2016-03-30",
|
server,
|
||||||
"{\"location\":\"westus\",\"tags\":{\"foo\":\"bar\"},\"properties\":" +
|
"PUT",
|
||||||
"{\"vmId\":\"27ee085b-d707-xxxx-yyyy-2370e2eb1cc1\"," +
|
"/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"\"hardwareProfile\":{\"vmSize\":\"Standard_D1\"}," +
|
+ "/virtualMachines/windowsmachine?validating=false&api-version=2016-03-30",
|
||||||
"\"storageProfile\":{\"imageReference\":{\"publisher\":\"publisher\",\"offer\":\"offer\",\"sku\":\"sku\",\"version\":\"ver\"}," +
|
"{\"location\":\"westus\",\"tags\":{\"foo\":\"bar\"},\"properties\":"
|
||||||
"\"osDisk\":{\"osType\":\"Windows\",\"name\":\"windowsmachine\"," +
|
+ "{\"vmId\":\"27ee085b-d707-xxxx-yyyy-2370e2eb1cc1\","
|
||||||
"\"vhd\":{\"uri\":\"https://groupname2760.blob.core.windows.net/vhds/windowsmachine201624102936.vhd\"},\"caching\":\"ReadWrite\",\"createOption\":\"FromImage\"},\"dataDisks\":[]}," +
|
+ "\"hardwareProfile\":{\"vmSize\":\"Standard_D1\"},"
|
||||||
"\"osProfile\":{\"computerName\":\"windowsmachine\",\"adminUsername\":\"azureuser\",\"windowsConfiguration\":{\"provisionVMAgent\":false,\"enableAutomaticUpdates\":true}}," +
|
+ "\"storageProfile\":{\"imageReference\":{\"publisher\":\"publisher\",\"offer\":\"offer\",\"sku\":\"sku\",\"version\":\"ver\"},"
|
||||||
"\"networkProfile\":{\"networkInterfaces\":[{\"id\":\"/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/windowsmachine167\"}]}," +
|
+ "\"osDisk\":{\"osType\":\"Windows\",\"name\":\"windowsmachine\","
|
||||||
"\"diagnosticsProfile\":{\"bootDiagnostics\":{\"enabled\":true,\"storageUri\":\"https://groupname2760.blob.core.windows.net/\"}},\"provisioningState\":\"CREATING\"}}");
|
+ "\"vhd\":{\"uri\":\"https://groupname2760.blob.core.windows.net/vhds/windowsmachine201624102936.vhd\"},\"caching\":\"ReadWrite\",\"createOption\":\"FromImage\"},\"dataDisks\":[]},"
|
||||||
|
+ "\"osProfile\":{\"computerName\":\"windowsmachine\",\"adminUsername\":\"azureuser\",\"windowsConfiguration\":{\"provisionVMAgent\":false,\"enableAutomaticUpdates\":true}},"
|
||||||
|
+ "\"networkProfile\":{\"networkInterfaces\":[{\"id\":\"/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/windowsmachine167\"}]},"
|
||||||
|
+ "\"diagnosticsProfile\":{\"bootDiagnostics\":{\"enabled\":true,\"storageUri\":\"https://groupname2760.blob.core.windows.net/\"}},\"provisioningState\":\"CREATING\"}}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDeleteReturns404() throws Exception {
|
public void testDeleteReturns404() throws Exception {
|
||||||
|
@ -134,9 +165,10 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
assertEquals(server.getRequestCount(), 1);
|
assertEquals(server.getRequestCount(), 1);
|
||||||
assertNull(uri);
|
assertNull(uri);
|
||||||
|
|
||||||
assertSent(server, "DELETE", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "DELETE", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/windowsmachine?api-version=2016-03-30");
|
+ "/virtualMachines/windowsmachine?api-version=2016-03-30");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDelete() throws Exception {
|
public void testDelete() throws Exception {
|
||||||
server.enqueue(response202WithHeader());
|
server.enqueue(response202WithHeader());
|
||||||
|
|
||||||
|
@ -147,8 +179,8 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
assertEquals(server.getRequestCount(), 1);
|
assertEquals(server.getRequestCount(), 1);
|
||||||
assertNotNull(uri);
|
assertNotNull(uri);
|
||||||
|
|
||||||
assertSent(server, "DELETE", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "DELETE", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/windowsmachine?api-version=2016-03-30");
|
+ "/virtualMachines/windowsmachine?api-version=2016-03-30");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStart() throws Exception {
|
public void testStart() throws Exception {
|
||||||
|
@ -158,8 +190,8 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
|
|
||||||
vmAPI.start("windowsmachine");
|
vmAPI.start("windowsmachine");
|
||||||
|
|
||||||
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/windowsmachine/start?api-version=2015-06-15");
|
+ "/virtualMachines/windowsmachine/start?api-version=2015-06-15");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testRestart() throws Exception {
|
public void testRestart() throws Exception {
|
||||||
|
@ -169,8 +201,8 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
|
|
||||||
vmAPI.restart("windowsmachine");
|
vmAPI.restart("windowsmachine");
|
||||||
|
|
||||||
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/windowsmachine/restart?api-version=2015-06-15");
|
+ "/virtualMachines/windowsmachine/restart?api-version=2015-06-15");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testStop() throws Exception {
|
public void testStop() throws Exception {
|
||||||
|
@ -180,16 +212,16 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
|
|
||||||
vmAPI.stop("windowsmachine");
|
vmAPI.stop("windowsmachine");
|
||||||
|
|
||||||
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/windowsmachine/powerOff?api-version=2015-06-15");
|
+ "/virtualMachines/windowsmachine/powerOff?api-version=2015-06-15");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGeneralize() throws Exception {
|
public void testGeneralize() throws Exception {
|
||||||
server.enqueue(new MockResponse().setResponseCode(200));
|
server.enqueue(new MockResponse().setResponseCode(200));
|
||||||
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
vmAPI.generalize("vm"); // IllegalStateException if failed
|
vmAPI.generalize("vm"); // IllegalStateException if failed
|
||||||
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/vm/generalize?api-version=2015-06-15");
|
+ "/virtualMachines/vm/generalize?api-version=2015-06-15");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCapture() throws Exception {
|
public void testCapture() throws Exception {
|
||||||
|
@ -198,8 +230,9 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
URI uri = vmAPI.capture("vm", "prefix", "container");
|
URI uri = vmAPI.capture("vm", "prefix", "container");
|
||||||
assertNotNull(uri);
|
assertNotNull(uri);
|
||||||
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/vm/capture?api-version=2015-06-15", "{\"vhdPrefix\":\"prefix\",\"destinationContainerName\":\"container\"}");
|
+ "/virtualMachines/vm/capture?api-version=2015-06-15",
|
||||||
|
"{\"vhdPrefix\":\"prefix\",\"destinationContainerName\":\"container\"}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testCapture404() throws Exception {
|
public void testCapture404() throws Exception {
|
||||||
|
@ -208,8 +241,9 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
final VirtualMachineApi vmAPI = api.getVirtualMachineApi("groupname");
|
||||||
URI uri = vmAPI.capture("vm", "prefix", "container");
|
URI uri = vmAPI.capture("vm", "prefix", "container");
|
||||||
assertNull(uri);
|
assertNull(uri);
|
||||||
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute" +
|
assertSent(server, "POST", "/subscriptions/SUBSCRIPTIONID/resourceGroups/groupname/providers/Microsoft.Compute"
|
||||||
"/virtualMachines/vm/capture?api-version=2015-06-15", "{\"vhdPrefix\":\"prefix\",\"destinationContainerName\":\"container\"}");
|
+ "/virtualMachines/vm/capture?api-version=2015-06-15",
|
||||||
|
"{\"vhdPrefix\":\"prefix\",\"destinationContainerName\":\"container\"}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private VirtualMachineProperties getProperties() {
|
private VirtualMachineProperties getProperties() {
|
||||||
|
@ -222,10 +256,8 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
OSProfile.WindowsConfiguration windowsConfig = OSProfile.WindowsConfiguration.create(false, null, null, true,
|
OSProfile.WindowsConfiguration windowsConfig = OSProfile.WindowsConfiguration.create(false, null, null, true,
|
||||||
null);
|
null);
|
||||||
OSProfile osProfile = OSProfile.create("windowsmachine", "azureuser", null, null, null, windowsConfig);
|
OSProfile osProfile = OSProfile.create("windowsmachine", "azureuser", null, null, null, windowsConfig);
|
||||||
IdReference networkInterface =
|
IdReference networkInterface = IdReference.create("/subscriptions/SUBSCRIPTIONID"
|
||||||
IdReference.create("/subscriptions/SUBSCRIPTIONID" +
|
+ "/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/" + "windowsmachine167");
|
||||||
"/resourceGroups/groupname/providers/Microsoft.Network/networkInterfaces/" +
|
|
||||||
"windowsmachine167");
|
|
||||||
List<IdReference> networkInterfaces = new ArrayList<IdReference>();
|
List<IdReference> networkInterfaces = new ArrayList<IdReference>();
|
||||||
networkInterfaces.add(networkInterface);
|
networkInterfaces.add(networkInterface);
|
||||||
NetworkProfile networkProfile = NetworkProfile.create(networkInterfaces);
|
NetworkProfile networkProfile = NetworkProfile.create(networkInterfaces);
|
||||||
|
@ -233,15 +265,25 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
"https://groupname2760.blob.core.windows.net/");
|
"https://groupname2760.blob.core.windows.net/");
|
||||||
DiagnosticsProfile diagnosticsProfile = DiagnosticsProfile.create(bootDiagnostics);
|
DiagnosticsProfile diagnosticsProfile = DiagnosticsProfile.create(bootDiagnostics);
|
||||||
VirtualMachineProperties properties = VirtualMachineProperties.create("27ee085b-d707-xxxx-yyyy-2370e2eb1cc1",
|
VirtualMachineProperties properties = VirtualMachineProperties.create("27ee085b-d707-xxxx-yyyy-2370e2eb1cc1",
|
||||||
null, null, hwProf, storageProfile, osProfile, networkProfile, diagnosticsProfile, VirtualMachineProperties.ProvisioningState.CREATING);
|
null, null, hwProf, storageProfile, osProfile, networkProfile, diagnosticsProfile,
|
||||||
|
VirtualMachineProperties.ProvisioningState.CREATING);
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
private VirtualMachine getVM() {
|
private VirtualMachine getVM() {
|
||||||
VirtualMachineProperties properties = getProperties();
|
VirtualMachineProperties properties = getProperties();
|
||||||
VirtualMachine machine = VirtualMachine.create("/subscriptions/SUBSCRIPTIONID/" + "" +
|
VirtualMachine machine = VirtualMachine.create("/subscriptions/SUBSCRIPTIONID/" + ""
|
||||||
"resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine", "windowsmachine",
|
+ "resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine", "windowsmachine",
|
||||||
"Microsoft.Compute/virtualMachines", "westus", ImmutableMap.of("foo", "bar"), properties);
|
"Microsoft.Compute/virtualMachines", "westus", ImmutableMap.of("foo", "bar"), properties,
|
||||||
|
Plan.create("thinkboxsoftware", "deadline-slave-7-2", "deadline7-2"));
|
||||||
|
return machine;
|
||||||
|
}
|
||||||
|
|
||||||
|
private VirtualMachine getVM(Plan plan) {
|
||||||
|
VirtualMachineProperties properties = getProperties();
|
||||||
|
VirtualMachine machine = VirtualMachine.create("/subscriptions/SUBSCRIPTIONID/" + ""
|
||||||
|
+ "resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine", "windowsmachine",
|
||||||
|
"Microsoft.Compute/virtualMachines", "westus", ImmutableMap.of("foo", "bar"), properties, plan);
|
||||||
return machine;
|
return machine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,23 +297,23 @@ public class VirtualMachineApiMockTest extends BaseAzureComputeApiMockTest {
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
VirtualMachineInstance.VirtualMachineStatus vmStatus =
|
VirtualMachineInstance.VirtualMachineStatus vmStatus = VirtualMachineInstance.VirtualMachineStatus.create(
|
||||||
VirtualMachineInstance.VirtualMachineStatus.create("ProvisioningState/succeeded", "Info", "Provisioning succeeded", date);
|
"ProvisioningState/succeeded", "Info", "Provisioning succeeded", date);
|
||||||
statuses.add(vmStatus);
|
statuses.add(vmStatus);
|
||||||
VirtualMachineInstance.VirtualMachineStatus vmStatus1 =
|
VirtualMachineInstance.VirtualMachineStatus vmStatus1 = VirtualMachineInstance.VirtualMachineStatus.create(
|
||||||
VirtualMachineInstance.VirtualMachineStatus.create("PowerState/running", "Info", "VM running", null);
|
"PowerState/running", "Info", "VM running", null);
|
||||||
statuses.add(vmStatus1);
|
statuses.add(vmStatus1);
|
||||||
|
|
||||||
VirtualMachineInstance machineInstance =
|
VirtualMachineInstance machineInstance = VirtualMachineInstance
|
||||||
VirtualMachineInstance.create(null, null, ImmutableList.copyOf(statuses));
|
.create(null, null, ImmutableList.copyOf(statuses));
|
||||||
return machineInstance;
|
return machineInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<VirtualMachine> getVMList() {
|
private List<VirtualMachine> getVMList() {
|
||||||
VirtualMachineProperties properties = getProperties();
|
VirtualMachineProperties properties = getProperties();
|
||||||
VirtualMachine machine = VirtualMachine.create("/subscriptions/SUBSCRIPTIONID/" + "" +
|
VirtualMachine machine = VirtualMachine.create("/subscriptions/SUBSCRIPTIONID/" + ""
|
||||||
"resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine",
|
+ "resourceGroups/groupname/providers/Microsoft.Compute/virtualMachines/windowsmachine", "windowsmachine",
|
||||||
"windowsmachine", "Microsoft.Compute/virtualMachines", "westus", null, properties);
|
"Microsoft.Compute/virtualMachines", "westus", null, properties, null);
|
||||||
List<VirtualMachine> list = new ArrayList<VirtualMachine>();
|
List<VirtualMachine> list = new ArrayList<VirtualMachine>();
|
||||||
list.add(machine);
|
list.add(machine);
|
||||||
return list;
|
return list;
|
||||||
|
|
|
@ -46,5 +46,10 @@
|
||||||
"location": "westus",
|
"location": "westus",
|
||||||
"tags": {
|
"tags": {
|
||||||
"foo": "bar"
|
"foo": "bar"
|
||||||
|
},
|
||||||
|
"plan": {
|
||||||
|
"name": "deadline-slave-7-2",
|
||||||
|
"publisher": "thinkboxsoftware",
|
||||||
|
"product": "deadline7-2"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -46,5 +46,10 @@
|
||||||
"location": "westus",
|
"location": "westus",
|
||||||
"tags": {
|
"tags": {
|
||||||
"foo": "bar"
|
"foo": "bar"
|
||||||
|
},
|
||||||
|
"plan": {
|
||||||
|
"name": "deadline-slave-7-2",
|
||||||
|
"publisher": "thinkboxsoftware",
|
||||||
|
"product": "deadline7-2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue