/**
 * Licensed to jclouds, Inc. (jclouds) under one or more
 * contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 *(Link.builder().regarding copyright ownership.  jclouds 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(Link.builder().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.director.v1_5.features;

import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.fail;

import java.net.URI;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;

import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.domain.Capabilities;
import org.jclouds.vcloud.director.v1_5.domain.CapacityWithUsage;
import org.jclouds.vcloud.director.v1_5.domain.ComputeCapacity;
import org.jclouds.vcloud.director.v1_5.domain.Error;
import org.jclouds.vcloud.director.v1_5.domain.Link;
import org.jclouds.vcloud.director.v1_5.domain.Media;
import org.jclouds.vcloud.director.v1_5.domain.Owner;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.domain.User;
import org.jclouds.vcloud.director.v1_5.domain.Media.ImageType;
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.VApp;
import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
import org.jclouds.vcloud.director.v1_5.domain.Vdc;
import org.jclouds.vcloud.director.v1_5.domain.org.Org;
import org.jclouds.vcloud.director.v1_5.domain.params.CaptureVAppParams;
import org.jclouds.vcloud.director.v1_5.domain.params.CloneMediaParams;
import org.jclouds.vcloud.director.v1_5.domain.params.CloneVAppParams;
import org.jclouds.vcloud.director.v1_5.domain.params.CloneVAppTemplateParams;
import org.jclouds.vcloud.director.v1_5.domain.params.ComposeVAppParams;
import org.jclouds.vcloud.director.v1_5.domain.params.InstantiateVAppTemplateParams;
import org.jclouds.vcloud.director.v1_5.domain.params.UploadVAppTemplateParams;
import org.jclouds.vcloud.director.v1_5.internal.VCloudDirectorAdminApiExpectTest;
import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

/**
 * Allows us to test a api via its side effects.
 * 
 * @author danikov
 */
@Test(groups = { "unit", "user" }, singleThreaded = true, testName = "VdcApiExpectTest")
public class VdcApiExpectTest extends VCloudDirectorAdminApiExpectTest {
   
   private URI vdcURI;
   
   @BeforeClass
   public void before() {
      String vdcId = "e9cd3387-ac57-4d27-a481-9bee75e0690f";
      vdcURI = URI.create(endpoint+"/vdc/"+vdcId);
   }
   
   @Test
   public void testGetVdc() {
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/vdc.xml", VCloudDirectorMediaType.VDC)
               .httpResponseBuilder().build());
      
      Vdc expected = getVdc();

