EMMA Coverage Report (generated Mon Oct 17 05:41:20 EDT 2011)
[all classes][org.jclouds.savvis.vpdc.binders]

COVERAGE SUMMARY FOR SOURCE FILE [BaseBindVMSpecToXmlPayload.java]

nameclass, %method, %block, %line, %
BaseBindVMSpecToXmlPayload.java100% (1/1)89%  (16/18)82%  (443/540)84%  (80.4/96)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class BaseBindVMSpecToXmlPayload100% (1/1)89%  (16/18)82%  (443/540)84%  (80.4/96)
bindToRequest (HttpRequest, Object): HttpRequest 0%   (0/1)0%   (0/5)0%   (0/1)
ifNullDefaultTo (String, String): String 0%   (0/1)0%   (0/9)0%   (0/1)
addDisks (XMLBuilder, VMSpec): void 100% (1/1)49%  (73/149)52%  (11.5/22)
generateXml (Object): String 100% (1/1)77%  (20/26)62%  (5/8)
bindToRequest (HttpRequest, Map): HttpRequest 100% (1/1)97%  (32/33)99%  (6/6)
BaseBindVMSpecToXmlPayload (): void 100% (1/1)100% (3/3)100% (1/1)
addCPU (XMLBuilder, int): void 100% (1/1)100% (56/56)100% (8/8)
addItems (XMLBuilder, VMSpec, String): void 100% (1/1)100% (19/19)100% (5/5)
addMemory (XMLBuilder, int): void 100% (1/1)100% (49/49)100% (8/8)
addNetwork (XMLBuilder, String): void 100% (1/1)100% (42/42)100% (8/8)
addOperatingSystemAndVirtualHardware (VMSpec, XMLBuilder): void 100% (1/1)100% (17/17)100% (3/3)
addOperatingSystemSection (XMLBuilder, CIMOperatingSystem): void 100% (1/1)100% (30/30)100% (4/4)
addSystem (XMLBuilder, String): void 100% (1/1)100% (29/29)100% (6/6)
addVirtualHardwareSection (XMLBuilder, String, String, VMSpec): void 100% (1/1)100% (20/20)100% (5/5)
buildChildren (XMLBuilder): XMLBuilder 100% (1/1)100% (6/6)100% (2/2)
buildRoot (): XMLBuilder 100% (1/1)100% (20/20)100% (2/2)
buildRootForName (XMLBuilder, String): XMLBuilder 100% (1/1)100% (12/12)100% (2/2)
checkSpec (VMSpec): void 100% (1/1)100% (15/15)100% (4/4)

