Skip to content

Commit 96700a0

Browse files
committed
Merge pull request #2022 from shapeblue/4.9-systemvm-fix-vmware-portgroups
[dvswitch blocker] CLOUDSTACK-9591: Fix systemvmtemplate to not include network detailsThis removes nic/network specific details while exporting the systemvmtemplate for vmware (ova file). Having this causes the ssvms to not deploy in dvswitch-based vmware environments that have no vswitch portgroups (dummy etc). Tested this on a local Trillian env. * pr/2022: CLOUDSTACK-9591: Fix guest VM ovf xml to remove network nodes CLOUDSTACK-9591: Fix systemvmtemplate to not include network details Signed-off-by: Rajani Karuturi <rajani.karuturi@accelerite.com>
2 parents 6548839 + 00e1b46 commit 96700a0

File tree

3 files changed

+297
-36
lines changed

3 files changed

+297
-36
lines changed

tools/appliance/build.sh

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -433,12 +433,6 @@ scsi0:0.writeThrough = "false"
433433
scsi0.virtualDev = "lsilogic"
434434
scsi0.present = "TRUE"
435435
vmci0.unrestricted = "false"
436-
ethernet0.present = "TRUE"
437-
ethernet0.virtualDev = "e1000"
438-
ethernet0.connectionType = "bridged"
439-
ethernet0.startConnected = "TRUE"
440-
ethernet0.addressType = "generated"
441-
ethernet0.wakeonpcktrcv = "false"
442436
vcpu.hotadd = "false"
443437
vcpu.hotremove = "false"
444438
firmware = "bios"

vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,6 @@
1616
// under the License.
1717
package com.cloud.hypervisor.vmware.mo;
1818

19-
import java.io.File;
20-
import java.net.URI;
21-
import java.net.URISyntaxException;
22-
import java.security.InvalidParameterException;
23-
import java.util.ArrayList;
24-
import java.util.Arrays;
25-
import java.util.List;
26-
import java.util.Map;
27-
28-
import org.apache.log4j.Logger;
29-
3019
import com.cloud.exception.CloudException;
3120
import com.cloud.hypervisor.vmware.util.VmwareContext;
3221
import com.cloud.hypervisor.vmware.util.VmwareHelper;
@@ -92,6 +81,33 @@
9281
import com.vmware.vim25.VmwareDistributedVirtualSwitchPvlanSpec;
9382
import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanIdSpec;
9483
import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanSpec;
84+
import org.apache.log4j.Logger;
85+
import org.w3c.dom.Document;
86+
import org.w3c.dom.Element;
87+
import org.w3c.dom.Node;
88+
import org.w3c.dom.traversal.DocumentTraversal;
89+
import org.w3c.dom.traversal.NodeFilter;
90+
import org.w3c.dom.traversal.NodeIterator;
91+
import org.xml.sax.SAXException;
92+
93+
import javax.xml.parsers.DocumentBuilderFactory;
94+
import javax.xml.parsers.ParserConfigurationException;
95+
import javax.xml.transform.Transformer;
96+
import javax.xml.transform.TransformerException;
97+
import javax.xml.transform.TransformerFactory;
98+
import javax.xml.transform.dom.DOMSource;
99+
import javax.xml.transform.stream.StreamResult;
100+
import java.io.ByteArrayInputStream;
101+
import java.io.File;
102+
import java.io.IOException;
103+
import java.io.StringWriter;
104+
import java.net.URI;
105+
import java.net.URISyntaxException;
106+
import java.security.InvalidParameterException;
107+
import java.util.ArrayList;
108+
import java.util.Arrays;
109+
import java.util.List;
110+
import java.util.Map;
95111

96112
public class HypervisorHostHelper {
97113
private static final Logger s_logger = Logger.getLogger(HypervisorHostHelper.class);
@@ -1477,6 +1493,40 @@ public static String resolveHostNameInUrl(DatacenterMO dcMo, String url) {
14771493
return url;
14781494
}
14791495

1496+
public static String removeOVFNetwork(final String ovfString) {
1497+
if (ovfString == null || ovfString.isEmpty()) {
1498+
return ovfString;
1499+
}
1500+
try {
1501+
final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
1502+
final Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(ovfString.getBytes()));
1503+
final DocumentTraversal traversal = (DocumentTraversal) doc;
1504+
final NodeIterator iterator = traversal.createNodeIterator(doc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true);
1505+
for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) {
1506+
final Element e = (Element) n;
1507+
if ("NetworkSection".equals(e.getTagName())) {
1508+
if (e.getParentNode() != null) {
1509+
e.getParentNode().removeChild(e);
1510+
}
1511+
} else if ("rasd:Connection".equals(e.getTagName())) {
1512+
if (e.getParentNode() != null && e.getParentNode().getParentNode() != null) {
1513+
e.getParentNode().getParentNode().removeChild(e.getParentNode());
1514+
}
1515+
}
1516+
}
1517+
final DOMSource domSource = new DOMSource(doc);
1518+
final StringWriter writer = new StringWriter();
1519+
final StreamResult result = new StreamResult(writer);
1520+
final TransformerFactory tf = TransformerFactory.newInstance();
1521+
final Transformer transformer = tf.newTransformer();
1522+
transformer.transform(domSource, result);
1523+
return writer.toString();
1524+
} catch (SAXException | IOException | ParserConfigurationException | TransformerException e) {
1525+
s_logger.warn("Unexpected exception caught while removing network elements from OVF:", e);
1526+
}
1527+
return ovfString;
1528+
}
1529+
14801530
public static void importVmFromOVF(VmwareHypervisorHost host, String ovfFilePath, String vmName, DatastoreMO dsMo, String diskOption, ManagedObjectReference morRp,
14811531
ManagedObjectReference morHost) throws Exception {
14821532

@@ -1488,9 +1538,9 @@ public static void importVmFromOVF(VmwareHypervisorHost host, String ovfFilePath
14881538
importSpecParams.setEntityName(vmName);
14891539
importSpecParams.setDeploymentOption("");
14901540
importSpecParams.setDiskProvisioning(diskOption); // diskOption: thin, thick, etc
1491-
//importSpecParams.setPropertyMapping(null);
14921541

1493-
String ovfDescriptor = HttpNfcLeaseMO.readOvfContent(ovfFilePath);
1542+
String ovfDescriptor = removeOVFNetwork(HttpNfcLeaseMO.readOvfContent(ovfFilePath));
1543+
14941544
VmwareContext context = host.getContext();
14951545
OvfCreateImportSpecResult ovfImportResult =
14961546
context.getService().createImportSpec(context.getServiceContent().getOvfManager(), ovfDescriptor, morRp, dsMo.getMor(), importSpecParams);

0 commit comments

Comments
 (0)