      assertEquals(api.getVdcApi().getVdc(vdcURI), expected);
   }

   @Test
   public void testResponse400ForInvalidVdcId() {
      
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/vdc/NOTAUUID")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/error400.xml", VCloudDirectorMediaType.ERROR)
               .httpResponseBuilder().statusCode(400).build());

      Error expected = Error.builder()
            .message("validation error : EntityRef has incorrect type, expected type is com.vmware.vcloud.entity.vdc.")
            .majorErrorCode(400)
            .minorErrorCode("BAD_REQUEST")
            .build();

      try {
         api.getVdcApi().getVdc(URI.create(endpoint + "/vdc/NOTAUUID"));
         fail("Should give HTTP 400 error");
      } catch (VCloudDirectorException vde) {
         assertEquals(vde.getError(), expected);
      }
   }

   @Test
   public void testResponse403ForFakeVdcId() {
      
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/vdc/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/error403-fake.xml", VCloudDirectorMediaType.ERROR)
               .httpResponseBuilder().statusCode(403).build());

      assertNull(api.getVdcApi().getVdc(URI.create(endpoint + "/vdc/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")));
   }
   
   @Test(enabled = false)
   public void testCaptureVApp() {
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/captureVApp")
               .xmlFilePayload("/vdc/params/captureVApp.xml", VCloudDirectorMediaType.CAPTURE_VAPP_PARAMS)
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/vdc.xml", VCloudDirectorMediaType.VDC)
               .httpResponseBuilder().build());
      
      VAppTemplate expected = captureVApp();

      // TODO: configure params
      CaptureVAppParams params = CaptureVAppParams.builder()
         
         .build();
      
      assertEquals(api.getVdcApi().captureVApp(vdcURI, params), expected);
   }
   
   @Test(enabled = false)
   public void testResponse4xxForCaptureVAppNoParams() {
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/captureVApp")
               .xmlFilePayload("/vdc/params/captureVApp.xml", VCloudDirectorMediaType.CAPTURE_VAPP_PARAMS)
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/param/error400.xml", VCloudDirectorMediaType.ERROR)
               .httpResponseBuilder().statusCode(400).build());

      Error expected = Error.builder()
            .message("?")
            .majorErrorCode(400)
            .minorErrorCode("BAD_REQUEST")
            .build();

      try {
         api.getVdcApi().captureVApp(vdcURI, null);
         fail("Should give HTTP 400 error");
      } catch (VCloudDirectorException vde) {
         assertEquals(vde.getError(), expected);
      }
   }
   
   @Test(enabled = false)
   public void testCloneVApp() {
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/cloneVAppTemplate")
               .xmlFilePayload("/vdc/params/cloneVApp.xml", VCloudDirectorMediaType.CLONE_VAPP_PARAMS)
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/cloneVApp.xml", VCloudDirectorMediaType.VAPP)
               .httpResponseBuilder().build());
      
      VApp expected = cloneVApp();

      // TODO: configure params
      CloneVAppParams params = CloneVAppParams.builder()
         
         .build();
      
      assertEquals(api.getVdcApi().cloneVApp(vdcURI, params), expected);
   }
   
   @Test(enabled = false)
   public void testCloneVAppTemplate() {
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/cloneVAppTemplate")
               .xmlFilePayload("/vdc/params/cloneVAppTemplate.xml", VCloudDirectorMediaType.CLONE_VAPP_TEMPLATE_PARAMS)
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/cloneVAppTemplate.xml", VCloudDirectorMediaType.VAPP_TEMPLATE)
               .httpResponseBuilder().build());
      
      VAppTemplate expected = cloneVAppTemplate();

      // TODO: configure params
      CloneVAppTemplateParams params = CloneVAppTemplateParams.builder()
         
         .build();
      
      assertEquals(api.getVdcApi().cloneVAppTemplate(vdcURI, params), expected);
   }

   @Test(enabled = false)
   public void testComposeVApp() throws ParseException {
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/composeVApp")
               .xmlFilePayload("/vdc/composeVAppParams.xml", VCloudDirectorMediaType.COMPOSE_VAPP_PARAMS)
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/composeVApp.xml", VCloudDirectorMediaType.VAPP)
               .httpResponseBuilder().build());
      
      VApp expected = composeVApp();

      // TODO: configure params
      ComposeVAppParams params = ComposeVAppParams.builder()
         
         .build();
      
      assertEquals(api.getVdcApi().composeVApp(vdcURI, params), expected);
   }

   @Test(enabled = false)
   public void testInstantiateVAppTemplate() {
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/instantiateVAppTemplate")
               .xmlFilePayload("/vdc/params/instantiateVAppTemplate.xml", VCloudDirectorMediaType.CAPTURE_VAPP_PARAMS)
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/instantiateVAppTemplate.xml", VCloudDirectorMediaType.VAPP)
               .httpResponseBuilder().build());
      
      VApp expected = instantiateVAppTemplate();

      // TODO: configure params
      InstantiateVAppTemplateParams params = InstantiateVAppTemplateParams.builder()
         
         .build();
      
      assertEquals(api.getVdcApi().instantiateVApp(vdcURI, params), expected);
   }

   @Test(enabled = false)
   public void testUploadVAppTemplate() {
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/uploadVAppTemplate")
               .xmlFilePayload("/vdc/params/uploadVAppTemplate.xml", VCloudDirectorMediaType.UPLOAD_VAPP_TEMPLATE_PARAMS)
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/uploadVAppTemplate.xml", VCloudDirectorMediaType.VAPP_TEMPLATE)
               .httpResponseBuilder().build());
      
      VAppTemplate expected = uploadVAppTemplate();

      // TODO: configure params
      UploadVAppTemplateParams params = UploadVAppTemplateParams.builder()
         
         .build();
      
      assertEquals(api.getVdcApi().uploadVAppTemplate(vdcURI, params), expected);
   }

   @Test
   public void testCreateMedia() {
      URI vdcUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f");

      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media")
               .acceptMedia(VCloudDirectorMediaType.MEDIA)
               .xmlFilePayload("/media/createMediaSource.xml", VCloudDirectorMediaType.MEDIA)
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/createMedia.xml", VCloudDirectorMediaType.MEDIA)
               .httpResponseBuilder().statusCode(201).build());
      
      Media source = Media.builder()
         .size(0)
         .imageType(ImageType.ISO)
         .name("Test media 1")
         .type("application/vnd.vmware.vcloud.media+xml")
         .description("Test media generated by testCreateMedia()")
         .build();
      Media expected = MediaApiExpectTest.createMedia();
      
      assertEquals(api.getVdcApi().createMedia(vdcUri, source), expected);
   }
   
   @Test
   public void testCloneMedia() {
      URI vdcUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f");

      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/cloneMedia")
               .acceptMedia(VCloudDirectorMediaType.MEDIA)
               .xmlFilePayload("/media/cloneMediaParams.xml", VCloudDirectorMediaType.CLONE_MEDIA_PARAMS)
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/media/cloneMedia.xml", VCloudDirectorMediaType.MEDIA)
               .httpResponseBuilder().statusCode(201).build());
      
      CloneMediaParams params = CloneMediaParams.builder()
         .name("moved test media")
         .description("moved by testCloneMedia()")
         .source(Reference.builder()
               .type("application/vnd.vmware.vcloud.media+xml")
               .name("copied test media")
               .id("urn:vcloud:media:da8361af-cccd-4103-a71c-493513c49094")
               .href(URI.create("https://mycloud.greenhousedata.com/api/media/da8361af-cccd-4103-a71c-493513c49094"))
               .build())
         .isSourceDelete(false)
         .build();
      Media expected = MediaApiExpectTest.cloneMedia();
      
      assertEquals(api.getVdcApi().cloneMedia(vdcUri, params), expected);
   }
   
   @Test(enabled = false)
   public void testGetMetadata() {
      URI vdcUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f");
      
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
            new VcloudHttpRequestPrimer()
                  .apiCommand("GET", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/metadata")
                  .acceptAnyMedia()
                  .httpRequestBuilder().build(),
            new VcloudHttpResponsePrimer()
                  .xmlFilePayload("/vdc/metadata.xml", VCloudDirectorMediaType.METADATA)
                  .httpResponseBuilder().build());
            
      Metadata expected = metadata();

      assertEquals(api.getVdcApi().getMetadataApi().getMetadata(vdcUri), expected);
   }
   
   @Test(enabled = false)
   public void testGetMetadataValue() {
      URI vdcUri = URI.create("https://vcloudbeta.bluelock.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f");
      
      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
            new VcloudHttpRequestPrimer()
               .apiCommand("GET", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/metadata/key")
               .acceptAnyMedia()
               .httpRequestBuilder().build(), 
            new VcloudHttpResponsePrimer()
               .xmlFilePayload("/vdc/metadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE)
               .httpResponseBuilder().build());
      
      MetadataValue expected = metadataValue();
     
      assertEquals(api.getVdcApi().getMetadataApi().getMetadataValue(vdcUri, "key"), expected);
   }

   public static Vdc getVdc() {
      return Vdc.builder()
         .status(1)
         .name("orgVDC-cloudsoft-Tier1-PAYG")
         .id("urn:vcloud:vdc:e9cd3387-ac57-4d27-a481-9bee75e0690f")
         .type("application/vnd.vmware.vcloud.vdc+xml")
         .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"))
         .link(Link.builder()
            .rel("up")
            .type("application/vnd.vmware.vcloud.org+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/org/c076f90a-397a-49fa-89b8-b294c1599cd0"))
            .build())
         .link(Link.builder()
            .rel("down")
            .type("application/vnd.vmware.vcloud.metadata+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/metadata"))
            .build())
         .link(Link.builder()
            .rel("add")
            .type("application/vnd.vmware.vcloud.uploadVAppTemplateParams+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/uploadVAppTemplate"))
            .build())
         .link(Link.builder()
            .rel("add")
            .type("application/vnd.vmware.vcloud.media+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media"))
            .build())
         .link(Link.builder()
            .rel("add")
            .type("application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/instantiateVAppTemplate"))
            .build())
         .link(Link.builder()
            .rel("add")
            .type("application/vnd.vmware.vcloud.cloneVAppParams+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/cloneVApp"))
            .build())
         .link(Link.builder()
            .rel("add")
            .type("application/vnd.vmware.vcloud.cloneVAppTemplateParams+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/cloneVAppTemplate"))
            .build())
         .link(Link.builder()
            .rel("add")
            .type("application/vnd.vmware.vcloud.cloneMediaParams+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/cloneMedia"))
            .build())
         .link(Link.builder()
            .rel("add")
            .type("application/vnd.vmware.vcloud.captureVAppParams+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/captureVApp"))
            .build())
         .link(Link.builder()
            .rel("add")
            .type("application/vnd.vmware.vcloud.composeVAppParams+xml")
            .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/composeVApp"))
            .build())
         .description("Pay As You go resources for organization cloudsoft ")
         .allocationModel("AllocationVApp")
         .storageCapacity(CapacityWithUsage.builder()
            .units("MB")
            .allocated(0l)
            .limit(0l)
            .used(4519l)
            .overhead(0l)
            .build())
         .computeCapacity(ComputeCapacity.builder()
            .cpu(CapacityWithUsage.builder()
               .units("MHz")
               .allocated(0l)
               .limit(0l)
               .used(0l)
               .overhead(0l)
               .build())
            .memory(CapacityWithUsage.builder()
               .units("MB")
               .allocated(0l)
               .limit(0l)
               .used(0l)
               .overhead(0l)
               .build())
            .build())
        .resourceEntity(Reference.builder()
               .type("application/vnd.vmware.vcloud.vApp+xml")
               .name("vcdcap-db9")
               .href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-e2a4ab74-ea62-4afa-8bb7-0c11259044fb"))
               .build())
        .resourceEntity(Reference.builder()
               .type("application/vnd.vmware.vcloud.vAppTemplate+xml")
               .name("adriancolecap")
               .href(URI.create("https://mycloud.greenhousedata.com/api/vAppTemplate/vappTemplate-5571eb21-f532-4506-9737-01a4635a04cb"))
               .build())
        .resourceEntity(Reference.builder()
               .type("application/vnd.vmware.vcloud.media+xml")
               .name("DansTestMedia")
               .href(URI.create("https://mycloud.greenhousedata.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1"))
               .build())
        .network(Reference.builder()
               .type("application/vnd.vmware.vcloud.network+xml")
               .name("orgNet-cloudsoft-Isolated")
               .href(URI.create("https://mycloud.greenhousedata.com/api/network/a604f3c2-0343-453e-ae1f-cddac5b7bd94"))
               .build())
        .network(Reference.builder()
               .type("application/vnd.vmware.vcloud.network+xml")
               .name("orgNet-cloudsoft-External")
               .href(URI.create("https://mycloud.greenhousedata.com/api/network/b466c0c5-8a5c-4335-b703-a2e2e6b5f3e1"))
               .build())
        .network(Reference.builder()
               .type("application/vnd.vmware.vcloud.network+xml")
               .name("orgNet-cloudsoft-Internal-Routed")
               .href(URI.create("https://mycloud.greenhousedata.com/api/network/6d7392e2-c816-43fb-99be-f9ebcd70abf6"))
               .build())
         .capabilities(Capabilities.builder()
               .supportedHardwareVersion("vmx-04")
               .supportedHardwareVersion("vmx-07")
               .supportedHardwareVersion("vmx-08")
               .build())
         .nicQuota(0)
         .networkQuota(10)
         .vmQuota(10)
         .isEnabled(true)
         .build();
   }
   
   private VAppTemplate captureVApp() {
      // TODO Auto-generated method stub
      return null;
   }
   
   private VApp cloneVApp() {
      // TODO Auto-generated method stub
      return null;
   }
   
   private VAppTemplate cloneVAppTemplate() {
      // TODO Auto-generated method stub
      return null;
   }
   
   private VApp composeVApp() throws ParseException {

      return VApp
               .builder()
               .status(0)
               .name("test-vapp")
               .id("urn:vcloud:vapp:d0e2b6b9-4381-4ddc-9572-cdfae54059be")
               .type("application/vnd.vmware.vcloud.vApp+xml")
               .description("Test VApp")
               .href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be"))
               .link(Link
                        .builder()
                        .name("orgNet-cloudsoft-External")
                        .rel("down")
                        .type("application/vnd.vmware.vcloud.vAppNetwork+xml")
                        .href(URI.create("https://mycloud.greenhousedata.com/api/network/2a2e2da4-446a-4ebc-a086-06df7c9570f0"))
                        .build())
               .link(Link
                        .builder()
                        .rel("down")
                        .type("application/vnd.vmware.vcloud.controlAccess+xml")
                        .href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/controlAccess/"))
                        .build())
               .link(Link
                        .builder()
                        .rel("up")
                        .type("application/vnd.vmware.vcloud.vdc+xml")
                        .href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"))
                        .build())
               .link(Link
                        .builder()
                        .rel("down")
                        .type("application/vnd.vmware.vcloud.owner+xml")
                        .href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/owner"))
                        .build())
               .link(Link
                        .builder()
                        .rel("down")
                        .type("application/vnd.vmware.vcloud.metadata+xml")
                        .href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/metadata"))
                        .build())
               .owner(Owner
                        .builder()
                        .type("application/vnd.vmware.vcloud.owner+xml")
                        .user(User
                                 .builder()
                                 .type("application/vnd.vmware.admin.user+xml")
                                 .name("acole")
                                 .href(URI.create("https://mycloud.greenhousedata.com/api/admin/user/c090335b-708c-4c1c-9e3d-89560d002120"))
                                 .build().getRole()).build()).build();
   }

   private VApp instantiateVAppTemplate() {
      // TODO Auto-generated method stub
      return null;
   }
   
   private VAppTemplate uploadVAppTemplate() {
      // TODO Auto-generated method stub
      return null;
   }
   
   private Metadata metadata() {
      // TODO Auto-generated method stub
      return null;
   }
   
   private MetadataValue metadataValue() {
      // TODO Auto-generated method stub
      return null;
   }
   
}