1/**
2 * Licensed to jclouds, Inc. (jclouds) under one or more
3 * contributor license agreements.  See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership.  jclouds licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License.  You may obtain a copy of the License at
9 *
10 *   http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied.  See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19package org.jclouds.savvis.vpdc.binders;
20 
21import static com.google.common.base.Preconditions.checkArgument;
22import static com.google.common.base.Preconditions.checkNotNull;
23import static com.google.common.base.Preconditions.checkState;
24 
25import java.util.Map;
26import java.util.Properties;
27import java.util.Map.Entry;
28 
29import javax.ws.rs.core.MediaType;
30import javax.xml.parsers.FactoryConfigurationError;
31import javax.xml.parsers.ParserConfigurationException;
32 
33import org.jclouds.cim.ResourceAllocationSettingData.ResourceType;
34import org.jclouds.compute.domain.CIMOperatingSystem;
35import org.jclouds.http.HttpRequest;
36import org.jclouds.rest.MapBinder;
37import org.jclouds.rest.binders.BindToStringPayload;
38import org.jclouds.rest.internal.GeneratedHttpRequest;
39import org.jclouds.savvis.vpdc.domain.VMSpec;
40 
41import com.google.common.base.Throwables;
42import com.jamesmurty.utils.XMLBuilder;
43 
44/**
45 * 
46 * @author Adrian Cole
47 * 
48 */
49public abstract class BaseBindVMSpecToXmlPayload<T> extends BindToStringPayload implements MapBinder {
50   @Override
51   public <R extends HttpRequest> R bindToRequest(R request, Object toBind) {
52      throw new IllegalStateException("BindVMSpecToXmlPayload needs parameters");
53   }
54 
55   protected abstract T findSpecInArgsOrNull(GeneratedHttpRequest<?> gRequest);
56 
57   @Override
58   public <R extends HttpRequest> R bindToRequest(R request, Map<String, String> postParams) {
59      checkArgument(checkNotNull(request, "request") instanceof GeneratedHttpRequest<?>,
60               "this binder is only valid for GeneratedHttpRequests!");
61      GeneratedHttpRequest<?> gRequest = (GeneratedHttpRequest<?>) request;
62      checkState(gRequest.getArgs() != null, "args should be initialized at this point");
63 
64      request = super.bindToRequest(request, generateXml(findSpecInArgsOrNull(gRequest)));
65      request.getPayload().getContentMetadata().setContentType(MediaType.APPLICATION_XML);
66      return request;
67   }
68 
69   public String generateXml(T spec) {
70      try {
71         XMLBuilder rootBuilder = buildRoot();
72         bindSpec(spec, rootBuilder);
73         Properties outputProperties = new Properties();
74         outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes");
75         return rootBuilder.asString(outputProperties);
76      } catch (Exception e) {
77         Throwables.propagate(e);
78         return null;
79      }
80   }
81 
82   protected abstract void bindSpec(T spec, XMLBuilder rootBuilder) throws ParserConfigurationException,
83            FactoryConfigurationError;
84 
85   protected void checkSpec(VMSpec spec) {
86      checkNotNull(spec, "VMSpec");
87      checkNotNull(spec.getName(), "name");
88      checkNotNull(spec.getNetworkTierName(), "networkTierName");
89   }
90 
91   protected void addOperatingSystemAndVirtualHardware(VMSpec spec, XMLBuilder vAppBuilder) {
92      addOperatingSystemSection(vAppBuilder, spec.getOperatingSystem());
93      // TODO: Savvis returns network names with a - instead of space on getNetworkInVDC
94      // call,
95      // fix this once savvis api starts returning correctly
96      addVirtualHardwareSection(vAppBuilder, spec.getName(), spec.getNetworkTierName().replace("-", " "), spec);
97   }
98 
99   void addVirtualHardwareSection(XMLBuilder rootBuilder, String name, String networkName, VMSpec spec) {
100      XMLBuilder virtualHardwareSectionBuilder = rootBuilder.e("ovf:VirtualHardwareSection");
101      virtualHardwareSectionBuilder.e("ovf:Info").t("Virtual Hardware");
102      addSystem(virtualHardwareSectionBuilder, name);
103      addItems(virtualHardwareSectionBuilder, spec, networkName);
104   }
105 
106   void addItems(XMLBuilder virtualHardwareSectionBuilder, VMSpec spec, String networkName) {
107      // todo make this work with fractional, which I think means setting speed to half
108      addCPU(virtualHardwareSectionBuilder, (int) spec.getProcessorCount());
109      addMemory(virtualHardwareSectionBuilder, spec.getMemoryInGig());
110      addNetwork(virtualHardwareSectionBuilder, networkName);
111      addDisks(virtualHardwareSectionBuilder, spec);
112   }
113 
114   private void addSystem(XMLBuilder virtualHardwareSectionBuilder, String name) {
115      XMLBuilder systemBuilder = virtualHardwareSectionBuilder.e("ovf:System");
116      systemBuilder.e("vssd:Description").t("Virtual Hardware Family");
117      systemBuilder.e("vssd:ElementName").t(name);
118      systemBuilder.e("vssd:InstanceID").t("1");
119      systemBuilder.e("vssd:VirtualSystemIdentifier").t(name);
120   }
121 
122   private void addOperatingSystemSection(XMLBuilder rootBuilder, CIMOperatingSystem operatingSystem) {
123      XMLBuilder sectionBuilder = rootBuilder.e("ovf:OperatingSystemSection").a("ovf:id",
124               operatingSystem.getOsType().getCode() + "");
125      sectionBuilder.e("ovf:Info").t("Specifies the operating system installed");
126      sectionBuilder.e("ovf:Description").t(operatingSystem.getDescription());
127   }
128 
129   private void addCPU(XMLBuilder sectionBuilder, int processorCount) {
130      XMLBuilder cpuBuilder = sectionBuilder.e("ovf:Item");
131      cpuBuilder.e("rasd:AllocationUnits").t("3 GHz");
132      cpuBuilder.e("rasd:Description").t("Number of Virtual CPUs");
133      cpuBuilder.e("rasd:ElementName").t(processorCount + " CPU");
134      cpuBuilder.e("rasd:InstanceID").t("1");
135      cpuBuilder.e("rasd:ResourceType").t(ResourceType.PROCESSOR.value());
136      cpuBuilder.e("rasd:VirtualQuantity").t(processorCount + "");
137   }
138 
139   private void addMemory(XMLBuilder sectionBuilder, int memoryInGig) {
140      XMLBuilder memoryBuilder = sectionBuilder.e("ovf:Item");
141      memoryBuilder.e("rasd:AllocationUnits").t("Gigabytes");
142      memoryBuilder.e("rasd:Description").t("Memory Size");
143      memoryBuilder.e("rasd:ElementName").t("Memory");
144      memoryBuilder.e("rasd:InstanceID").t("2");
145      memoryBuilder.e("rasd:ResourceType").t(ResourceType.MEMORY.value());
146      memoryBuilder.e("rasd:VirtualQuantity").t(memoryInGig + "");
147   }
148 
149   private void addNetwork(XMLBuilder sectionBuilder, String networkName) {
150      XMLBuilder networkBuilder = sectionBuilder.e("ovf:Item");
151      networkBuilder.e("rasd:Caption").t("false");
152      networkBuilder.e("rasd:Connection").t(networkName);
153      networkBuilder.e("rasd:ElementName").t("Network");
154      networkBuilder.e("rasd:InstanceID").t("3");
155      networkBuilder.e("rasd:ResourceType").t(ResourceType.ETHERNET_ADAPTER.value());
156      networkBuilder.e("rasd:VirtualQuantity").t("1");
157   }
158 
159   private void addDisks(XMLBuilder sectionBuilder, VMSpec spec) {
160      XMLBuilder bootDiskBuilder = sectionBuilder.e("ovf:Item");
161      bootDiskBuilder.e("rasd:AllocationUnits").t("Gigabytes");
162      bootDiskBuilder.e("rasd:Caption").t("");
163      bootDiskBuilder.e("rasd:Description").t("Hard Disk");
164      bootDiskBuilder.e("rasd:ElementName").t(spec.getBootDeviceName());
165      bootDiskBuilder.e("rasd:HostResource").t("boot");
166      bootDiskBuilder.e("rasd:InstanceID").t("4");
167      bootDiskBuilder.e("rasd:ResourceType").t(ResourceType.BASE_PARTITIONABLE_UNIT.value());
168      bootDiskBuilder.e("rasd:VirtualQuantity").t(spec.getBootDiskSize() + "");
169 
170      int instanceId = 5;
171      for (Entry<String, Integer> dataDisk : spec.getDataDiskDeviceNameToSizeInGig().entrySet()) {
172         XMLBuilder dataDiskBuilder = sectionBuilder.e("ovf:Item");
173         dataDiskBuilder.e("rasd:AllocationUnits").t("Gigabytes");
174         dataDiskBuilder.e("rasd:Caption").t("");
175         dataDiskBuilder.e("rasd:Description").t("Hard Disk");
176         dataDiskBuilder.e("rasd:ElementName").t(dataDisk.getKey());
177         dataDiskBuilder.e("rasd:HostResource").t("data");
178         dataDiskBuilder.e("rasd:InstanceID").t("" + instanceId++);
179         dataDiskBuilder.e("rasd:ResourceType").t(ResourceType.PARTITIONABLE_UNIT.value());
180         dataDiskBuilder.e("rasd:VirtualQuantity").t(dataDisk.getValue() + "");
181      }
182   }
183 
184   protected XMLBuilder buildRoot() throws ParserConfigurationException, FactoryConfigurationError {
185      XMLBuilder rootBuilder = XMLBuilder.create("vApp:VApp").a("xmlns:vApp", "http://www.vmware.com/vcloud/v0.8").a(
186               "xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1").a("xmlns:vssd",
187               "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_VirtualSystemSettingData").a("xmlns:common",
188               "http://schemas.dmtf.org/wbem/wscim/1/common").a("xmlns:rasd",
189               "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData");
190      return rootBuilder;
191   }
192 
193   protected XMLBuilder buildChildren(XMLBuilder rootBuilder) throws ParserConfigurationException,
194            FactoryConfigurationError {
195      XMLBuilder vAppChildrenBuilder = rootBuilder.e("vApp:Children");
196      return vAppChildrenBuilder;
197   }
198 
199   protected XMLBuilder buildRootForName(XMLBuilder rootBuilder, String name) throws ParserConfigurationException,
200            FactoryConfigurationError {
201      XMLBuilder vAppBuilder = rootBuilder.e("vApp:VApp").a("name", name).a("type",
202               "application/vnd.vmware.vcloud.vApp+xml");
203      return vAppBuilder;
204   }
205 
206   protected String ifNullDefaultTo(String value, String defaultValue) {
207      return value != null ? value : checkNotNull(defaultValue, "defaultValue");
208   }
209 
210}

[all classes][org.jclouds.savvis.vpdc.binders]
EMMA 2.0.5312 (C) Vladimir Roubtsov