http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindGuestCustomizationSectionToXmlPayload.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindGuestCustomizationSectionToXmlPayload.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindGuestCustomizationSectionToXmlPayload.java
new file mode 100644
index 0000000..3ba51d1
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindGuestCustomizationSectionToXmlPayload.java
@@ -0,0 +1,107 @@
+/*
+ * 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.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.GuestCustomizationSection;
+
+import com.google.common.base.Throwables;
+import com.google.inject.Inject;
+import com.jamesmurty.utils.XMLBuilder;
+
+@Singleton
+public class BindGuestCustomizationSectionToXmlPayload extends 
BindToStringPayload {
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   protected final String ns;
+   protected final String schema;
+
+   @Inject
+   public BindGuestCustomizationSectionToXmlPayload(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, "GuestCustomizationSection") 
instanceof GuestCustomizationSection,
+               "this binder is only valid for GuestCustomizationSection!");
+      GuestCustomizationSection guest = 
GuestCustomizationSection.class.cast(payload);
+      XMLBuilder guestCustomizationSection;
+      try {
+         guestCustomizationSection = 
XMLBuilder.create("GuestCustomizationSection").a("xmlns", ns).a("xmlns:ovf",
+                  "http://schemas.dmtf.org/ovf/envelope/1";).a("type", 
guest.getType()).a("href",
+                  guest.getHref().toASCIIString()).a("ovf:required", "false");
+         guestCustomizationSection.e("ovf:Info").t(guest.getInfo());
+
+         if (guest.isEnabled() != null)
+            
guestCustomizationSection.e("Enabled").t(guest.isEnabled().toString());
+         if (guest.shouldChangeSid() != null)
+            
guestCustomizationSection.e("ChangeSid").t(guest.shouldChangeSid().toString());
+         if (guest.getVirtualMachineId() != null)
+            
guestCustomizationSection.e("VirtualMachineId").t(guest.getVirtualMachineId().toString());
+         if (guest.isJoinDomainEnabled() != null)
+            
guestCustomizationSection.e("JoinDomainEnabled").t(guest.isJoinDomainEnabled().toString());
+         if (guest.shouldUseOrgSettings() != null)
+            
guestCustomizationSection.e("UseOrgSettings").t(guest.shouldUseOrgSettings().toString());
+         if (guest.getDomainName() != null)
+            
guestCustomizationSection.e("DomainName").t(guest.getDomainName().toString());
+         if (guest.getDomainUserName() != null)
+            
guestCustomizationSection.e("DomainUserName").t(guest.getDomainUserName().toString());
+         if (guest.getDomainUserPassword() != null)
+            
guestCustomizationSection.e("DomainUserPassword").t(guest.getDomainUserPassword().toString());
+         if (guest.isAdminPasswordEnabled() != null)
+            
guestCustomizationSection.e("AdminPasswordEnabled").t(guest.isAdminPasswordEnabled().toString());
+         if (guest.isAdminPasswordAuto() != null)
+            
guestCustomizationSection.e("AdminPasswordAuto").t(guest.isAdminPasswordAuto().toString());
+         // if (guest.getAdminPassword() != null)
+         // 
guestCustomizationSection.e("AdminPassword").t(guest.getAdminPassword().toString());
+         if (guest.isResetPasswordRequired() != null)
+            
guestCustomizationSection.e("ResetPasswordRequired").t(guest.isResetPasswordRequired().toString());
+         if (guest.getCustomizationScript() != null)
+            
guestCustomizationSection.e("CustomizationScript").t(guest.getCustomizationScript());
+         if (guest.getComputerName() != null)
+            
guestCustomizationSection.e("ComputerName").t(guest.getComputerName().toString());
+         if (guest.getEdit() != null)
+            guestCustomizationSection.e("Link").a("rel", "edit").a("type", 
guest.getType()).a("href",
+                     guest.getHref().toASCIIString());
+
+         Properties outputProperties = new Properties();
+         
outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, 
"yes");
+         request =  super.bindToRequest(request, 
guestCustomizationSection.asString(outputProperties));
+         
request.getPayload().getContentMetadata().setContentType(guest.getType());
+      } catch (Exception e) {
+         Throwables.propagate(e);
+      }
+      return request;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java
new file mode 100644
index 0000000..08e5443
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java
@@ -0,0 +1,216 @@
+/*
+ * 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.vcloud.binders;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.transform;
+import static 
org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_NAMESPACE;
+import static 
org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_SCHEMA;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.rest.binders.BindToStringPayload;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.domain.VAppTemplate;
+import org.jclouds.vcloud.domain.Vm;
+import org.jclouds.vcloud.domain.network.FenceMode;
+import org.jclouds.vcloud.domain.network.NetworkConfig;
+import org.jclouds.vcloud.endpoints.Network;
+import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
+import com.jamesmurty.utils.XMLBuilder;
+
+@Singleton
+public class BindInstantiateVAppTemplateParamsToXmlPayload implements 
MapBinder {
+
+   protected final String ns;
+   protected final String schema;
+   protected final BindToStringPayload stringBinder;
+   protected final Supplier<ReferenceType> defaultNetwork;
+   protected final FenceMode defaultFenceMode;
+   protected final LoadingCache<URI, VAppTemplate> templateCache;
+   protected final Function<VAppTemplate, String> defaultNetworkNameInTemplate;
+
+   @Inject
+   public BindInstantiateVAppTemplateParamsToXmlPayload(LoadingCache<URI, 
VAppTemplate> templateCache,
+            @Network Function<VAppTemplate, String> 
defaultNetworkNameInTemplate, BindToStringPayload stringBinder,
+            @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, 
@Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema,
+            @Network Supplier<ReferenceType> network, FenceMode fenceMode) {
+      this.templateCache = templateCache;
+      this.defaultNetworkNameInTemplate = defaultNetworkNameInTemplate;
+      this.ns = ns;
+      this.schema = schema;
+      this.stringBinder = stringBinder;
+      this.defaultNetwork = network;
+      this.defaultFenceMode = fenceMode;
+   }
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, 
Object> postParams) {
+      checkArgument(checkNotNull(request, "request") instanceof 
GeneratedHttpRequest,
+            "this binder is only valid for GeneratedHttpRequests!");
+      GeneratedHttpRequest gRequest = (GeneratedHttpRequest) request;
+      String name = checkNotNull(postParams.remove("name"), "name").toString();
+      URI template = URI.create(checkNotNull(postParams.remove("template"), 
"template").toString());
+
+      Set<NetworkConfig> networkConfig = null;
+
+      NetworkConfigDecorator networkConfigDecorator = new 
NetworkConfigDecorator(templateCache.getUnchecked(template),
+            defaultNetwork.get().getHref(), defaultFenceMode, 
defaultNetworkNameInTemplate);
+
+      InstantiateVAppTemplateOptions options = 
findOptionsInArgsOrNull(gRequest);
+
+      if (options != null) {
+         if (options.getNetworkConfig().size() > 0)
+            networkConfig = ImmutableSet
+                     .copyOf(transform(options.getNetworkConfig(), 
networkConfigDecorator));
+      } else {
+         options = new InstantiateVAppTemplateOptions();
+      }
+
+      if (networkConfig == null)
+         networkConfig = ImmutableSet.of(networkConfigDecorator.apply(null));
+
+      try {
+         return stringBinder.bindToRequest(request, generateXml(name, 
options.getDescription(), options.shouldDeploy(),
+                  options.shouldPowerOn(), template, networkConfig));
+      } catch (ParserConfigurationException e) {
+         throw new RuntimeException(e);
+      } catch (FactoryConfigurationError e) {
+         throw new RuntimeException(e);
+      } catch (TransformerException e) {
+         throw new RuntimeException(e);
+      }
+
+   }
+
+   @VisibleForTesting
+   Set<Vm> ifCustomizationScriptIsSetGetVmsInTemplate(String 
customizationScript, final URI template) {
+      Set<Vm> vms = ImmutableSet.of();
+      if (customizationScript != null) {
+         VAppTemplate vAppTemplate = templateCache.getUnchecked(template);
+         checkArgument(vAppTemplate != null, "vAppTemplate %s not found!", 
template);
+         vms = vAppTemplate.getChildren();
+         checkArgument(vms.size() > 0, "no vms found in vAppTemplate %s", 
vAppTemplate);
+      }
+      return vms;
+   }
+
+   protected static final class NetworkConfigDecorator implements 
Function<NetworkConfig, NetworkConfig> {
+      private final VAppTemplate template;
+      private final URI defaultNetwork;
+      private final FenceMode defaultFenceMode;
+      private final Function<VAppTemplate, String> 
defaultNetworkNameInTemplate;
+
+      protected NetworkConfigDecorator(VAppTemplate template, URI 
defaultNetwork, FenceMode defaultFenceMode,
+               Function<VAppTemplate, String> defaultNetworkNameInTemplate) {
+         this.template = checkNotNull(template, "template");
+         this.defaultNetwork = checkNotNull(defaultNetwork, "defaultNetwork");
+         this.defaultFenceMode = checkNotNull(defaultFenceMode, 
"defaultFenceMode");
+         this.defaultNetworkNameInTemplate = 
checkNotNull(defaultNetworkNameInTemplate, "defaultNetworkNameInTemplate");
+      }
+
+      @Override
+      public NetworkConfig apply(NetworkConfig from) {
+         if (from == null)
+            return new 
NetworkConfig(defaultNetworkNameInTemplate.apply(template), defaultNetwork, 
defaultFenceMode);
+         URI network = ifNullDefaultTo(from.getParentNetwork(), 
defaultNetwork);
+         FenceMode fenceMode = ifNullDefaultTo(from.getFenceMode(), 
defaultFenceMode);
+         // using conditional statement instead of ifNullDefaultTo so that we 
lazy invoke the
+         // function, as it is an expensive one.
+         String networkName = from.getNetworkName() != null ? 
from.getNetworkName() : defaultNetworkNameInTemplate
+                  .apply(template);
+         return new NetworkConfig(networkName, network, fenceMode);
+      }
+   }
+
+   protected String generateXml(String name, @Nullable String description, 
boolean deploy, boolean powerOn,
+         URI template, Iterable<NetworkConfig> networkConfig)
+         throws ParserConfigurationException, FactoryConfigurationError, 
TransformerException {
+      XMLBuilder rootBuilder = buildRoot(name).a("deploy", deploy + 
"").a("powerOn", powerOn + "");
+      if (description != null)
+         rootBuilder.e("Description").t(description);
+      XMLBuilder instantiationParamsBuilder = 
rootBuilder.e("InstantiationParams");
+      addNetworkConfig(instantiationParamsBuilder, networkConfig);
+      rootBuilder.e("Source").a("href", template.toASCIIString());
+      rootBuilder.e("AllEULAsAccepted").t("true");
+
+      Properties outputProperties = new Properties();
+      
outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, 
"yes");
+      return rootBuilder.asString(outputProperties);
+   }
+
+   protected void addNetworkConfig(XMLBuilder instantiationParamsBuilder,
+         Iterable<NetworkConfig> networkConfig) {
+      XMLBuilder networkConfigBuilder = 
instantiationParamsBuilder.e("NetworkConfigSection");
+      networkConfigBuilder.e("ovf:Info").t("Configuration parameters for 
logical networks");
+      for (NetworkConfig n : networkConfig) {
+         XMLBuilder configurationBuilder = 
networkConfigBuilder.e("NetworkConfig").a("networkName", n.getNetworkName())
+               .e("Configuration");
+         configurationBuilder.e("ParentNetwork").a("href", 
n.getParentNetwork().toASCIIString());
+         if (n.getFenceMode() != null) {
+            configurationBuilder.e("FenceMode").t(n.getFenceMode().toString());
+         }
+      }
+   }
+
+   protected XMLBuilder buildRoot(String name) throws 
ParserConfigurationException, FactoryConfigurationError {
+      return XMLBuilder.create("InstantiateVAppTemplateParams").a("name", 
name).a("xmlns", ns)
+            .a("xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1";);
+   }
+
+   protected InstantiateVAppTemplateOptions 
findOptionsInArgsOrNull(GeneratedHttpRequest gRequest) {
+      for (Object arg : gRequest.getInvocation().getArgs()) {
+         if (arg instanceof InstantiateVAppTemplateOptions) {
+            return (InstantiateVAppTemplateOptions) arg;
+         } else if (arg instanceof InstantiateVAppTemplateOptions[]) {
+            InstantiateVAppTemplateOptions[] options = 
(InstantiateVAppTemplateOptions[]) arg;
+            return (options.length > 0) ? options[0] : null;
+         }
+      }
+      return null;
+   }
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      throw new IllegalStateException("InstantiateVAppTemplateParams is needs 
parameters");
+   }
+
+   public static <T> T ifNullDefaultTo(T value, T defaultValue) {
+      return value != null ? value : checkNotNull(defaultValue, 
"defaultValue");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindMemoryToXmlPayload.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindMemoryToXmlPayload.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindMemoryToXmlPayload.java
new file mode 100644
index 0000000..e6a1cd4
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindMemoryToXmlPayload.java
@@ -0,0 +1,75 @@
+/*
+ * 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.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.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.cim.ResourceAllocationSettingData.ResourceType;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.binders.BindToStringPayload;
+
+import com.google.common.base.Throwables;
+import com.google.inject.Inject;
+import com.jamesmurty.utils.XMLBuilder;
+
+@Singleton
+public class BindMemoryToXmlPayload extends BindToStringPayload {
+   protected final String ns;
+   protected final String schema;
+
+   @Inject
+   public BindMemoryToXmlPayload(BindToStringPayload stringBinder, 
@Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns,
+         @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema) {
+      this.ns = ns;
+      this.schema = schema;
+   }
+
+   private static final String RESOURCE_ALLOCATION_NS = 
"http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData";;
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object payload) {
+      checkArgument(checkNotNull(payload, "memoryInMB") instanceof Integer, 
"this binder is only valid for Integers!");
+      Integer memoryInMB = Integer.class.cast(payload);
+      XMLBuilder cpuItem;
+      try {
+         cpuItem = XMLBuilder.create("Item").a("xmlns", ns).a("xmlns:rasd", 
RESOURCE_ALLOCATION_NS);
+         cpuItem.e("rasd:AllocationUnits").t("byte * 2^20");
+         cpuItem.e("rasd:Description").t("Memory Size");
+         cpuItem.e("rasd:ElementName").t(memoryInMB.toString() + " MB of 
memory");
+         cpuItem.e("rasd:InstanceID").t("5");
+         cpuItem.e("rasd:Reservation").t("0");
+         cpuItem.e("rasd:ResourceType").t(ResourceType.MEMORY.value());
+         cpuItem.e("rasd:VirtualQuantity").t(memoryInMB.toString());
+         cpuItem.e("rasd:Weight").t("0");
+         Properties outputProperties = new Properties();
+         
outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, 
"yes");
+         request = super.bindToRequest(request, 
cpuItem.asString(outputProperties));
+      } catch (Exception e) {
+         Throwables.propagate(e);
+      }
+      return request;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindNetworkConnectionSectionToXmlPayload.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindNetworkConnectionSectionToXmlPayload.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindNetworkConnectionSectionToXmlPayload.java
new file mode 100644
index 0000000..6a27725
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindNetworkConnectionSectionToXmlPayload.java
@@ -0,0 +1,101 @@
+/*
+ * 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.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;
+
+@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;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindParamsToXmlPayload.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindParamsToXmlPayload.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindParamsToXmlPayload.java
new file mode 100644
index 0000000..f613c1b
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindParamsToXmlPayload.java
@@ -0,0 +1,76 @@
+/*
+ * 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.vcloud.binders;
+
+import static 
org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_NAMESPACE;
+
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+import javax.xml.parsers.FactoryConfigurationError;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.rest.binders.BindToStringPayload;
+
+import com.google.inject.Inject;
+import com.jamesmurty.utils.XMLBuilder;
+
+@Singleton
+public class BindParamsToXmlPayload implements MapBinder {
+
+   protected final String ns;
+   protected final BindToStringPayload stringBinder;
+   protected final String element;
+
+   @Inject
+   public BindParamsToXmlPayload(String element, BindToStringPayload 
stringBinder,
+            @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns) {
+      this.element = element;
+      this.ns = ns;
+      this.stringBinder = stringBinder;
+   }
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, 
Object> postParams) {
+      try {
+         return stringBinder.bindToRequest(request, generateXml(postParams));
+      } catch (Exception e) {
+         throw new RuntimeException(e);
+      }
+   }
+
+   private String generateXml(Map<String, Object> postParams) throws 
ParserConfigurationException,
+            FactoryConfigurationError, TransformerException {
+      XMLBuilder rootBuilder = XMLBuilder.create(element);
+      for (Entry<String, Object> entry : postParams.entrySet())
+         rootBuilder.a(entry.getKey(), (String) entry.getValue());
+      rootBuilder.a("xmlns", ns);
+      Properties outputProperties = new Properties();
+      
outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, 
"yes");
+      return rootBuilder.asString(outputProperties);
+   }
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      throw new IllegalArgumentException("incorrect usage");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindUndeployVAppParamsToXmlPayload.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindUndeployVAppParamsToXmlPayload.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindUndeployVAppParamsToXmlPayload.java
new file mode 100644
index 0000000..d95846e
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/BindUndeployVAppParamsToXmlPayload.java
@@ -0,0 +1,37 @@
+/*
+ * 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.vcloud.binders;
+
+import static 
org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_NAMESPACE;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.rest.binders.BindToStringPayload;
+
+import com.google.inject.Inject;
+
+@Singleton
+public class BindUndeployVAppParamsToXmlPayload extends BindParamsToXmlPayload 
{
+
+   @Inject
+   public BindUndeployVAppParamsToXmlPayload(BindToStringPayload stringBinder,
+            @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns) {
+      super("UndeployVAppParams", stringBinder, ns);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameAndCatalogNameToEndpoint.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameAndCatalogNameToEndpoint.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameAndCatalogNameToEndpoint.java
new file mode 100644
index 0000000..09c81e5
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameAndCatalogNameToEndpoint.java
@@ -0,0 +1,75 @@
+/*
+ * 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.vcloud.binders;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.vcloud.domain.Org;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.endpoints.Catalog;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Iterables;
+
+@Singleton
+public class OrgNameAndCatalogNameToEndpoint implements MapBinder {
+   private final Supplier<Map<String, Org>> orgMap;
+   private final Supplier<ReferenceType> defaultOrg;
+   private final Supplier<ReferenceType> defaultCatalog;
+
+   @Inject
+   public OrgNameAndCatalogNameToEndpoint(Supplier<Map<String, Org>> orgMap,
+         @org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg,
+         @Catalog Supplier<ReferenceType> defaultCatalog) {
+      this.orgMap = orgMap;
+      this.defaultOrg = defaultOrg;
+      this.defaultCatalog = defaultCatalog;
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, 
Object> postParams) {
+      Object org = postParams.get("orgName");
+      Object catalog = postParams.get("catalogName");
+      if (org == null && catalog == null)
+         return (R) 
request.toBuilder().endpoint(defaultCatalog.get().getHref()).build();
+      else if (org == null)
+         org = defaultOrg.get().getName();
+
+      try {
+         Map<String, ReferenceType> catalogs = 
checkNotNull(orgMap.get().get(org)).getCatalogs();
+         URI endpoint = catalog == null ? 
Iterables.getLast(catalogs.values()).getHref() : 
catalogs.get(catalog).getHref();
+         return (R) request.toBuilder().endpoint(endpoint).build();
+      } catch (NullPointerException e) {
+         throw new NoSuchElementException(org + "/" + catalog + " not found in 
" + orgMap.get());
+      }
+   }
+   
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      throw new IllegalStateException(getClass() + " needs parameters");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameAndVDCNameToEndpoint.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameAndVDCNameToEndpoint.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameAndVDCNameToEndpoint.java
new file mode 100644
index 0000000..b4bc580
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameAndVDCNameToEndpoint.java
@@ -0,0 +1,74 @@
+/*
+ * 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.vcloud.binders;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.vcloud.domain.Org;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.endpoints.VDC;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.Iterables;
+
+@Singleton
+public class OrgNameAndVDCNameToEndpoint implements MapBinder {
+   private final Supplier<Map<String, Org>> orgNameToVDCEndpoint;
+   private final Supplier<ReferenceType> defaultOrg;
+   private final Supplier<ReferenceType> defaultVDC;
+
+   @Inject
+   public OrgNameAndVDCNameToEndpoint(Supplier<Map<String, Org>> 
orgNameToVDCEndpoint,
+         @org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg, 
@VDC Supplier<ReferenceType> defaultVDC) {
+      this.orgNameToVDCEndpoint = orgNameToVDCEndpoint;
+      this.defaultOrg = defaultOrg;
+      this.defaultVDC = defaultVDC;
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, 
Object> postParams) {
+      Object org = postParams.get("orgName");
+      Object vdc = postParams.get("vdcName");
+      if (org == null && vdc == null)
+         return (R) 
request.toBuilder().endpoint(defaultVDC.get().getHref()).build();
+      else if (org == null)
+         org = defaultOrg.get().getName();
+
+      try {
+         Map<String, ReferenceType> vdcs = 
checkNotNull(orgNameToVDCEndpoint.get().get(org)).getVDCs();
+         URI endpoint = vdc == null ? 
Iterables.getLast(vdcs.values()).getHref() : vdcs.get(vdc).getHref();
+         return (R) request.toBuilder().endpoint(endpoint).build();
+      } catch (NullPointerException e) {
+         throw new NoSuchElementException(org + "/" + vdc + " not found in " + 
orgNameToVDCEndpoint.get());
+      }
+   }
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      throw new IllegalStateException(getClass() + " needs parameters");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameItemNameToEndpoint.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameItemNameToEndpoint.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameItemNameToEndpoint.java
new file mode 100644
index 0000000..2d9f762
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameItemNameToEndpoint.java
@@ -0,0 +1,73 @@
+/*
+ * 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.vcloud.binders;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.endpoints.Catalog;
+import org.jclouds.vcloud.endpoints.Org;
+
+import com.google.common.base.Supplier;
+
+@Singleton
+public class OrgNameCatalogNameItemNameToEndpoint implements MapBinder {
+   private final Supplier<Map<String, Map<String, 
org.jclouds.vcloud.domain.Catalog>>> orgCatalogMap;
+   private final Supplier<ReferenceType> defaultOrg;
+   private final Supplier<ReferenceType> defaultCatalog;
+
+   @Inject
+   public OrgNameCatalogNameItemNameToEndpoint(
+         Supplier<Map<String, Map<String, org.jclouds.vcloud.domain.Catalog>>> 
orgCatalogMap,
+         @Org Supplier<ReferenceType> defaultOrg, @Catalog 
Supplier<ReferenceType> defaultCatalog) {
+      this.orgCatalogMap = orgCatalogMap;
+      this.defaultOrg = defaultOrg;
+      this.defaultCatalog = defaultCatalog;
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, 
Object> postParams) {
+      Object org = postParams.get("orgName");
+      Object catalog = postParams.get("catalogName");
+      Object catalogItem = postParams.get("itemName");
+      if (org == null)
+         org = defaultOrg.get().getName();
+      if (catalog == null)
+         catalog = defaultCatalog.get().getName();
+      try {
+         Map<String, org.jclouds.vcloud.domain.Catalog> catalogs = 
checkNotNull(orgCatalogMap.get().get(org));
+         return (R) 
request.toBuilder().endpoint(catalogs.get(catalog).get(catalogItem).getHref()).build();
+      } catch (NullPointerException e) {
+         throw new NoSuchElementException(org + "/" + catalog + "/" + 
catalogItem + " not found in "
+               + orgCatalogMap.get());
+      }
+   }
+   
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      throw new IllegalStateException(getClass() + " needs parameters");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java
new file mode 100644
index 0000000..a8b798d
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java
@@ -0,0 +1,86 @@
+/*
+ * 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.vcloud.binders;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.vcloud.domain.CatalogItem;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.endpoints.Catalog;
+import org.jclouds.vcloud.endpoints.Org;
+
+import com.google.common.base.Supplier;
+
+@Singleton
+public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements MapBinder 
{
+   private final Supplier<Map<String, Map<String, Map<String, CatalogItem>>>> 
orgCatalogItemMap;
+   private final Supplier<ReferenceType> defaultOrg;
+   private final Supplier<ReferenceType> defaultCatalog;
+
+   @Inject
+   public OrgNameCatalogNameVAppTemplateNameToEndpoint(
+            Supplier<Map<String, Map<String, Map<String, CatalogItem>>>> 
orgCatalogItemMap,
+            @Org Supplier<ReferenceType> defaultOrg, @Catalog 
Supplier<ReferenceType> defaultCatalog) {
+      this.orgCatalogItemMap = orgCatalogItemMap;
+      this.defaultOrg = defaultOrg;
+      this.defaultCatalog = defaultCatalog;
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, 
Object> postParams) {
+      Object org = postParams.get("orgName");
+      Object catalog = postParams.get("catalogName");
+      Object catalogItem = postParams.get("itemName");
+      if (org == null)
+         org = defaultOrg.get().getName();
+      if (catalog == null)
+         catalog = defaultCatalog.get().getName();
+      Map<String, Map<String, Map<String, CatalogItem>>> orgCatalogItemMap = 
this.orgCatalogItemMap.get();
+
+      if (!orgCatalogItemMap.containsKey(org))
+         throw new NoSuchElementException("org: " + org + " not found in " + 
orgCatalogItemMap.keySet());
+      Map<String, Map<String,  CatalogItem>> catalogs = 
orgCatalogItemMap.get(org);
+
+      if (!catalogs.containsKey(catalog))
+         throw new NoSuchElementException("catalog: " + org + "/" + catalog + 
" not found in " + catalogs.keySet());
+      Map<String, CatalogItem> catalogMap = catalogs.get(catalog);
+
+      if (!catalogMap.containsKey(catalogItem))
+         throw new NoSuchElementException("item: " + org + "/" + catalog + "/" 
+ catalogItem + " not found in "
+                  + catalogMap.keySet());
+      CatalogItem item = catalogMap.get(catalogItem);
+
+      URI endpoint = checkNotNull(item.getEntity(),
+            "item: " + org + "/" + catalog + "/" + catalogItem + " has no 
entity").getHref();
+      return (R) request.toBuilder().endpoint(endpoint).build();
+   }
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      throw new IllegalStateException(getClass() + " needs parameters");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameNetworkNameToEndpoint.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameNetworkNameToEndpoint.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameNetworkNameToEndpoint.java
new file mode 100644
index 0000000..11bfeac
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameNetworkNameToEndpoint.java
@@ -0,0 +1,50 @@
+/*
+ * 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.vcloud.binders;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.endpoints.Org;
+import org.jclouds.vcloud.endpoints.VDC;
+
+import com.google.common.base.Supplier;
+
+@Singleton
+public class OrgNameVDCNameNetworkNameToEndpoint extends 
OrgNameVDCNameResourceNameToEndpoint {
+   @Inject
+   public OrgNameVDCNameNetworkNameToEndpoint(
+         Supplier<Map<String, Map<String, org.jclouds.vcloud.domain.VDC>>> 
orgVDCMap,
+         @Org Supplier<ReferenceType> defaultOrg, @VDC Supplier<ReferenceType> 
defaultVDC) {
+      super(orgVDCMap, defaultOrg, defaultVDC);
+   }
+
+   protected URI getEndpointOfResourceInVDC(Object org, Object vDC, Object 
resource,
+         org.jclouds.vcloud.domain.VDC vDCObject) {
+      ReferenceType resourceEntity = 
vDCObject.getAvailableNetworks().get(resource);
+      if (resourceEntity == null)
+         throw new NoSuchElementException("network " + resource + " in vdc " + 
vDC + ", org " + org + " not found in "
+               + vDCObject.getAvailableNetworks().keySet());
+      return resourceEntity.getHref();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java
new file mode 100644
index 0000000..effcc49
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java
@@ -0,0 +1,50 @@
+/*
+ * 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.vcloud.binders;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.endpoints.Org;
+import org.jclouds.vcloud.endpoints.VDC;
+
+import com.google.common.base.Supplier;
+
+@Singleton
+public class OrgNameVDCNameResourceEntityNameToEndpoint extends 
OrgNameVDCNameResourceNameToEndpoint {
+   @Inject
+   public OrgNameVDCNameResourceEntityNameToEndpoint(
+         Supplier<Map<String, Map<String, org.jclouds.vcloud.domain.VDC>>> 
orgVDCMap,
+         @Org Supplier<ReferenceType> defaultOrg, @VDC Supplier<ReferenceType> 
defaultVDC) {
+      super(orgVDCMap, defaultOrg, defaultVDC);
+   }
+
+   protected URI getEndpointOfResourceInVDC(Object org, Object vDC, Object 
resource,
+         org.jclouds.vcloud.domain.VDC vDCObject) {
+      ReferenceType resourceEntity = 
vDCObject.getResourceEntities().get(resource);
+      if (resourceEntity == null)
+         throw new NoSuchElementException("entity " + resource + " in vdc " + 
vDC + ", org " + org + " not found in "
+               + vDCObject.getResourceEntities().keySet());
+      return resourceEntity.getHref();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceNameToEndpoint.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceNameToEndpoint.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceNameToEndpoint.java
new file mode 100644
index 0000000..99ac848
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceNameToEndpoint.java
@@ -0,0 +1,77 @@
+/*
+ * 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.vcloud.binders;
+
+import static com.google.common.base.Preconditions.checkState;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+import javax.inject.Inject;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.domain.VDC;
+import org.jclouds.vcloud.endpoints.Org;
+
+import com.google.common.base.Supplier;
+public abstract class OrgNameVDCNameResourceNameToEndpoint implements 
MapBinder {
+
+   protected final Supplier<Map<String, Map<String, 
org.jclouds.vcloud.domain.VDC>>> orgVDCMap;
+   protected final Supplier<ReferenceType> defaultOrg;
+   protected final Supplier<ReferenceType> defaultVDC;
+
+   @Inject
+   public OrgNameVDCNameResourceNameToEndpoint(
+         Supplier<Map<String, Map<String, org.jclouds.vcloud.domain.VDC>>> 
orgVDCMap,
+         @Org Supplier<ReferenceType> defaultOrg, 
@org.jclouds.vcloud.endpoints.VDC Supplier<ReferenceType> defaultVDC) {
+      this.orgVDCMap = orgVDCMap;
+      this.defaultOrg = defaultOrg;
+      this.defaultVDC = defaultVDC;
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, 
Object> postParams) {
+      Object org = postParams.get("orgName");
+      Object vDC = postParams.get("vdcName");
+      Object resource = postParams.get("resourceName");
+      if (org == null)
+         org = defaultOrg.get().getName();
+      if (vDC == null)
+         vDC = defaultVDC.get().getName();
+      Map<String, Map<String, org.jclouds.vcloud.domain.VDC>> orgToVDCs = 
orgVDCMap.get();
+      checkState(orgToVDCs != null, "could not get map of org name to vdcs!");
+      Map<String, org.jclouds.vcloud.domain.VDC> vDCs = orgToVDCs.get(org);
+      if (vDCs == null)
+         throw new NoSuchElementException("org " + org + " not found in " + 
orgToVDCs.keySet());
+      org.jclouds.vcloud.domain.VDC vDCObject = vDCs.get(vDC);
+      if (vDCObject == null)
+         throw new NoSuchElementException("vdc " + vDC + " in org " + org + " 
not found in " + vDCs.keySet());
+      URI endpoint = getEndpointOfResourceInVDC(org, vDC, resource, vDCObject);
+      return (R) request.toBuilder().endpoint(endpoint).build();
+   }
+
+   protected abstract URI getEndpointOfResourceInVDC(Object org, Object vDC, 
Object resource, VDC vDCObject);
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      throw new IllegalStateException(getClass() + " needs parameters");
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java
new file mode 100644
index 0000000..d3538c0
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java
@@ -0,0 +1,37 @@
+/*
+ * 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.vcloud.compute.config;
+
+import org.jclouds.compute.config.ComputeServiceAdapterContextModule;
+import org.jclouds.domain.Location;
+import org.jclouds.vcloud.domain.VApp;
+import org.jclouds.vcloud.domain.VAppTemplate;
+
+/**
+ * Configures the {@link VCloudComputeServiceContext}; requires {@link 
VCloudComputeClientImpl}
+ * bound.
+ */
+public class VCloudComputeServiceContextModule extends
+         ComputeServiceAdapterContextModule<VApp, VAppTemplate, VAppTemplate, 
Location> {
+
+   @Override
+   protected void configure() {
+      super.configure();
+      install(new VCloudComputeServiceDependenciesModule());
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceDependenciesModule.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceDependenciesModule.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceDependenciesModule.java
new file mode 100644
index 0000000..8b53c90
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceDependenciesModule.java
@@ -0,0 +1,150 @@
+/*
+ * 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.vcloud.compute.config;
+
+
+import java.util.Map;
+
+import javax.inject.Singleton;
+
+import org.jclouds.compute.ComputeServiceAdapter;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.domain.Location;
+import org.jclouds.functions.IdentityFunction;
+import org.jclouds.vcloud.compute.functions.HardwareForVApp;
+import org.jclouds.vcloud.compute.functions.HardwareForVAppTemplate;
+import org.jclouds.vcloud.compute.functions.ImageForVAppTemplate;
+import org.jclouds.vcloud.compute.functions.VAppToNodeMetadata;
+import org.jclouds.vcloud.compute.internal.VCloudTemplateBuilderImpl;
+import org.jclouds.vcloud.compute.options.VCloudTemplateOptions;
+import org.jclouds.vcloud.compute.strategy.VCloudComputeServiceAdapter;
+import org.jclouds.vcloud.domain.Org;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.domain.Status;
+import org.jclouds.vcloud.domain.VApp;
+import org.jclouds.vcloud.domain.VAppTemplate;
+import org.jclouds.vcloud.domain.network.FenceMode;
+import org.jclouds.vcloud.domain.network.NetworkConfig;
+import org.jclouds.vcloud.endpoints.Network;
+import org.jclouds.vcloud.functions.VAppTemplatesInOrg;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableMap;
+import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.TypeLiteral;
+
+public class VCloudComputeServiceDependenciesModule extends AbstractModule {
+
+   @VisibleForTesting
+   public static final Map<Status, NodeMetadata.Status> toPortableNodeStatus = 
ImmutableMap
+            .<Status, NodeMetadata.Status> builder()
+            .put(Status.OFF, NodeMetadata.Status.SUSPENDED)
+            .put(Status.ON, NodeMetadata.Status.RUNNING)
+            .put(Status.RESOLVED, NodeMetadata.Status.PENDING)
+            .put(Status.MIXED, NodeMetadata.Status.PENDING)
+            .put(Status.UNKNOWN, NodeMetadata.Status.UNRECOGNIZED)
+            .put(Status.UNRECOGNIZED, NodeMetadata.Status.UNRECOGNIZED)
+            .put(Status.DEPLOYED, NodeMetadata.Status.PENDING)
+            .put(Status.SUSPENDED, NodeMetadata.Status.SUSPENDED)
+            .put(Status.WAITING_FOR_INPUT, NodeMetadata.Status.PENDING)
+            .put(Status.INCONSISTENT, NodeMetadata.Status.PENDING)
+            .put(Status.ERROR, NodeMetadata.Status.ERROR)
+            .put(Status.UNRESOLVED, NodeMetadata.Status.PENDING).build();
+
+   @Singleton
+   @Provides
+   protected Map<Status, NodeMetadata.Status> toPortableNodeStatus() {
+      return toPortableNodeStatus;
+   }
+   
+   @VisibleForTesting
+   public static final Map<Status, Image.Status> toPortableImageStatus = 
ImmutableMap
+            .<Status, Image.Status> builder()
+            .put(Status.RESOLVED, Image.Status.AVAILABLE)
+            .put(Status.OFF, Image.Status.AVAILABLE)
+            .put(Status.MIXED, Image.Status.PENDING)
+            .put(Status.UNKNOWN, Image.Status.UNRECOGNIZED)
+            .put(Status.UNRECOGNIZED, Image.Status.UNRECOGNIZED)
+            .put(Status.DEPLOYED, Image.Status.PENDING)
+            .put(Status.PENDING_DESCRIPTOR, Image.Status.PENDING)
+            .put(Status.COPYING, Image.Status.PENDING)
+            .put(Status.PENDING_CONTENTS, Image.Status.PENDING)
+            .put(Status.QUARANTINED, Image.Status.PENDING)
+            .put(Status.QUARANTINE_EXPIRED, Image.Status.ERROR)
+            .put(Status.REJECTED, Image.Status.ERROR)
+            .put(Status.TRANSFER_TIMEOUT, Image.Status.ERROR)
+            .put(Status.ERROR, Image.Status.ERROR)
+            .put(Status.UNRESOLVED, Image.Status.PENDING).build();
+
+   @Singleton
+   @Provides
+   protected Map<Status, Image.Status> toPortableImageStatus() {
+      return toPortableImageStatus;
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   protected void configure() {
+      bind(new TypeLiteral<ComputeServiceAdapter<VApp, VAppTemplate, 
VAppTemplate, Location>>() {
+      }).to(VCloudComputeServiceAdapter.class);
+
+      bind(new TypeLiteral<Function<VApp, NodeMetadata>>() {
+      }).to(VAppToNodeMetadata.class);
+
+      bind(TemplateOptions.class).to(VCloudTemplateOptions.class);
+      bind(TemplateBuilder.class).to(VCloudTemplateBuilderImpl.class);
+
+      bind(new TypeLiteral<Function<VApp, Hardware>>() {
+      }).to(new TypeLiteral<HardwareForVApp>() {
+      });
+
+      bind(new TypeLiteral<Function<Org, Iterable<VAppTemplate>>>() {
+      }).to(VAppTemplatesInOrg.class);
+      bind(new TypeLiteral<Function<VAppTemplate, Image>>() {
+      }).to(ImageForVAppTemplate.class);
+      bind(new TypeLiteral<Function<VAppTemplate, Hardware>>() {
+      }).to(HardwareForVAppTemplate.class);
+
+      // we aren't converting from a provider-specific type
+      bind(new TypeLiteral<Function<Location, Location>>() {
+      }).to(Class.class.cast(IdentityFunction.class));
+   }
+
+
+   @Provides
+   @Singleton
+   public Supplier<NetworkConfig> networkConfig(@Network 
Supplier<ReferenceType> network,
+         final FenceMode defaultFenceMode) {
+      return Suppliers.compose(new Function<ReferenceType, NetworkConfig>() {
+
+         @Override
+         public NetworkConfig apply(ReferenceType input) {
+            return new NetworkConfig(input.getName(), input.getHref(), 
defaultFenceMode);
+         }
+
+      }, network);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java
new file mode 100644
index 0000000..f7e2cdf
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/FindLocationForResource.java
@@ -0,0 +1,66 @@
+/*
+ * 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.vcloud.compute.functions;
+
+import java.net.URI;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.collect.Memoized;
+import org.jclouds.domain.Location;
+import org.jclouds.logging.Logger;
+import org.jclouds.vcloud.domain.ReferenceType;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+
+@Singleton
+public class FindLocationForResource implements Function<ReferenceType, 
Location> {
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   final Supplier<Set<? extends Location>> locations;
+
+   @Inject
+   public FindLocationForResource(@Memoized Supplier<Set<? extends Location>> 
locations) {
+      this.locations = locations;
+   }
+
+   /**
+    * searches for a location associated with this resource.
+    * 
+    * @throws NoSuchElementException
+    *            if not found
+    */
+   public Location apply(ReferenceType resource) {
+      for (Location input : locations.get()) {
+         do {
+            // The "name" isn't always present, ex inside a vApp we have a rel
+            // link that only includes href and type.
+            if (URI.create(input.getId()).equals(resource.getHref()))
+               return input;
+         } while ((input = input.getParent()) != null);
+      }
+      throw new NoSuchElementException(String.format("resource: %s not found 
in locations: %s", resource,
+            locations.get()));
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVApp.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVApp.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVApp.java
new file mode 100644
index 0000000..ebfb010
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVApp.java
@@ -0,0 +1,68 @@
+/*
+ * 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.vcloud.compute.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.predicates.ImagePredicates;
+import org.jclouds.domain.Location;
+import org.jclouds.logging.Logger;
+import org.jclouds.ovf.VirtualHardwareSection;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.domain.VApp;
+import org.jclouds.vcloud.domain.Vm;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+
+public class HardwareForVApp implements Function<VApp, Hardware> {
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   private final Function<ReferenceType, Location> findLocationForResource;
+   private final VCloudHardwareBuilderFromResourceAllocations 
rasdToHardwareBuilder;
+
+   @Inject
+   protected HardwareForVApp(Function<ReferenceType, Location> 
findLocationForResource,
+            VCloudHardwareBuilderFromResourceAllocations 
rasdToHardwareBuilder) {
+      this.findLocationForResource = checkNotNull(findLocationForResource, 
"findLocationForResource");
+      this.rasdToHardwareBuilder = checkNotNull(rasdToHardwareBuilder, 
"rasdToHardwareBuilder");
+   }
+
+   @Override
+   public Hardware apply(VApp from) {
+      checkNotNull(from, "VApp");
+      // TODO make this work with composite vApps
+      Vm vm = from.getChildren().size() == 0 ? null : 
Iterables.get(from.getChildren(), 0);
+      if (vm == null)
+         return null;
+
+      VirtualHardwareSection hardware = vm.getVirtualHardwareSection();
+      HardwareBuilder builder = 
rasdToHardwareBuilder.apply(hardware.getItems());
+      builder.location(findLocationForResource.apply(checkNotNull(from, 
"from").getVDC()));
+      
builder.ids(from.getHref().toASCIIString()).name(from.getName()).supportsImage(
+               ImagePredicates.idEquals(from.getHref().toASCIIString()));
+      builder.hypervisor("VMware");
+      return builder.build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVAppTemplate.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVAppTemplate.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVAppTemplate.java
new file mode 100644
index 0000000..46d1627
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/HardwareForVAppTemplate.java
@@ -0,0 +1,81 @@
+/*
+ * 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.vcloud.compute.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.predicates.ImagePredicates;
+import org.jclouds.logging.Logger;
+import org.jclouds.ovf.Envelope;
+import org.jclouds.ovf.VirtualHardwareSection;
+import org.jclouds.vcloud.domain.VAppTemplate;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+
+@Singleton
+public class HardwareForVAppTemplate implements Function<VAppTemplate, 
Hardware> {
+
+   @Resource
+   protected Logger logger = Logger.NULL;
+
+   private final Function<VAppTemplate, Envelope> templateToEnvelope;
+   private final FindLocationForResource findLocationForResource;
+   private final VCloudHardwareBuilderFromResourceAllocations 
rasdToHardwareBuilder;
+
+   @Inject
+   protected HardwareForVAppTemplate(Function<VAppTemplate, Envelope> 
templateToEnvelope,
+            FindLocationForResource findLocationForResource,
+            VCloudHardwareBuilderFromResourceAllocations 
rasdToHardwareBuilder) {
+      this.templateToEnvelope = checkNotNull(templateToEnvelope, 
"templateToEnvelope");
+      this.findLocationForResource = checkNotNull(findLocationForResource, 
"findLocationForResource");
+      this.rasdToHardwareBuilder = checkNotNull(rasdToHardwareBuilder, 
"rasdToHardwareBuilder");
+   }
+
+   @Override
+   public Hardware apply(VAppTemplate from) {
+      checkNotNull(from, "VAppTemplate");
+
+      Envelope ovf = templateToEnvelope.apply(from);
+
+      if (ovf.getVirtualSystem().getVirtualHardwareSections().size() > 1) {
+         logger.warn("multiple hardware choices found. using first", ovf);
+      }
+      VirtualHardwareSection hardware = 
Iterables.get(ovf.getVirtualSystem().getVirtualHardwareSections(), 0);
+      HardwareBuilder builder = 
rasdToHardwareBuilder.apply(hardware.getItems());
+      if (from.getVDC() != null) {
+         builder.location(findLocationForResource.apply(from.getVDC()));
+      } else {
+         // otherwise, it could be in a public catalog, which is not assigned 
to a VDC
+      }
+      
builder.ids(from.getHref().toASCIIString()).name(from.getName()).supportsImage(
+               ImagePredicates.idEquals(from.getHref().toASCIIString()));
+      builder.hypervisor("VMware");
+      return builder.build();
+
+   }
+
+   protected String getName(String name) {
+      return name;
+   }
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVAppTemplate.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVAppTemplate.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVAppTemplate.java
new file mode 100644
index 0000000..eb70f28
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/ImageForVAppTemplate.java
@@ -0,0 +1,79 @@
+/*
+ * 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.vcloud.compute.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.compute.domain.CIMOperatingSystem;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.ImageBuilder;
+import org.jclouds.compute.reference.ComputeServiceConstants;
+import org.jclouds.logging.Logger;
+import org.jclouds.ovf.Envelope;
+import org.jclouds.vcloud.domain.Status;
+import org.jclouds.vcloud.domain.VAppTemplate;
+
+import com.google.common.base.Function;
+
+@Singleton
+public class ImageForVAppTemplate implements Function<VAppTemplate, Image> {
+
+   @Resource
+   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
+   public Logger logger = Logger.NULL;
+
+   private final Map<Status, Image.Status> toPortableImageStatus;
+   private final Function<VAppTemplate, Envelope> templateToEnvelope;
+   private final FindLocationForResource findLocationForResource;
+
+
+   @Inject
+   protected ImageForVAppTemplate(Map<Status, Image.Status> 
toPortableImageStatus, Function<VAppTemplate, Envelope> templateToEnvelope,
+            FindLocationForResource findLocationForResource) {
+      this.toPortableImageStatus = checkNotNull(toPortableImageStatus, 
"toPortableImageStatus");
+      this.templateToEnvelope = checkNotNull(templateToEnvelope, 
"templateToEnvelope");
+      this.findLocationForResource = checkNotNull(findLocationForResource, 
"findLocationForResource");
+   }
+
+   @Override
+   public Image apply(VAppTemplate from) {
+      checkNotNull(from, "VAppTemplate");
+      Envelope ovf = templateToEnvelope.apply(from);
+
+      ImageBuilder builder = new ImageBuilder();
+      builder.ids(from.getHref().toASCIIString());
+      builder.uri(from.getHref());
+      builder.name(from.getName());
+      if (from.getVDC() != null) {
+         builder.location(findLocationForResource.apply(from.getVDC()));
+      } else {
+         // otherwise, it could be in a public catalog, which is not assigned 
to a VDC
+      }
+      builder.description(from.getDescription() != null ? 
from.getDescription() : from.getName());
+      builder.operatingSystem(CIMOperatingSystem.toComputeOs(ovf));
+      builder.status(toPortableImageStatus.get(from.getStatus()));
+      return builder.build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/stratos/blob/6573fbed/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java
----------------------------------------------------------------------
diff --git 
a/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java
 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java
new file mode 100644
index 0000000..0947c78
--- /dev/null
+++ 
b/dependencies/jclouds/apis/vcloud/1.8.1-stratos/src/main/java/org/jclouds/vcloud/compute/functions/VAppToNodeMetadata.java
@@ -0,0 +1,111 @@
+/*
+ * 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.vcloud.compute.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Predicates.not;
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static com.google.common.collect.Iterables.filter;
+import static 
org.jclouds.compute.util.ComputeServiceUtils.addMetadataAndParseTagsFromCommaDelimitedValue;
+import static org.jclouds.compute.util.ComputeServiceUtils.groupFromMapOrName;
+import static 
org.jclouds.vcloud.compute.util.VCloudComputeUtils.getCredentialsFrom;
+import static 
org.jclouds.vcloud.compute.util.VCloudComputeUtils.getIpsFromVApp;
+import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.toComputeOs;
+
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.NodeMetadataBuilder;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.domain.Credentials;
+import org.jclouds.logging.Logger;
+import org.jclouds.util.InetAddresses2.IsPrivateIPAddress;
+import org.jclouds.vcloud.domain.Status;
+import org.jclouds.vcloud.domain.VApp;
+
+import com.google.common.base.Function;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableMap;
+
+@Singleton
+public class VAppToNodeMetadata implements Function<VApp, NodeMetadata> {
+   @Resource
+   protected static Logger logger = Logger.NULL;
+
+   protected final FindLocationForResource findLocationForResourceInVDC;
+   protected final Function<VApp, Hardware> hardwareForVApp;
+   protected final Map<Status, NodeMetadata.Status> vAppStatusToNodeStatus;
+   protected final Map<String, Credentials> credentialStore;
+   protected final GroupNamingConvention nodeNamingConvention;
+
+   @Inject
+   protected VAppToNodeMetadata(Map<Status, NodeMetadata.Status> 
vAppStatusToNodeStatus, Map<String, Credentials> credentialStore,
+                                FindLocationForResource 
findLocationForResourceInVDC, Function<VApp, Hardware> hardwareForVApp,
+                                GroupNamingConvention.Factory 
namingConvention) {
+      this.nodeNamingConvention = checkNotNull(namingConvention, 
"namingConvention").createWithoutPrefix();
+      this.hardwareForVApp = checkNotNull(hardwareForVApp, "hardwareForVApp");
+      this.findLocationForResourceInVDC = 
checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC");
+      this.credentialStore = checkNotNull(credentialStore, "credentialStore");
+      this.vAppStatusToNodeStatus = checkNotNull(vAppStatusToNodeStatus, 
"vAppStatusToNodeStatus");
+   }
+
+   public NodeMetadata apply(VApp from) {
+      NodeMetadataBuilder builder = new NodeMetadataBuilder();
+      builder.ids(from.getHref().toASCIIString());
+      builder.uri(from.getHref());
+      builder.name(from.getName());
+      String groupName = "";
+      Map<String, String> metadataMap;
+
+      if (!isNullOrEmpty(from.getDescription())
+         && from.getDescription().indexOf('=') != -1
+         && from.getDescription().indexOf('\n') != -1) {
+         try {
+            metadataMap = 
Splitter.on('\n').withKeyValueSeparator("=").split(from.getDescription());
+
+            addMetadataAndParseTagsFromCommaDelimitedValue(builder, 
metadataMap);
+         } catch (IllegalArgumentException iae) {
+            // no op
+            metadataMap = ImmutableMap.of();
+         }
+      } else {
+         metadataMap = ImmutableMap.of();
+      }
+      builder.hostname(from.getName());
+      builder.location(findLocationForResourceInVDC.apply(from.getVDC()));
+      builder.group(groupFromMapOrName(metadataMap, from.getName(), 
nodeNamingConvention));
+      builder.operatingSystem(toComputeOs(from, null));
+      builder.hardware(hardwareForVApp.apply(from));
+      builder.status(vAppStatusToNodeStatus.get(from.getStatus()));
+      Set<String> addresses = getIpsFromVApp(from);
+      builder.publicAddresses(filter(addresses, 
not(IsPrivateIPAddress.INSTANCE)));
+      builder.privateAddresses(filter(addresses, IsPrivateIPAddress.INSTANCE));
+
+      // normally, we don't affect the credential store when reading vApps.
+      // However, login user, etc, is actually in the metadata, so lets see
+      Credentials fromApi = getCredentialsFrom(from);
+      if (fromApi != null && !credentialStore.containsKey("node#" + 
from.getHref().toASCIIString()))
+         credentialStore.put("node#" + from.getHref().toASCIIString(), 
fromApi);
+      return builder.build();
+   }
+}

Reply via email to