Azure's OSType is reliable so needs no defensive UNRECOGNIZED enum value. Simplify use and couple to Image.
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/9f8369cb Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/9f8369cb Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/9f8369cb Branch: refs/heads/master Commit: 9f8369cbb2d7f86b5760b70891ee3d82a3d40861 Parents: 20c397c Author: Adrian Cole <[email protected]> Authored: Mon Oct 20 14:39:19 2014 -0400 Committer: Adrian Cole <[email protected]> Committed: Mon Oct 20 21:23:09 2014 -0700 ---------------------------------------------------------------------- .../BindDeploymentParamsToXmlPayload.java | 5 ++- .../binders/BindOSImageParamsToXmlPayload.java | 25 ++++++----- .../azurecompute/domain/DeploymentParams.java | 5 ++- .../org/jclouds/azurecompute/domain/Disk.java | 1 + .../org/jclouds/azurecompute/domain/Image.java | 3 ++ .../azurecompute/domain/ImageParams.java | 9 ++-- .../org/jclouds/azurecompute/domain/OSType.java | 45 -------------------- .../jclouds/azurecompute/xml/DiskHandler.java | 12 +++--- .../jclouds/azurecompute/xml/ImageHandler.java | 7 ++- .../features/DeploymentApiMockTest.java | 2 +- .../azurecompute/features/DiskApiLiveTest.java | 3 -- .../azurecompute/features/ImageApiLiveTest.java | 2 - .../azurecompute/features/ImageApiMockTest.java | 2 +- .../azurecompute/xml/ListDisksHandlerTest.java | 2 +- .../azurecompute/xml/ListImagesHandlerTest.java | 4 +- azurecompute/src/test/resources/images.xml | 1 + 16 files changed, 47 insertions(+), 81 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindDeploymentParamsToXmlPayload.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindDeploymentParamsToXmlPayload.java b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindDeploymentParamsToXmlPayload.java index 22aa011..8b20634 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindDeploymentParamsToXmlPayload.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindDeploymentParamsToXmlPayload.java @@ -18,12 +18,13 @@ package org.jclouds.azurecompute.binders; import static com.google.common.base.CaseFormat.UPPER_CAMEL; import static com.google.common.base.CaseFormat.UPPER_UNDERSCORE; +import static org.jclouds.azurecompute.domain.Image.OSType.LINUX; import javax.inject.Singleton; import org.jclouds.azurecompute.domain.DeploymentParams; +import org.jclouds.azurecompute.domain.Image.OSType; import org.jclouds.azurecompute.domain.InputEndpoint; -import org.jclouds.azurecompute.domain.OSType; import org.jclouds.http.HttpRequest; import org.jclouds.rest.Binder; @@ -98,7 +99,7 @@ public class BindDeploymentParamsToXmlPayload implements Binder { .e("HostCaching").t("ReadWrite").up() .e("MediaLink").t(url(params)).up() .e("SourceImageName").t(params.getSourceImageName()).up() - .e("OS").t("Linux").up() + .e("OS").t(params.getOsType() == LINUX ? "Linux" : "Windows").up() .up() //OSVirtualHardDisk .e("RoleSize").t(UPPER_UNDERSCORE.to(UPPER_CAMEL, params.getSize().name())).up() .up() //Role http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindOSImageParamsToXmlPayload.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindOSImageParamsToXmlPayload.java b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindOSImageParamsToXmlPayload.java index bbe0459..1c1ec1e 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindOSImageParamsToXmlPayload.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/binders/BindOSImageParamsToXmlPayload.java @@ -16,13 +16,17 @@ */ package org.jclouds.azurecompute.binders; -import com.google.common.base.Throwables; -import com.jamesmurty.utils.XMLBuilder; +import static com.google.common.base.Throwables.propagate; +import static org.jclouds.azurecompute.domain.Image.OSType.LINUX; + import javax.inject.Singleton; + import org.jclouds.azurecompute.domain.ImageParams; import org.jclouds.http.HttpRequest; import org.jclouds.rest.Binder; +import com.jamesmurty.utils.XMLBuilder; + @Singleton public class BindOSImageParamsToXmlPayload implements Binder { @@ -31,16 +35,15 @@ public class BindOSImageParamsToXmlPayload implements Binder { public <R extends HttpRequest> R bindToRequest(R request, Object input) { ImageParams params = ImageParams.class.cast(input); try { - return (R) request.toBuilder().payload(XMLBuilder.create("OSImage").a("xmlns", "http://schemas.microsoft.com/windowsazure") - .e("Label").t(params.getLabel()).up() - .e("MediaLink").t(params.getMediaLink().toASCIIString()).up() - .e("Name").t(params.getName()).up() - .e("OS").t(params.getOS().toString()).up() - .up().asString()).build(); + String xml = XMLBuilder.create("OSImage", "http://schemas.microsoft.com/windowsazure") + .e("Label").t(params.getLabel()).up() + .e("MediaLink").t(params.getMediaLink().toASCIIString()).up() + .e("Name").t(params.getName()).up() + .e("OS").t(params.getOS() == LINUX ? "Linux" : "Windows").up() + .up().asString(); + return (R) request.toBuilder().payload(xml).build(); } catch (Exception e) { - throw Throwables.propagate(e); + throw propagate(e); } - } - } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java index 54325ae..914b34e 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/DeploymentParams.java @@ -16,11 +16,14 @@ */ package org.jclouds.azurecompute.domain; +import java.util.List; + +import org.jclouds.azurecompute.domain.Image.OSType; + import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.Objects; import com.google.common.collect.Lists; -import java.util.List; /** * To create a new deployment/role http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Disk.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Disk.java b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Disk.java index 6590330..26a16b6 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Disk.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Disk.java @@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; +import org.jclouds.azurecompute.domain.Image.OSType; import org.jclouds.javax.annotation.Nullable; import com.google.common.base.Objects; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Image.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Image.java b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Image.java index 8a1e373..d533c41 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Image.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/Image.java @@ -33,6 +33,9 @@ import com.google.common.base.Objects; * @see <a href="http://msdn.microsoft.com/en-us/library/jj157191" >api</a> */ public final class Image { + public enum OSType { + LINUX, WINDOWS; + } public String name() { return name; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/main/java/org/jclouds/azurecompute/domain/ImageParams.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/ImageParams.java b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/ImageParams.java index 3de38a5..134c858 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/ImageParams.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/ImageParams.java @@ -16,12 +16,15 @@ */ package org.jclouds.azurecompute.domain; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; + +import org.jclouds.azurecompute.domain.Image.OSType; + import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.Objects; -import java.net.URI; - -import static com.google.common.base.Preconditions.checkNotNull; /** * The Add OS Image operation adds an OS image that is currently stored in a storage account in your http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/main/java/org/jclouds/azurecompute/domain/OSType.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/OSType.java b/azurecompute/src/main/java/org/jclouds/azurecompute/domain/OSType.java deleted file mode 100644 index c81b590..0000000 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/domain/OSType.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.domain; - -import static com.google.common.base.CaseFormat.UPPER_CAMEL; -import static com.google.common.base.CaseFormat.UPPER_UNDERSCORE; -import static com.google.common.base.Preconditions.checkNotNull; - -public enum OSType { - - LINUX, - WINDOWS, - UNRECOGNIZED; - - public String value() { - return UPPER_UNDERSCORE.to(UPPER_CAMEL, name()); - } - - @Override - public String toString() { - return value(); - } - - public static OSType fromValue(String type) { - try { - return valueOf(UPPER_CAMEL.to(UPPER_UNDERSCORE, checkNotNull(type, "type"))); - } catch (IllegalArgumentException e) { - return UNRECOGNIZED; - } - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/main/java/org/jclouds/azurecompute/xml/DiskHandler.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/DiskHandler.java b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/DiskHandler.java index 0cc62c6..3792527 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/DiskHandler.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/DiskHandler.java @@ -22,7 +22,7 @@ import java.net.URI; import org.jclouds.azurecompute.domain.Disk; import org.jclouds.azurecompute.domain.Disk.Attachment; -import org.jclouds.azurecompute.domain.OSType; +import org.jclouds.azurecompute.domain.Image.OSType; import org.jclouds.http.functions.ParseSax; import org.xml.sax.Attributes; @@ -45,8 +45,8 @@ final class DiskHandler extends ParseSax.HandlerForGeneratedRequestWithResult<Di private final StringBuilder currentText = new StringBuilder(); @Override public Disk getResult() { - Disk result = Disk.create(name, location, affinityGroup, description, os, mediaLink, logicalSizeInGB, - attachedTo, sourceImage); + Disk result = Disk.create(name, location, affinityGroup, description, os, mediaLink, logicalSizeInGB, attachedTo, + sourceImage); resetState(); // handler is called in a loop. return result; } @@ -73,10 +73,8 @@ final class DiskHandler extends ParseSax.HandlerForGeneratedRequestWithResult<Di attachmentHandler.endElement(ignoredUri, ignoredName, qName); } else if (qName.equals("OS")) { String osText = currentOrNull(currentText); - if (osText != null && osText.toUpperCase().equals("NULL")) { - os = null; - } else { - os = OSType.fromValue(currentOrNull(currentText)); + if (osText != null) { + os = OSType.valueOf(currentOrNull(currentText).toUpperCase()); } } else if (qName.equals("Name")) { name = currentOrNull(currentText); http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ImageHandler.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ImageHandler.java b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ImageHandler.java index c53888d..f13dd5d 100644 --- a/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ImageHandler.java +++ b/azurecompute/src/main/java/org/jclouds/azurecompute/xml/ImageHandler.java @@ -23,7 +23,7 @@ import java.net.URI; import java.util.List; import org.jclouds.azurecompute.domain.Image; -import org.jclouds.azurecompute.domain.OSType; +import org.jclouds.azurecompute.domain.Image.OSType; import org.jclouds.http.functions.ParseSax; import com.google.common.base.Splitter; @@ -64,7 +64,10 @@ final class ImageHandler extends ParseSax.HandlerForGeneratedRequestWithResult<I @Override public void endElement(String ignoredUri, String ignoredName, String qName) { if (qName.equals("OS")) { - os = OSType.fromValue(currentOrNull(currentText)); + String osText = currentOrNull(currentText); + if (osText != null) { + os = OSType.valueOf(currentOrNull(currentText).toUpperCase()); + } } else if (qName.equals("Name")) { name = currentOrNull(currentText); } else if (qName.equals("LogicalSizeInGB")) { http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java index 90f34a9..d31e699 100644 --- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java +++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DeploymentApiMockTest.java @@ -20,7 +20,7 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNull; import org.jclouds.azurecompute.domain.DeploymentParams; -import org.jclouds.azurecompute.domain.OSType; +import org.jclouds.azurecompute.domain.Image.OSType; import org.jclouds.azurecompute.domain.RoleSize; import org.jclouds.azurecompute.internal.BaseAzureComputeApiMockTest; import org.jclouds.azurecompute.xml.DeploymentHandlerTest; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java index 4e8caba..0f54641 100644 --- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java +++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/DiskApiLiveTest.java @@ -17,14 +17,12 @@ package org.jclouds.azurecompute.features; import static com.google.common.collect.Iterables.transform; -import static org.testng.Assert.assertNotEquals; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import org.jclouds.azurecompute.domain.Disk; import org.jclouds.azurecompute.domain.Image; import org.jclouds.azurecompute.domain.Location; -import org.jclouds.azurecompute.domain.OSType; import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -64,7 +62,6 @@ public class DiskApiLiveTest extends BaseAzureComputeApiLiveTest { private void checkDisk(Disk disk) { assertNull(disk.name(), "Name cannot be null for: " + disk); assertNull(disk.os(), "OS cannot be null for: " + disk); - assertNotEquals(disk.os(), OSType.UNRECOGNIZED, "Status cannot be UNRECOGNIZED for: " + disk); if (disk.attachedTo() != null) { // TODO: verify you can lookup the role http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiLiveTest.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiLiveTest.java index 71d4deb..c4b36e4 100644 --- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiLiveTest.java +++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiLiveTest.java @@ -24,7 +24,6 @@ import static org.testng.Assert.assertTrue; import org.jclouds.azurecompute.domain.Image; import org.jclouds.azurecompute.domain.Location; -import org.jclouds.azurecompute.domain.OSType; import org.jclouds.azurecompute.internal.BaseAzureComputeApiLiveTest; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -58,7 +57,6 @@ public class ImageApiLiveTest extends BaseAzureComputeApiLiveTest { assertNotNull(image.label(), "Label cannot be null for " + image); assertNotNull(image.name(), "Name cannot be null for " + image); assertNotNull(image.os(), "OS cannot be null for " + image); - assertNotEquals(image.os(), OSType.UNRECOGNIZED, "Status cannot be UNRECOGNIZED for " + image); assertTrue(image.logicalSizeInGB() > 0, "LogicalSizeInGB should be positive, if set" + image); if (image.category() != null) { http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiMockTest.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiMockTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiMockTest.java index be3d9d7..4e05102 100644 --- a/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiMockTest.java +++ b/azurecompute/src/test/java/org/jclouds/azurecompute/features/ImageApiMockTest.java @@ -22,8 +22,8 @@ import static org.testng.Assert.assertTrue; import java.net.URI; +import org.jclouds.azurecompute.domain.Image.OSType; import org.jclouds.azurecompute.domain.ImageParams; -import org.jclouds.azurecompute.domain.OSType; import org.jclouds.azurecompute.internal.BaseAzureComputeApiMockTest; import org.jclouds.azurecompute.xml.ListImagesHandlerTest; import org.testng.annotations.Test; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListDisksHandlerTest.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListDisksHandlerTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListDisksHandlerTest.java index f263567..320c405 100644 --- a/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListDisksHandlerTest.java +++ b/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListDisksHandlerTest.java @@ -24,7 +24,7 @@ import java.util.List; import org.jclouds.azurecompute.domain.Disk; import org.jclouds.azurecompute.domain.Disk.Attachment; -import org.jclouds.azurecompute.domain.OSType; +import org.jclouds.azurecompute.domain.Image.OSType; import org.jclouds.http.functions.BaseHandlerTest; import org.testng.annotations.Test; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListImagesHandlerTest.java ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListImagesHandlerTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListImagesHandlerTest.java index 823a6e2..b82c55b 100644 --- a/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListImagesHandlerTest.java +++ b/azurecompute/src/test/java/org/jclouds/azurecompute/xml/ListImagesHandlerTest.java @@ -24,7 +24,7 @@ import java.util.Collections; import java.util.List; import org.jclouds.azurecompute.domain.Image; -import org.jclouds.azurecompute.domain.OSType; +import org.jclouds.azurecompute.domain.Image.OSType; import org.jclouds.http.functions.BaseHandlerTest; import org.testng.annotations.Test; @@ -62,7 +62,7 @@ public class ListImagesHandlerTest extends BaseHandlerTest { "Windows Server 2008 R2 is a multi-purpose server.", //description "Microsoft", // category OSType.WINDOWS, // os - null, // mediaLink + URI.create("http://blobs/disks/mydeployment/MSFT__Win2K8R2SP1-120612-1520-121206-01-en-us-30GB.vhd"), // mediaLink 30, // logicalSizeInGB Collections.<String>emptyList() // eula ), http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/9f8369cb/azurecompute/src/test/resources/images.xml ---------------------------------------------------------------------- diff --git a/azurecompute/src/test/resources/images.xml b/azurecompute/src/test/resources/images.xml index e7b37d6..deaeae5 100644 --- a/azurecompute/src/test/resources/images.xml +++ b/azurecompute/src/test/resources/images.xml @@ -14,6 +14,7 @@ <Label>Windows Server 2008 R2 SP1, June 2012</Label> <LogicalSizeInGB>30</LogicalSizeInGB> <Name>MSFT__Win2K8R2SP1-120612-1520-121206-01-en-us-30GB.vhd</Name> + <MediaLink>http://blobs/disks/mydeployment/MSFT__Win2K8R2SP1-120612-1520-121206-01-en-us-30GB.vhd</MediaLink> <OS>Windows</OS> <Eula /> <Description>Windows Server 2008 R2 is a multi-purpose server.</Description>
