You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2012/07/31 22:40:02 UTC

[26/50] [abbrv] Move KVM related code into plugins/hypervisor/kvm, a new jar file is created: cloud-kvm.jar

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtConnection.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtConnection.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtConnection.java
new file mode 100644
index 0000000..981d343
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtConnection.java
@@ -0,0 +1,48 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+import org.apache.log4j.Logger;
+import org.libvirt.Connect;
+import org.libvirt.LibvirtException;
+
+public class LibvirtConnection {
+    private static final Logger s_logger = Logger
+            .getLogger(LibvirtConnection.class);
+    static private Connect _connection;
+    static private String _hypervisorURI;
+
+    static public Connect getConnection() throws LibvirtException {
+        if (_connection == null) {
+            _connection = new Connect(_hypervisorURI, false);
+        } else {
+            try {
+                _connection.getVersion();
+            } catch (LibvirtException e) {
+                s_logger.debug("Connection with libvirtd is broken, due to "
+                        + e.getMessage());
+                _connection = new Connect(_hypervisorURI, false);
+            }
+        }
+
+        return _connection;
+    }
+
+    static void initialize(String hypervisorURI) {
+        _hypervisorURI = hypervisorURI;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
new file mode 100644
index 0000000..55fbfaa
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java
@@ -0,0 +1,250 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef;
+import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef;
+import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef.nicModel;
+
+/**
+ * @author chiradeep
+ * 
+ */
+public class LibvirtDomainXMLParser {
+    private static final Logger s_logger = Logger
+            .getLogger(LibvirtDomainXMLParser.class);
+    private final List<InterfaceDef> interfaces = new ArrayList<InterfaceDef>();
+    private final List<DiskDef> diskDefs = new ArrayList<DiskDef>();
+    private Integer vncPort;
+    private String desc;
+
+    public boolean parseDomainXML(String domXML) {
+        DocumentBuilder builder;
+        try {
+            builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+
+            InputSource is = new InputSource();
+            is.setCharacterStream(new StringReader(domXML));
+            Document doc = builder.parse(is);
+
+            Element rootElement = doc.getDocumentElement();
+
+            desc = getTagValue("description", rootElement);
+
+            Element devices = (Element) rootElement.getElementsByTagName(
+                    "devices").item(0);
+            NodeList disks = devices.getElementsByTagName("disk");
+            for (int i = 0; i < disks.getLength(); i++) {
+                Element disk = (Element) disks.item(i);
+                String diskFmtType = getAttrValue("driver", "type", disk);
+                String diskFile = getAttrValue("source", "file", disk);
+                String diskDev = getAttrValue("source", "dev", disk);
+
+                String diskLabel = getAttrValue("target", "dev", disk);
+                String bus = getAttrValue("target", "bus", disk);
+                String type = disk.getAttribute("type");
+                String device = disk.getAttribute("device");
+
+                DiskDef def = new DiskDef();
+                if (type.equalsIgnoreCase("file")) {
+                    if (device.equalsIgnoreCase("disk")) {
+                        DiskDef.diskFmtType fmt = null;
+                        if (diskFmtType != null) {
+                            fmt = DiskDef.diskFmtType.valueOf(diskFmtType
+                                    .toUpperCase());
+                        }
+                        def.defFileBasedDisk(diskFile, diskLabel,
+                                DiskDef.diskBus.valueOf(bus.toUpperCase()), fmt);
+                    } else if (device.equalsIgnoreCase("cdrom")) {
+                        def.defISODisk(diskFile);
+                    }
+                } else if (type.equalsIgnoreCase("block")) {
+                    def.defBlockBasedDisk(diskDev, diskLabel,
+                            DiskDef.diskBus.valueOf(bus.toUpperCase()));
+                }
+                diskDefs.add(def);
+            }
+
+            NodeList nics = devices.getElementsByTagName("interface");
+            for (int i = 0; i < nics.getLength(); i++) {
+                Element nic = (Element) nics.item(i);
+
+                String type = nic.getAttribute("type");
+                String mac = getAttrValue("mac", "address", nic);
+                String dev = getAttrValue("target", "dev", nic);
+                String model = getAttrValue("model", "type", nic);
+                InterfaceDef def = new InterfaceDef();
+
+                if (type.equalsIgnoreCase("network")) {
+                    String network = getAttrValue("source", "network", nic);
+                    def.defPrivateNet(network, dev, mac,
+                            nicModel.valueOf(model.toUpperCase()));
+                } else if (type.equalsIgnoreCase("bridge")) {
+                    String bridge = getAttrValue("source", "bridge", nic);
+                    def.defBridgeNet(bridge, dev, mac,
+                            nicModel.valueOf(model.toUpperCase()));
+                }
+                interfaces.add(def);
+            }
+
+            Element graphic = (Element) devices
+                    .getElementsByTagName("graphics").item(0);
+            String port = graphic.getAttribute("port");
+            if (port != null) {
+                try {
+                    vncPort = Integer.parseInt(port);
+                    if (vncPort != -1) {
+                        vncPort = vncPort - 5900;
+                    } else {
+                        vncPort = null;
+                    }
+                } catch (NumberFormatException nfe) {
+                    vncPort = null;
+                }
+            }
+
+            return true;
+        } catch (ParserConfigurationException e) {
+            s_logger.debug(e.toString());
+        } catch (SAXException e) {
+            s_logger.debug(e.toString());
+        } catch (IOException e) {
+            s_logger.debug(e.toString());
+        }
+        return false;
+    }
+
+    private static String getTagValue(String tag, Element eElement) {
+        NodeList tagNodeList = eElement.getElementsByTagName(tag);
+        if (tagNodeList == null || tagNodeList.getLength() == 0) {
+            return null;
+        }
+
+        NodeList nlList = tagNodeList.item(0).getChildNodes();
+
+        Node nValue = (Node) nlList.item(0);
+
+        return nValue.getNodeValue();
+    }
+
+    private static String getAttrValue(String tag, String attr, Element eElement) {
+        NodeList tagNode = eElement.getElementsByTagName(tag);
+        if (tagNode.getLength() == 0) {
+            return null;
+        }
+        Element node = (Element) tagNode.item(0);
+        return node.getAttribute(attr);
+    }
+
+    public Integer getVncPort() {
+        return vncPort;
+    }
+
+    public List<InterfaceDef> getInterfaces() {
+        return interfaces;
+    }
+
+    public List<DiskDef> getDisks() {
+        return diskDefs;
+    }
+
+    public String getDescription() {
+        return desc;
+    }
+
+    public static void main(String[] args) {
+        LibvirtDomainXMLParser parser = new LibvirtDomainXMLParser();
+        parser.parseDomainXML("<domain type='kvm' id='12'>"
+                + "<name>r-6-CV-5002-1</name>"
+                + "<uuid>581b5a4b-b496-8d4d-e44e-a7dcbe9df0b5</uuid>"
+                + "<description>testVM</description>"
+                + "<memory>131072</memory>"
+                + "<currentMemory>131072</currentMemory>"
+                + "<vcpu>1</vcpu>"
+                + "<os>"
+                + "<type arch='i686' machine='pc-0.11'>hvm</type>"
+                + "<kernel>/var/lib/libvirt/qemu/vmlinuz-2.6.31.6-166.fc12.i686</kernel>"
+                + "<cmdline>ro root=/dev/sda1 acpi=force selinux=0 eth0ip=10.1.1.1 eth0mask=255.255.255.0 eth2ip=192.168.10.152 eth2mask=255.255.255.0 gateway=192.168.10.1 dns1=72.52.126.11 dns2=72.52.126.12 domain=v4.myvm.com</cmdline>"
+                + "<boot dev='hd'/>"
+                + "</os>"
+                + "<features>"
+                + "<acpi/>"
+                + "<pae/>"
+                + "</features>"
+                + "<clock offset='utc'/>"
+                + "<on_poweroff>destroy</on_poweroff>"
+                + "<on_reboot>restart</on_reboot>"
+                + "<on_crash>destroy</on_crash>"
+                + "<devices>"
+                + "<emulator>/usr/bin/qemu-kvm</emulator>"
+                + "<disk type='file' device='disk'>"
+                + "<driver name='qemu' type='raw'/>"
+                + "<source file='/mnt/tank//vmops/CV/vm/u000004/r000006/rootdisk'/>"
+                + "<target dev='hda' bus='ide'/>" + "</disk>"
+                + "<interface type='bridge'>"
+                + "<mac address='02:00:50:02:00:01'/>"
+                + "<source bridge='vnbr5002'/>" + "<target dev='vtap5002'/>"
+                + "<model type='e1000'/>" + "</interface>"
+                + "<interface type='network'>"
+                + "<mac address='00:16:3e:77:e2:a1'/>"
+                + "<source network='vmops-private'/>" + "<target dev='vnet3'/>"
+                + "<model type='e1000'/>" + "</interface>"
+                + "<interface type='bridge'>"
+                + "<mac address='06:85:00:00:00:04'/>"
+                + "<source bridge='br0'/>" + "<target dev='tap5002'/>"
+                + "<model type='e1000'/>" + "</interface>"
+                + "<input type='mouse' bus='ps2'/>"
+                + "<graphics type='vnc' port='6031' autoport='no' listen=''/>"
+                + "<video>" + "<model type='cirrus' vram='9216' heads='1'/>"
+                + "</video>" + "</devices>" + "</domain>"
+
+        );
+        for (InterfaceDef intf : parser.getInterfaces()) {
+            System.out.println(intf);
+        }
+        for (DiskDef disk : parser.getDisks()) {
+            System.out.println(disk);
+        }
+        System.out.println(parser.getVncPort());
+        System.out.println(parser.getDescription());
+
+        List<String> test = new ArrayList<String>(1);
+        test.add("1");
+        test.add("2");
+        if (test.contains("1")) {
+            System.out.print("fdf");
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtNetworkDef.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtNetworkDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtNetworkDef.java
new file mode 100644
index 0000000..6df3bd1
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtNetworkDef.java
@@ -0,0 +1,193 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class LibvirtNetworkDef {
+    enum netType {
+        BRIDGE, NAT, LOCAL
+    }
+
+    private final String _networkName;
+    private final String _uuid;
+    private netType _networkType;
+    private String _brName;
+    private boolean _stp;
+    private int _delay;
+    private String _fwDev;
+    private final String _domainName;
+    private String _brIPAddr;
+    private String _brNetMask;
+    private final List<IPRange> ipranges = new ArrayList<IPRange>();
+    private final List<dhcpMapping> dhcpMaps = new ArrayList<dhcpMapping>();
+
+    public static class dhcpMapping {
+        String _mac;
+        String _name;
+        String _ip;
+
+        public dhcpMapping(String mac, String name, String ip) {
+            _mac = mac;
+            _name = name;
+            _ip = ip;
+        }
+    }
+
+    public static class IPRange {
+        String _start;
+        String _end;
+
+        public IPRange(String start, String end) {
+            _start = start;
+            _end = end;
+        }
+    }
+
+    public LibvirtNetworkDef(String netName, String uuid, String domName) {
+        _networkName = netName;
+        _uuid = uuid;
+        _domainName = domName;
+    }
+
+    public void defNATNetwork(String brName, boolean stp, int delay,
+            String fwNic, String ipAddr, String netMask) {
+        _networkType = netType.NAT;
+        _brName = brName;
+        _stp = stp;
+        _delay = delay;
+        _fwDev = fwNic;
+        _brIPAddr = ipAddr;
+        _brNetMask = netMask;
+    }
+
+    public void defBrNetwork(String brName, boolean stp, int delay,
+            String fwNic, String ipAddr, String netMask) {
+        _networkType = netType.BRIDGE;
+        _brName = brName;
+        _stp = stp;
+        _delay = delay;
+        _fwDev = fwNic;
+        _brIPAddr = ipAddr;
+        _brNetMask = netMask;
+    }
+
+    public void defLocalNetwork(String brName, boolean stp, int delay,
+            String ipAddr, String netMask) {
+        _networkType = netType.LOCAL;
+        _brName = brName;
+        _stp = stp;
+        _delay = delay;
+        _brIPAddr = ipAddr;
+        _brNetMask = netMask;
+    }
+
+    public void adddhcpIPRange(String start, String end) {
+        IPRange ipr = new IPRange(start, end);
+        ipranges.add(ipr);
+    }
+
+    public void adddhcpMapping(String mac, String host, String ip) {
+        dhcpMapping map = new dhcpMapping(mac, host, ip);
+        dhcpMaps.add(map);
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder netBuilder = new StringBuilder();
+        netBuilder.append("<network>\n");
+        netBuilder.append("<name>" + _networkName + "</name>\n");
+        if (_uuid != null)
+            netBuilder.append("<uuid>" + _uuid + "</uuid>\n");
+        if (_brName != null) {
+            netBuilder.append("<bridge name='" + _brName + "'");
+            if (_stp) {
+                netBuilder.append(" stp='on'");
+            } else {
+                netBuilder.append(" stp='off'");
+            }
+            if (_delay != -1) {
+                netBuilder.append(" delay='" + _delay + "'");
+            }
+            netBuilder.append("/>\n");
+        }
+        if (_domainName != null) {
+            netBuilder.append("<domain name='" + _domainName + "'/>\n");
+        }
+        if (_networkType == netType.BRIDGE) {
+            netBuilder.append("<forward mode='route'");
+            if (_fwDev != null) {
+                netBuilder.append(" dev='" + _fwDev + "'");
+            }
+            netBuilder.append("/>\n");
+        } else if (_networkType == netType.NAT) {
+            netBuilder.append("<forward mode='nat'");
+            if (_fwDev != null) {
+                netBuilder.append(" dev='" + _fwDev + "'");
+            }
+            netBuilder.append("/>\n");
+        }
+        if (_brIPAddr != null || _brNetMask != null || !ipranges.isEmpty()
+                || !dhcpMaps.isEmpty()) {
+            netBuilder.append("<ip");
+            if (_brIPAddr != null)
+                netBuilder.append(" address='" + _brIPAddr + "'");
+            if (_brNetMask != null) {
+                netBuilder.append(" netmask='" + _brNetMask + "'");
+            }
+            netBuilder.append(">\n");
+
+            if (!ipranges.isEmpty() || !dhcpMaps.isEmpty()) {
+                netBuilder.append("<dhcp>\n");
+                for (IPRange ip : ipranges) {
+                    netBuilder.append("<range start='" + ip._start + "'"
+                            + " end='" + ip._end + "'/>\n");
+                }
+                for (dhcpMapping map : dhcpMaps) {
+                    netBuilder.append("<host mac='" + map._mac + "' name='"
+                            + map._name + "' ip='" + map._ip + "'/>\n");
+                }
+                netBuilder.append("</dhcp>\n");
+            }
+            netBuilder.append("</ip>\n");
+        }
+        netBuilder.append("</network>\n");
+        return netBuilder.toString();
+    }
+
+    /**
+     * @param args
+     */
+    public static void main(String[] args) {
+        LibvirtNetworkDef net = new LibvirtNetworkDef("cloudPrivate", null,
+                "cloud.com");
+        net.defNATNetwork("cloudbr0", false, 0, null, "192.168.168.1",
+                "255.255.255.0");
+        net.adddhcpIPRange("192.168.168.100", "192.168.168.220");
+        net.adddhcpIPRange("192.168.168.10", "192.168.168.50");
+        net.adddhcpMapping("branch0.cloud.com", "00:16:3e:77:e2:ed",
+                "192.168.168.100");
+        net.adddhcpMapping("branch1.cloud.com", "00:16:3e:77:e2:ef",
+                "192.168.168.101");
+        net.adddhcpMapping("branch2.cloud.com", "00:16:3e:77:e2:f0",
+                "192.168.168.102");
+        System.out.println(net.toString());
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtSecretDef.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtSecretDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtSecretDef.java
new file mode 100644
index 0000000..454dbf3
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtSecretDef.java
@@ -0,0 +1,106 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+public class LibvirtSecretDef {
+
+	public enum usage {
+		VOLUME("volume"), CEPH("ceph");
+		String _usage;
+
+		usage(String usage) {
+			_usage = usage;
+		}
+
+		@Override
+		public String toString() {
+			return _usage;
+		}
+	}
+
+	private usage _usage;
+	private boolean _ephemeral;
+	private boolean _private;
+	private String _uuid;
+	private String _description;
+	private String _cephName;
+	private String _volumeVolume;
+
+	public LibvirtSecretDef (usage usage, String uuid) {
+		_usage = usage;
+		_uuid = uuid;
+	}
+
+	public LibvirtSecretDef (usage usage, String uuid, String description) {
+		_usage = usage;
+		_uuid = uuid;
+		_description = description;
+	}
+
+	public boolean getEphemeral() {
+		return _ephemeral;
+	}
+
+	public boolean getPrivate() {
+		return _private;
+	}
+
+	public String getUuid() {
+		return _uuid;
+	}
+
+	public String getDescription() {
+		return _description;
+	}
+
+	public String getVolumeVolume() {
+		return _volumeVolume;
+	}
+
+	public String getCephName() {
+		return _cephName;
+	}
+
+	public void setVolumeVolume(String volume) {
+		_volumeVolume = volume;
+	}
+
+	public void setCephName(String name) {
+		_cephName = name;
+	}
+
+	@Override
+	public String toString() {
+		StringBuilder secretBuilder = new StringBuilder();
+		secretBuilder.append("<secret ephemeral='" + (_ephemeral ? "yes" : "no") + "' private='" + (_private ? "yes" : "no") + "'>\n");
+		secretBuilder.append("<uuid>" + _uuid + "</uuid>\n");
+		if (_description != null) {
+			secretBuilder.append("<description>" + _description + "</description>\n");
+		}
+		secretBuilder.append("<usage type='" + _usage + "'>\n");
+		if (_usage == _usage.VOLUME) {
+			secretBuilder.append("<volume>" + _volumeVolume + "</volume>\n");
+		}
+		if (_usage == _usage.CEPH) {
+			secretBuilder.append("<name>" + _cephName + "</name>\n");
+		}
+		secretBuilder.append("</usage>\n");
+		secretBuilder.append("</secret>\n");
+		return secretBuilder.toString();
+	}
+	
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDef.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDef.java
new file mode 100644
index 0000000..e181cea
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolDef.java
@@ -0,0 +1,162 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+public class LibvirtStoragePoolDef {
+    public enum poolType {
+        ISCSI("iscsi"), NETFS("netfs"), LOGICAL("logical"), DIR("dir"), RBD("rbd");
+        String _poolType;
+
+        poolType(String poolType) {
+            _poolType = poolType;
+        }
+
+        @Override
+        public String toString() {
+            return _poolType;
+        }
+    }
+
+    public enum authType {
+        CHAP("chap"), CEPH("ceph");
+        String _authType;
+
+        authType(String authType) {
+            _authType = authType;
+        }
+
+        @Override
+        public String toString() {
+            return _authType;
+        }
+    }
+
+    private poolType _poolType;
+    private String _poolName;
+    private String _uuid;
+    private String _sourceHost;
+    private int _sourcePort;
+    private String _sourceDir;
+    private String _targetPath;
+    private String _authUsername;
+    private authType _authType;
+    private String _secretUuid;
+
+    public LibvirtStoragePoolDef(poolType type, String poolName, String uuid,
+            String host, int port, String dir, String targetPath) {
+        _poolType = type;
+        _poolName = poolName;
+        _uuid = uuid;
+        _sourceHost = host;
+        _sourcePort = port;
+        _sourceDir = dir;
+        _targetPath = targetPath;
+    }
+
+    public LibvirtStoragePoolDef(poolType type, String poolName, String uuid,
+            String host, String dir, String targetPath) {
+        _poolType = type;
+        _poolName = poolName;
+        _uuid = uuid;
+        _sourceHost = host;
+        _sourceDir = dir;
+        _targetPath = targetPath;
+    }
+
+    public LibvirtStoragePoolDef(poolType type, String poolName, String uuid,
+            String sourceHost, int sourcePort, String dir, String authUsername,
+            authType authType, String secretUuid) {
+        _poolType = type;
+        _poolName = poolName;
+        _uuid = uuid;
+        _sourceHost = sourceHost;
+        _sourcePort = sourcePort;
+        _sourceDir = dir;
+        _authUsername = authUsername;
+        _authType = authType;
+        _secretUuid = secretUuid;
+    }
+
+    public String getPoolName() {
+        return _poolName;
+    }
+
+    public poolType getPoolType() {
+        return _poolType;
+    }
+
+    public String getSourceHost() {
+        return _sourceHost;
+    }
+
+    public int getSourcePort() {
+        return _sourcePort;
+    }
+
+    public String getSourceDir() {
+        return _sourceDir;
+    }
+
+    public String getTargetPath() {
+        return _targetPath;
+    }
+
+    public String getAuthUserName() {
+        return _authUsername;
+    }
+
+    public String getSecretUUID() {
+        return _secretUuid;
+    }
+
+    public authType getAuthType() {
+        return _authType;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder storagePoolBuilder = new StringBuilder();
+        storagePoolBuilder.append("<pool type='" + _poolType + "'>\n");
+        storagePoolBuilder.append("<name>" + _poolName + "</name>\n");
+        if (_uuid != null)
+            storagePoolBuilder.append("<uuid>" + _uuid + "</uuid>\n");
+        if (_poolType == poolType.NETFS) {
+            storagePoolBuilder.append("<source>\n");
+            storagePoolBuilder.append("<host name='" + _sourceHost + "'/>\n");
+            storagePoolBuilder.append("<dir path='" + _sourceDir + "'/>\n");
+            storagePoolBuilder.append("</source>\n");
+        }
+        if (_poolType == poolType.RBD) {
+            storagePoolBuilder.append("<source>\n");
+            storagePoolBuilder.append("<host name='" + _sourceHost + "' port='" + _sourcePort + "'/>\n");
+            storagePoolBuilder.append("<name>" + _sourceDir + "</name>\n");
+            if (_authUsername != null) {
+                storagePoolBuilder.append("<auth username='" + _authUsername + "' type='" + _authType + "'>\n");
+                storagePoolBuilder.append("<secret uuid='" + _secretUuid + "'/>\n");
+                storagePoolBuilder.append("</auth>\n");
+            }
+            storagePoolBuilder.append("</source>\n");
+        }
+        if (_poolType != poolType.RBD) {
+            storagePoolBuilder.append("<target>\n");
+            storagePoolBuilder.append("<path>" + _targetPath + "</path>\n");
+            storagePoolBuilder.append("</target>\n");
+        }
+        storagePoolBuilder.append("</pool>\n");
+        return storagePoolBuilder.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolXMLParser.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolXMLParser.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolXMLParser.java
new file mode 100644
index 0000000..a349d5e
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStoragePoolXMLParser.java
@@ -0,0 +1,128 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+import java.io.IOException;
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.*;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+public class LibvirtStoragePoolXMLParser {
+    private static final Logger s_logger = Logger
+            .getLogger(LibvirtStoragePoolXMLParser.class);
+
+    public LibvirtStoragePoolDef parseStoragePoolXML(String poolXML) {
+        DocumentBuilder builder;
+        try {
+            builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+
+            InputSource is = new InputSource();
+            is.setCharacterStream(new StringReader(poolXML));
+            Document doc = builder.parse(is);
+
+            Element rootElement = doc.getDocumentElement();
+            String type = rootElement.getAttribute("type");
+
+            String uuid = getTagValue("uuid", rootElement);
+
+            String poolName = getTagValue("name", rootElement);
+
+            Element source = (Element) rootElement.getElementsByTagName(
+                    "source").item(0);
+            String host = getAttrValue("host", "name", source);
+
+            if (type.equalsIgnoreCase("rbd")) {
+                int port = Integer.parseInt(getAttrValue("host", "port", source));
+                String pool = getTagValue("name", source);
+
+                Element auth = (Element) source.getElementsByTagName(
+                    "auth").item(0);
+
+                if (auth != null) {
+                    String authUsername = auth.getAttribute("username");
+                    String authType = auth.getAttribute("type");
+                    return new LibvirtStoragePoolDef(LibvirtStoragePoolDef.poolType.valueOf(type.toUpperCase()),
+                        poolName, uuid, host, port, pool, authUsername, LibvirtStoragePoolDef.authType.valueOf(authType.toUpperCase()), uuid);
+                } else {
+                    return new LibvirtStoragePoolDef(LibvirtStoragePoolDef.poolType.valueOf(type.toUpperCase()),
+                        poolName, uuid, host, port, pool, "");
+                }
+            } else {
+                String path = getAttrValue("dir", "path", source);
+
+                Element target = (Element) rootElement.getElementsByTagName(
+                        "target").item(0);
+                String targetPath = getTagValue("path", target);
+
+                return new LibvirtStoragePoolDef(
+                        LibvirtStoragePoolDef.poolType.valueOf(type.toUpperCase()),
+                        poolName, uuid, host, path, targetPath);
+            }
+        } catch (ParserConfigurationException e) {
+            s_logger.debug(e.toString());
+        } catch (SAXException e) {
+            s_logger.debug(e.toString());
+        } catch (IOException e) {
+            s_logger.debug(e.toString());
+        }
+        return null;
+    }
+
+    private static String getTagValue(String tag, Element eElement) {
+        NodeList nlList = eElement.getElementsByTagName(tag).item(0)
+                .getChildNodes();
+        Node nValue = (Node) nlList.item(0);
+
+        return nValue.getNodeValue();
+    }
+
+    private static String getAttrValue(String tag, String attr, Element eElement) {
+        NodeList tagNode = eElement.getElementsByTagName(tag);
+        if (tagNode.getLength() == 0) {
+            return null;
+        }
+        Element node = (Element) tagNode.item(0);
+        return node.getAttribute(attr);
+    }
+
+    public static void main(String[] args) {
+        s_logger.addAppender(new org.apache.log4j.ConsoleAppender(
+                new org.apache.log4j.PatternLayout(), "System.out"));
+        String storagePool = "<pool type='dir'>" + "<name>test</name>"
+                + "<uuid>bf723c83-4b95-259c-7089-60776e61a11f</uuid>"
+                + "<capacity>20314165248</capacity>"
+                + "<allocation>1955450880</allocation>"
+                + "<available>18358714368</available>" + "<source>"
+                + "<host name='nfs1.lab.vmops.com'/>"
+                + "<dir path='/export/home/edison/kvm/primary'/>"
+                + "<format type='auto'/>" + "</source>" + "<target>"
+                + "<path>/media</path>" + "<permissions>" + "<mode>0700</mode>"
+                + "<owner>0</owner>" + "<group>0</group>" + "</permissions>"
+                + "</target>" + "</pool>";
+
+        LibvirtStoragePoolXMLParser parser = new LibvirtStoragePoolXMLParser();
+        LibvirtStoragePoolDef pool = parser.parseStoragePoolXML(storagePool);
+        s_logger.debug(pool.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeDef.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeDef.java
new file mode 100644
index 0000000..d5cd91a
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeDef.java
@@ -0,0 +1,91 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+public class LibvirtStorageVolumeDef {
+    public enum volFormat {
+        RAW("raw"), QCOW2("qcow2"), DIR("dir");
+        private String _format;
+
+        volFormat(String format) {
+            _format = format;
+        }
+
+        @Override
+        public String toString() {
+            return _format;
+        }
+
+        public static volFormat getFormat(String format) {
+            if (format == null) {
+                return null;
+            }
+            if (format.equalsIgnoreCase("raw")) {
+                return RAW;
+            } else if (format.equalsIgnoreCase("qcow2")) {
+                return QCOW2;
+            }
+            return null;
+        }
+    }
+
+    private String _volName;
+    private Long _volSize;
+    private volFormat _volFormat;
+    private String _backingPath;
+    private volFormat _backingFormat;
+
+    public LibvirtStorageVolumeDef(String volName, Long size, volFormat format,
+            String tmplPath, volFormat tmplFormat) {
+        _volName = volName;
+        _volSize = size;
+        _volFormat = format;
+        _backingPath = tmplPath;
+        _backingFormat = tmplFormat;
+    }
+
+    public volFormat getFormat() {
+        return this._volFormat;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder storageVolBuilder = new StringBuilder();
+        storageVolBuilder.append("<volume>\n");
+        storageVolBuilder.append("<name>" + _volName + "</name>\n");
+        if (_volSize != null) {
+            storageVolBuilder
+                    .append("<capacity >" + _volSize + "</capacity>\n");
+        }
+        storageVolBuilder.append("<target>\n");
+        storageVolBuilder.append("<format type='" + _volFormat + "'/>\n");
+        storageVolBuilder.append("<permissions>");
+        storageVolBuilder.append("<mode>0744</mode>");
+        storageVolBuilder.append("</permissions>");
+        storageVolBuilder.append("</target>\n");
+        if (_backingPath != null) {
+            storageVolBuilder.append("<backingStore>\n");
+            storageVolBuilder.append("<path>" + _backingPath + "</path>\n");
+            storageVolBuilder.append("<format type='" + _backingFormat
+                    + "'/>\n");
+            storageVolBuilder.append("</backingStore>\n");
+        }
+        storageVolBuilder.append("</volume>\n");
+        return storageVolBuilder.toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeXMLParser.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeXMLParser.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeXMLParser.java
new file mode 100644
index 0000000..3a4d94b
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtStorageVolumeXMLParser.java
@@ -0,0 +1,104 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+import java.io.IOException;
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+public class LibvirtStorageVolumeXMLParser {
+    private static final Logger s_logger = Logger
+            .getLogger(LibvirtStorageVolumeXMLParser.class);
+
+    public LibvirtStorageVolumeDef parseStorageVolumeXML(String volXML) {
+        DocumentBuilder builder;
+        try {
+            builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+
+            InputSource is = new InputSource();
+            is.setCharacterStream(new StringReader(volXML));
+            Document doc = builder.parse(is);
+
+            Element rootElement = doc.getDocumentElement();
+
+            String VolName = getTagValue("name", rootElement);
+            Element target = (Element) rootElement.getElementsByTagName(
+                    "target").item(0);
+            String format = getAttrValue("type", "format", target);
+            Long capacity = Long
+                    .parseLong(getTagValue("capacity", rootElement));
+            return new LibvirtStorageVolumeDef(VolName, capacity,
+                    LibvirtStorageVolumeDef.volFormat.getFormat(format), null,
+                    null);
+        } catch (ParserConfigurationException e) {
+            s_logger.debug(e.toString());
+        } catch (SAXException e) {
+            s_logger.debug(e.toString());
+        } catch (IOException e) {
+            s_logger.debug(e.toString());
+        }
+        return null;
+    }
+
+    private static String getTagValue(String tag, Element eElement) {
+        NodeList nlList = eElement.getElementsByTagName(tag).item(0)
+                .getChildNodes();
+        Node nValue = (Node) nlList.item(0);
+
+        return nValue.getNodeValue();
+    }
+
+    private static String getAttrValue(String tag, String attr, Element eElement) {
+        NodeList tagNode = eElement.getElementsByTagName(tag);
+        if (tagNode.getLength() == 0) {
+            return null;
+        }
+        Element node = (Element) tagNode.item(0);
+        return node.getAttribute(attr);
+    }
+
+    public static void main(String[] args) {
+        s_logger.addAppender(new org.apache.log4j.ConsoleAppender(
+                new org.apache.log4j.PatternLayout(), "System.out"));
+        String storagePool = "<pool type='dir'>" + "<name>test</name>"
+                + "<uuid>bf723c83-4b95-259c-7089-60776e61a11f</uuid>"
+                + "<capacity>20314165248</capacity>"
+                + "<allocation>1955450880</allocation>"
+                + "<available>18358714368</available>" + "<source>"
+                + "<host name='nfs1.lab.vmops.com'/>"
+                + "<dir path='/export/home/edison/kvm/primary'/>"
+                + "<format type='auto'/>" + "</source>" + "<target>"
+                + "<path>/media</path>" + "<permissions>" + "<mode>0700</mode>"
+                + "<owner>0</owner>" + "<group>0</group>" + "</permissions>"
+                + "</target>" + "</pool>";
+
+        LibvirtStoragePoolXMLParser parser = new LibvirtStoragePoolXMLParser();
+        LibvirtStoragePoolDef pool = parser.parseStoragePoolXML(storagePool);
+        s_logger.debug(pool.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
new file mode 100644
index 0000000..998f393
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java
@@ -0,0 +1,963 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+public class LibvirtVMDef {
+    private String _hvsType;
+    private String _domName;
+    private String _domUUID;
+    private String _desc;
+    private final Map<String, Object> components = new HashMap<String, Object>();
+
+    public static class GuestDef {
+        enum guestType {
+            KVM, XEN, EXE
+        }
+
+        enum bootOrder {
+            HARDISK("hd"), CDROM("cdrom"), FLOOPY("fd"), NETWORK("network");
+            String _order;
+
+            bootOrder(String order) {
+                _order = order;
+            }
+
+            @Override
+            public String toString() {
+                return _order;
+            }
+        }
+
+        private guestType _type;
+        private String _arch;
+        private String _loader;
+        private String _kernel;
+        private String _initrd;
+        private String _root;
+        private String _cmdline;
+        private List<bootOrder> _bootdevs = new ArrayList<bootOrder>();
+        private String _machine;
+
+        public void setGuestType(guestType type) {
+            _type = type;
+        }
+
+        public void setGuestArch(String arch) {
+            _arch = arch;
+        }
+
+        public void setMachineType(String machine) {
+            _machine = machine;
+        }
+
+        public void setLoader(String loader) {
+            _loader = loader;
+        }
+
+        public void setBootKernel(String kernel, String initrd, String rootdev,
+                String cmdline) {
+            _kernel = kernel;
+            _initrd = initrd;
+            _root = rootdev;
+            _cmdline = cmdline;
+        }
+
+        public void setBootOrder(bootOrder order) {
+            _bootdevs.add(order);
+        }
+
+        @Override
+        public String toString() {
+            if (_type == guestType.KVM) {
+                StringBuilder guestDef = new StringBuilder();
+                guestDef.append("<os>\n");
+                guestDef.append("<type ");
+                if (_arch != null) {
+                    guestDef.append(" arch='" + _arch + "'");
+                }
+                if (_machine != null) {
+                    guestDef.append(" machine='" + _machine + "'");
+                }
+                guestDef.append(">hvm</type>\n");
+                if (!_bootdevs.isEmpty()) {
+                    for (bootOrder bo : _bootdevs) {
+                        guestDef.append("<boot dev='" + bo + "'/>\n");
+                    }
+                }
+                guestDef.append("</os>\n");
+                return guestDef.toString();
+            } else
+                return null;
+        }
+    }
+
+    public static class GuestResourceDef {
+        private long _mem;
+        private int _currentMem = -1;
+        private String _memBacking;
+        private int _vcpu = -1;
+
+        public void setMemorySize(long mem) {
+            _mem = mem;
+        }
+
+        public void setCurrentMem(int currMem) {
+            _currentMem = currMem;
+        }
+
+        public void setMemBacking(String memBacking) {
+            _memBacking = memBacking;
+        }
+
+        public void setVcpuNum(int vcpu) {
+            _vcpu = vcpu;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder resBuidler = new StringBuilder();
+            resBuidler.append("<memory>" + _mem + "</memory>\n");
+            if (_currentMem != -1) {
+                resBuidler.append("<currentMemory>" + _currentMem
+                        + "</currentMemory>\n");
+            }
+            if (_memBacking != null) {
+                resBuidler.append("<memoryBacking>" + "<" + _memBacking + "/>"
+                        + "</memoryBacking>\n");
+            }
+            if (_vcpu != -1) {
+                resBuidler.append("<vcpu>" + _vcpu + "</vcpu>\n");
+            }
+            return resBuidler.toString();
+        }
+    }
+
+    public static class FeaturesDef {
+        private final List<String> _features = new ArrayList<String>();
+
+        public void addFeatures(String feature) {
+            _features.add(feature);
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder feaBuilder = new StringBuilder();
+            feaBuilder.append("<features>\n");
+            for (String feature : _features) {
+                feaBuilder.append("<" + feature + "/>\n");
+            }
+            feaBuilder.append("</features>\n");
+            return feaBuilder.toString();
+        }
+    }
+
+    public static class TermPolicy {
+        private String _reboot;
+        private String _powerOff;
+        private String _crash;
+
+        public TermPolicy() {
+            _reboot = _powerOff = _crash = "destroy";
+        }
+
+        public void setRebootPolicy(String rbPolicy) {
+            _reboot = rbPolicy;
+        }
+
+        public void setPowerOffPolicy(String poPolicy) {
+            _powerOff = poPolicy;
+        }
+
+        public void setCrashPolicy(String crashPolicy) {
+            _crash = crashPolicy;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder term = new StringBuilder();
+            term.append("<on_reboot>" + _reboot + "</on_reboot>\n");
+            term.append("<on_poweroff>" + _powerOff + "</on_poweroff>\n");
+            term.append("<on_crash>" + _powerOff + "</on_crash>\n");
+            return term.toString();
+        }
+    }
+
+    public static class ClockDef {
+        public enum ClockOffset {
+            UTC("utc"), LOCALTIME("localtime"), TIMEZONE("timezone"), VARIABLE(
+                    "variable");
+
+            private String _offset;
+
+            private ClockOffset(String offset) {
+                _offset = offset;
+            }
+
+            @Override
+            public String toString() {
+                return _offset;
+            }
+        }
+
+        private ClockOffset _offset;
+        private String _timerName;
+        private String _tickPolicy;
+        private String _track;
+
+        public ClockDef() {
+            _offset = ClockOffset.UTC;
+        }
+
+        public void setClockOffset(ClockOffset offset) {
+            _offset = offset;
+        }
+
+        public void setTimer(String timerName, String tickPolicy, String track) {
+            _timerName = timerName;
+            _tickPolicy = tickPolicy;
+            _track = track;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder clockBuilder = new StringBuilder();
+            clockBuilder.append("<clock offset='");
+            clockBuilder.append(_offset.toString());
+            clockBuilder.append("'>\n");
+            if (_timerName != null) {
+                clockBuilder.append("<timer name='");
+                clockBuilder.append(_timerName);
+                clockBuilder.append("' ");
+
+                if (_tickPolicy != null) {
+                    clockBuilder.append("tickpolicy='");
+                    clockBuilder.append(_tickPolicy);
+                    clockBuilder.append("' ");
+                }
+
+                if (_track != null) {
+                    clockBuilder.append("track='");
+                    clockBuilder.append(_track);
+                    clockBuilder.append("' ");
+                }
+
+                clockBuilder.append(">\n");
+                clockBuilder.append("</timer>\n");
+            }
+            clockBuilder.append("</clock>\n");
+            return clockBuilder.toString();
+        }
+    }
+
+    public static class DevicesDef {
+        private String _emulator;
+        private final Map<String, List<?>> devices = new HashMap<String, List<?>>();
+
+        public boolean addDevice(Object device) {
+            Object dev = devices.get(device.getClass().toString());
+            if (dev == null) {
+                List<Object> devs = new ArrayList<Object>();
+                devs.add(device);
+                devices.put(device.getClass().toString(), devs);
+            } else {
+                List<Object> devs = (List<Object>) dev;
+                devs.add(device);
+            }
+            return true;
+        }
+
+        public void setEmulatorPath(String emulator) {
+            _emulator = emulator;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder devicesBuilder = new StringBuilder();
+            devicesBuilder.append("<devices>\n");
+            if (_emulator != null) {
+                devicesBuilder.append("<emulator>" + _emulator
+                        + "</emulator>\n");
+            }
+
+            for (List<?> devs : devices.values()) {
+                for (Object dev : devs) {
+                    devicesBuilder.append(dev.toString());
+                }
+            }
+            devicesBuilder.append("</devices>\n");
+            return devicesBuilder.toString();
+        }
+
+        @SuppressWarnings("unchecked")
+        public List<DiskDef> getDisks() {
+            return (List<DiskDef>) devices.get(DiskDef.class.toString());
+        }
+
+        @SuppressWarnings("unchecked")
+        public List<InterfaceDef> getInterfaces() {
+            return (List<InterfaceDef>) devices.get(InterfaceDef.class
+                    .toString());
+        }
+
+    }
+
+    public static class DiskDef {
+        enum deviceType {
+            FLOOPY("floopy"), DISK("disk"), CDROM("cdrom");
+            String _type;
+
+            deviceType(String type) {
+                _type = type;
+            }
+
+            @Override
+            public String toString() {
+                return _type;
+            }
+        }
+
+        enum diskType {
+            FILE("file"), BLOCK("block"), DIRECTROY("dir"), NETWORK("network");
+            String _diskType;
+
+            diskType(String type) {
+                _diskType = type;
+            }
+
+            @Override
+            public String toString() {
+                return _diskType;
+            }
+        }
+
+        enum diskProtocol {
+            RBD("rbd"), SHEEPDOG("sheepdog");
+            String _diskProtocol;
+
+            diskProtocol(String protocol) {
+                _diskProtocol = protocol;
+            }
+
+            @Override
+            public String toString() {
+                return _diskProtocol;
+            }
+        }
+
+        enum diskBus {
+            IDE("ide"), SCSI("scsi"), VIRTIO("virtio"), XEN("xen"), USB("usb"), UML(
+                    "uml"), FDC("fdc");
+            String _bus;
+
+            diskBus(String bus) {
+                _bus = bus;
+            }
+
+            @Override
+            public String toString() {
+                return _bus;
+            }
+        }
+
+        enum diskFmtType {
+            RAW("raw"), QCOW2("qcow2");
+            String _fmtType;
+
+            diskFmtType(String fmt) {
+                _fmtType = fmt;
+            }
+
+            @Override
+            public String toString() {
+                return _fmtType;
+            }
+        }
+
+        private deviceType _deviceType; /* floppy, disk, cdrom */
+        private diskType _diskType;
+        private diskProtocol _diskProtocol;
+        private String _sourcePath;
+        private String _sourceHost;
+        private int _sourcePort;
+        private String _authUserName;
+        private String _authSecretUUID;
+        private String _diskLabel;
+        private diskBus _bus;
+        private diskFmtType _diskFmtType; /* qcow2, raw etc. */
+        private boolean _readonly = false;
+        private boolean _shareable = false;
+        private boolean _deferAttach = false;
+
+        public void setDeviceType(deviceType deviceType) {
+            _deviceType = deviceType;
+        }
+
+        public void defFileBasedDisk(String filePath, String diskLabel,
+                diskBus bus, diskFmtType diskFmtType) {
+            _diskType = diskType.FILE;
+            _deviceType = deviceType.DISK;
+            _sourcePath = filePath;
+            _diskLabel = diskLabel;
+            _diskFmtType = diskFmtType;
+            _bus = bus;
+
+        }
+
+        /* skip iso label */
+        private String getDevLabel(int devId, diskBus bus) {
+            if (devId == 2) {
+                devId++;
+            }
+
+            char suffix = (char) ('a' + devId);
+            if (bus == diskBus.SCSI) {
+                return "sd" + suffix;
+            } else if (bus == diskBus.VIRTIO) {
+                return "vd" + suffix;
+            }
+            return "hd" + suffix;
+
+        }
+
+        public void defFileBasedDisk(String filePath, int devId, diskBus bus,
+                diskFmtType diskFmtType) {
+
+            _diskType = diskType.FILE;
+            _deviceType = deviceType.DISK;
+            _sourcePath = filePath;
+            _diskLabel = getDevLabel(devId, bus);
+            _diskFmtType = diskFmtType;
+            _bus = bus;
+
+        }
+
+        public void defISODisk(String volPath) {
+            _diskType = diskType.FILE;
+            _deviceType = deviceType.CDROM;
+            _sourcePath = volPath;
+            _diskLabel = "hdc";
+            _diskFmtType = diskFmtType.RAW;
+            _bus = diskBus.IDE;
+        }
+
+        public void defBlockBasedDisk(String diskName, int devId, diskBus bus) {
+            _diskType = diskType.BLOCK;
+            _deviceType = deviceType.DISK;
+            _diskFmtType = diskFmtType.RAW;
+            _sourcePath = diskName;
+            _diskLabel = getDevLabel(devId, bus);
+            _bus = bus;
+        }
+
+        public void defBlockBasedDisk(String diskName, String diskLabel,
+                diskBus bus) {
+            _diskType = diskType.BLOCK;
+            _deviceType = deviceType.DISK;
+            _diskFmtType = diskFmtType.RAW;
+            _sourcePath = diskName;
+            _diskLabel = diskLabel;
+            _bus = bus;
+        }
+
+        public void defNetworkBasedDisk(String diskName, String sourceHost, int sourcePort,
+                                        String authUserName, String authSecretUUID,
+                                        int devId, diskBus bus, diskProtocol protocol) {
+            _diskType = diskType.NETWORK;
+            _deviceType = deviceType.DISK;
+            _diskFmtType = diskFmtType.RAW;
+            _sourcePath = diskName;
+            _sourceHost = sourceHost;
+            _sourcePort = sourcePort;
+            _authUserName = authUserName;
+            _authSecretUUID = authSecretUUID;
+            _diskLabel = getDevLabel(devId, bus);
+            _bus = bus;
+            _diskProtocol = protocol;
+        }
+
+        public void defNetworkBasedDisk(String diskName, String sourceHost, int sourcePort,
+                                        String authUserName, String authSecretUUID,
+                                        String diskLabel, diskBus bus, diskProtocol protocol) {
+            _diskType = diskType.NETWORK;
+            _deviceType = deviceType.DISK;
+            _diskFmtType = diskFmtType.RAW;
+            _sourcePath = diskName;
+            _sourceHost = sourceHost;
+            _sourcePort = sourcePort;
+            _authUserName = authUserName;
+            _authSecretUUID = authSecretUUID;
+            _diskLabel = diskLabel;
+            _bus = bus;
+            _diskProtocol = protocol;
+        }
+
+        public void setReadonly() {
+            _readonly = true;
+        }
+
+        public void setSharable() {
+            _shareable = true;
+        }
+
+        public void setAttachDeferred(boolean deferAttach) {
+            _deferAttach = deferAttach;
+        }
+
+        public boolean isAttachDeferred() {
+            return _deferAttach;
+        }
+
+        public String getDiskPath() {
+            return _sourcePath;
+        }
+
+        public String getDiskLabel() {
+            return _diskLabel;
+        }
+
+        public deviceType getDeviceType() {
+            return _deviceType;
+        }
+
+        public void setDiskPath(String volPath) {
+            this._sourcePath = volPath;
+        }
+
+        public diskBus getBusType() {
+            return _bus;
+        }
+
+        public int getDiskSeq() {
+            char suffix = this._diskLabel.charAt(this._diskLabel.length() - 1);
+            return suffix - 'a';
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder diskBuilder = new StringBuilder();
+            diskBuilder.append("<disk ");
+            if (_deviceType != null) {
+                diskBuilder.append(" device='" + _deviceType + "'");
+            }
+            diskBuilder.append(" type='" + _diskType + "'");
+            diskBuilder.append(">\n");
+            diskBuilder.append("<driver name='qemu'" + " type='" + _diskFmtType
+                    + "' cache='none' " + "/>\n");
+            if (_diskType == diskType.FILE) {
+                diskBuilder.append("<source ");
+                if (_sourcePath != null) {
+                    diskBuilder.append("file='" + _sourcePath + "'");
+                } else if (_deviceType == deviceType.CDROM) {
+                    diskBuilder.append("file=''");
+                }
+                diskBuilder.append("/>\n");
+            } else if (_diskType == diskType.BLOCK) {
+                diskBuilder.append("<source");
+                if (_sourcePath != null) {
+                    diskBuilder.append(" dev='" + _sourcePath + "'");
+                }
+                diskBuilder.append("/>\n");
+            } else if (_diskType == diskType.NETWORK) {
+                diskBuilder.append("<source ");
+                diskBuilder.append(" protocol='" + _diskProtocol + "'");
+                diskBuilder.append(" name='" + _sourcePath + "'");
+                diskBuilder.append(">\n");
+                diskBuilder.append("<host name='" + _sourceHost + "' port='" + _sourcePort + "'/>\n");
+                diskBuilder.append("</source>\n");
+                if (_authUserName != null) {
+                    diskBuilder.append("<auth username='" + _authUserName + "'>\n");
+                    diskBuilder.append("<secret type='ceph' uuid='" + _authSecretUUID + "'/>\n");
+                    diskBuilder.append("</auth>\n");
+                }
+            }
+            diskBuilder.append("<target dev='" + _diskLabel + "'");
+            if (_bus != null) {
+                diskBuilder.append(" bus='" + _bus + "'");
+            }
+            diskBuilder.append("/>\n");
+            diskBuilder.append("</disk>\n");
+            return diskBuilder.toString();
+        }
+    }
+
+    public static class InterfaceDef {
+        enum guestNetType {
+            BRIDGE("bridge"), NETWORK("network"), USER("user"), ETHERNET(
+                    "ethernet"), INTERNAL("internal");
+            String _type;
+
+            guestNetType(String type) {
+                _type = type;
+            }
+
+            @Override
+            public String toString() {
+                return _type;
+            }
+        }
+
+        enum nicModel {
+            E1000("e1000"), VIRTIO("virtio"), RTL8139("rtl8139"), NE2KPCI(
+                    "ne2k_pci");
+            String _model;
+
+            nicModel(String model) {
+                _model = model;
+            }
+
+            @Override
+            public String toString() {
+                return _model;
+            }
+        }
+
+        enum hostNicType {
+            DIRECT_ATTACHED_WITHOUT_DHCP, DIRECT_ATTACHED_WITH_DHCP, VNET, VLAN;
+        }
+
+        private guestNetType _netType; /*
+                                         * bridge, ethernet, network, user,
+                                         * internal
+                                         */
+        private hostNicType _hostNetType; /* Only used by agent java code */
+        private String _sourceName;
+        private String _networkName;
+        private String _macAddr;
+        private String _ipAddr;
+        private String _scriptPath;
+        private nicModel _model;
+
+        public void defBridgeNet(String brName, String targetBrName,
+                String macAddr, nicModel model) {
+            _netType = guestNetType.BRIDGE;
+            _sourceName = brName;
+            _networkName = targetBrName;
+            _macAddr = macAddr;
+            _model = model;
+        }
+
+        public void defPrivateNet(String networkName, String targetName,
+                String macAddr, nicModel model) {
+            _netType = guestNetType.NETWORK;
+            _sourceName = networkName;
+            _networkName = targetName;
+            _macAddr = macAddr;
+            _model = model;
+        }
+
+        public void setHostNetType(hostNicType hostNetType) {
+            _hostNetType = hostNetType;
+        }
+
+        public hostNicType getHostNetType() {
+            return _hostNetType;
+        }
+
+        public String getBrName() {
+            return _sourceName;
+        }
+
+        public guestNetType getNetType() {
+            return _netType;
+        }
+
+        public String getDevName() {
+            return _networkName;
+        }
+
+        public String getMacAddress() {
+            return _macAddr;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder netBuilder = new StringBuilder();
+            netBuilder.append("<interface type='" + _netType + "'>\n");
+            if (_netType == guestNetType.BRIDGE) {
+                netBuilder.append("<source bridge='" + _sourceName + "'/>\n");
+            } else if (_netType == guestNetType.NETWORK) {
+                netBuilder.append("<source network='" + _sourceName + "'/>\n");
+            }
+            if (_networkName != null) {
+                netBuilder.append("<target dev='" + _networkName + "'/>\n");
+            }
+            if (_macAddr != null) {
+                netBuilder.append("<mac address='" + _macAddr + "'/>\n");
+            }
+            if (_model != null) {
+                netBuilder.append("<model type='" + _model + "'/>\n");
+            }
+            netBuilder.append("</interface>\n");
+            return netBuilder.toString();
+        }
+    }
+
+    public static class ConsoleDef {
+        private final String _ttyPath;
+        private final String _type;
+        private final String _source;
+        private short _port = -1;
+
+        public ConsoleDef(String type, String path, String source, short port) {
+            _type = type;
+            _ttyPath = path;
+            _source = source;
+            _port = port;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder consoleBuilder = new StringBuilder();
+            consoleBuilder.append("<console ");
+            consoleBuilder.append("type='" + _type + "'");
+            if (_ttyPath != null) {
+                consoleBuilder.append("tty='" + _ttyPath + "'");
+            }
+            consoleBuilder.append(">\n");
+            if (_source != null) {
+                consoleBuilder.append("<source path='" + _source + "'/>\n");
+            }
+            if (_port != -1) {
+                consoleBuilder.append("<target port='" + _port + "'/>\n");
+            }
+            consoleBuilder.append("</console>\n");
+            return consoleBuilder.toString();
+        }
+    }
+
+    public static class SerialDef {
+        private final String _type;
+        private final String _source;
+        private short _port = -1;
+
+        public SerialDef(String type, String source, short port) {
+            _type = type;
+            _source = source;
+            _port = port;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder serialBuidler = new StringBuilder();
+            serialBuidler.append("<serial type='" + _type + "'>\n");
+            if (_source != null) {
+                serialBuidler.append("<source path='" + _source + "'/>\n");
+            }
+            if (_port != -1) {
+                serialBuidler.append("<target port='" + _port + "'/>\n");
+            }
+            serialBuidler.append("</serial>\n");
+            return serialBuidler.toString();
+        }
+    }
+
+    public static class GraphicDef {
+        private final String _type;
+        private short _port = -2;
+        private boolean _autoPort = false;
+        private final String _listenAddr;
+        private final String _passwd;
+        private final String _keyMap;
+
+        public GraphicDef(String type, short port, boolean autoPort,
+                String listenAddr, String passwd, String keyMap) {
+            _type = type;
+            _port = port;
+            _autoPort = autoPort;
+            _listenAddr = listenAddr;
+            _passwd = passwd;
+            _keyMap = keyMap;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder graphicBuilder = new StringBuilder();
+            graphicBuilder.append("<graphics type='" + _type + "'");
+            if (_autoPort) {
+                graphicBuilder.append(" autoport='yes'");
+            } else if (_port != -2) {
+                graphicBuilder.append(" port='" + _port + "'");
+            }
+            if (_listenAddr != null) {
+                graphicBuilder.append(" listen='" + _listenAddr + "'");
+            } else {
+                graphicBuilder.append(" listen='' ");
+            }
+            if (_passwd != null) {
+                graphicBuilder.append(" passwd='" + _passwd + "'");
+            } else if (_keyMap != null) {
+                graphicBuilder.append(" _keymap='" + _keyMap + "'");
+            }
+            graphicBuilder.append("/>\n");
+            return graphicBuilder.toString();
+        }
+    }
+
+    public static class InputDef {
+        private final String _type; /* tablet, mouse */
+        private final String _bus; /* ps2, usb, xen */
+
+        public InputDef(String type, String bus) {
+            _type = type;
+            _bus = bus;
+        }
+
+        @Override
+        public String toString() {
+            StringBuilder inputBuilder = new StringBuilder();
+            inputBuilder.append("<input type='" + _type + "'");
+            if (_bus != null) {
+                inputBuilder.append(" bus='" + _bus + "'");
+            }
+            inputBuilder.append("/>\n");
+            return inputBuilder.toString();
+        }
+    }
+
+    public void setHvsType(String hvs) {
+        _hvsType = hvs;
+    }
+
+    public void setDomainName(String domainName) {
+        _domName = domainName;
+    }
+
+    public void setDomUUID(String uuid) {
+        _domUUID = uuid;
+    }
+
+    public void setDomDescription(String desc) {
+        _desc = desc;
+    }
+
+    public String getGuestOSType() {
+        return _desc;
+    }
+
+    public void addComp(Object comp) {
+        components.put(comp.getClass().toString(), comp);
+    }
+
+    public DevicesDef getDevices() {
+        Object o = components.get(DevicesDef.class.toString());
+        if (o != null) {
+            return (DevicesDef) o;
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder vmBuilder = new StringBuilder();
+        vmBuilder.append("<domain type='" + _hvsType + "'>\n");
+        vmBuilder.append("<name>" + _domName + "</name>\n");
+        if (_domUUID != null) {
+            vmBuilder.append("<uuid>" + _domUUID + "</uuid>\n");
+        }
+        if (_desc != null) {
+            vmBuilder.append("<description>" + _desc + "</description>\n");
+        }
+        for (Object o : components.values()) {
+            vmBuilder.append(o.toString());
+        }
+        vmBuilder.append("</domain>\n");
+        return vmBuilder.toString();
+    }
+
+    public static void main(String[] args) {
+        System.out.println("testing");
+        LibvirtVMDef vm = new LibvirtVMDef();
+        vm.setHvsType("kvm");
+        vm.setDomainName("testing");
+        vm.setDomUUID(UUID.randomUUID().toString());
+
+        GuestDef guest = new GuestDef();
+        guest.setGuestType(GuestDef.guestType.KVM);
+        guest.setGuestArch("x86_64");
+        guest.setMachineType("pc-0.11");
+        guest.setBootOrder(GuestDef.bootOrder.HARDISK);
+        vm.addComp(guest);
+
+        GuestResourceDef grd = new GuestResourceDef();
+        grd.setMemorySize(512 * 1024);
+        grd.setVcpuNum(1);
+        vm.addComp(grd);
+
+        FeaturesDef features = new FeaturesDef();
+        features.addFeatures("pae");
+        features.addFeatures("apic");
+        features.addFeatures("acpi");
+        vm.addComp(features);
+
+        TermPolicy term = new TermPolicy();
+        term.setCrashPolicy("destroy");
+        term.setPowerOffPolicy("destroy");
+        term.setRebootPolicy("destroy");
+        vm.addComp(term);
+
+        DevicesDef devices = new DevicesDef();
+        devices.setEmulatorPath("/usr/bin/cloud-qemu-system-x86_64");
+
+        DiskDef hda = new DiskDef();
+        hda.defFileBasedDisk("/path/to/hda1", 0, DiskDef.diskBus.VIRTIO,
+                DiskDef.diskFmtType.QCOW2);
+        devices.addDevice(hda);
+
+        DiskDef hdb = new DiskDef();
+        hdb.defFileBasedDisk("/path/to/hda2", 1, DiskDef.diskBus.VIRTIO,
+                DiskDef.diskFmtType.QCOW2);
+        devices.addDevice(hdb);
+
+        InterfaceDef pubNic = new InterfaceDef();
+        pubNic.defBridgeNet("cloudbr0", "vnet1", "00:16:3e:77:e2:a1",
+                InterfaceDef.nicModel.VIRTIO);
+        devices.addDevice(pubNic);
+
+        InterfaceDef privNic = new InterfaceDef();
+        privNic.defPrivateNet("cloud-private", null, "00:16:3e:77:e2:a2",
+                InterfaceDef.nicModel.VIRTIO);
+        devices.addDevice(privNic);
+
+        InterfaceDef vlanNic = new InterfaceDef();
+        vlanNic.defBridgeNet("vnbr1000", "tap1", "00:16:3e:77:e2:a2",
+                InterfaceDef.nicModel.VIRTIO);
+        devices.addDevice(vlanNic);
+
+        SerialDef serial = new SerialDef("pty", null, (short) 0);
+        devices.addDevice(serial);
+
+        ConsoleDef console = new ConsoleDef("pty", null, null, (short) 0);
+        devices.addDevice(console);
+
+        GraphicDef grap = new GraphicDef("vnc", (short) 0, true, null, null,
+                null);
+        devices.addDevice(grap);
+
+        InputDef input = new InputDef("tablet", "usb");
+        devices.addDevice(input);
+
+        vm.addComp(devices);
+
+        System.out.println(vm.toString());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtXMLParser.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtXMLParser.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtXMLParser.java
new file mode 100644
index 0000000..3a61403
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtXMLParser.java
@@ -0,0 +1,72 @@
+// 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 com.cloud.hypervisor.kvm.resource;
+
+import java.io.IOException;
+import java.io.StringReader;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.log4j.Logger;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class LibvirtXMLParser extends DefaultHandler {
+    private static final Logger s_logger = Logger
+            .getLogger(LibvirtXMLParser.class);
+    protected static SAXParserFactory s_spf;
+
+    static {
+        s_spf = SAXParserFactory.newInstance();
+
+    }
+    protected SAXParser _sp;
+    protected boolean _initialized = false;
+
+    public LibvirtXMLParser() {
+
+        try {
+            _sp = s_spf.newSAXParser();
+            _initialized = true;
+        } catch (Exception ex) {
+        }
+
+    }
+
+    public boolean parseDomainXML(String domXML) {
+        if (!_initialized) {
+            return false;
+        }
+        try {
+            _sp.parse(new InputSource(new StringReader(domXML)), this);
+            return true;
+        } catch (SAXException se) {
+            s_logger.warn(se.getMessage());
+        } catch (IOException ie) {
+            s_logger.error(ie.getMessage());
+        }
+        return false;
+    }
+
+    @Override
+    public void characters(char[] ch, int start, int length)
+            throws SAXException {
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
new file mode 100644
index 0000000..08f51a4
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java
@@ -0,0 +1,98 @@
+// 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 com.cloud.hypervisor.kvm.storage;
+
+public class KVMPhysicalDisk {
+    private String path;
+    private String name;
+    private KVMStoragePool pool;
+
+    public static enum PhysicalDiskFormat {
+        RAW("raw"), QCOW2("qcow2");
+        String format;
+
+        private PhysicalDiskFormat(String format) {
+            this.format = format;
+        }
+
+        public String toString() {
+            return this.format;
+        }
+    }
+
+    public static String RBDStringBuilder(String monHost, int monPort,
+                            String authUserName, String authSecret, String image) {
+        String rbdOpts;
+
+        rbdOpts = "rbd:" + image;
+        rbdOpts += ":mon_host=" + monHost + "\\\\:" + monPort;
+        if (authUserName == null) {
+            rbdOpts += ":auth_supported=none";
+        } else {
+            rbdOpts += ":auth_supported=cephx";
+            rbdOpts += ":id=" + authUserName;
+            rbdOpts += ":key=" + authSecret;
+        }
+        return rbdOpts;
+    }
+
+    private PhysicalDiskFormat format;
+    private long size;
+    private long virtualSize;
+
+    public KVMPhysicalDisk(String path, String name, KVMStoragePool pool) {
+        this.path = path;
+        this.name = name;
+        this.pool = pool;
+    }
+
+    public void setFormat(PhysicalDiskFormat format) {
+        this.format = format;
+    }
+
+    public PhysicalDiskFormat getFormat() {
+        return this.format;
+    }
+
+    public void setSize(long size) {
+        this.size = size;
+    }
+
+    public long getSize() {
+        return this.size;
+    }
+
+    public void setVirtualSize(long size) {
+        this.virtualSize = size;
+    }
+
+    public long getVirtualSize() {
+        return this.virtualSize;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public String getPath() {
+        return this.path;
+    }
+
+    public KVMStoragePool getPool() {
+        return this.pool;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7a0a9231/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
new file mode 100644
index 0000000..5437e7c
--- /dev/null
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePool.java
@@ -0,0 +1,65 @@
+// 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 com.cloud.hypervisor.kvm.storage;
+
+import java.util.List;
+
+import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk.PhysicalDiskFormat;
+import com.cloud.storage.Storage.StoragePoolType;
+
+public interface KVMStoragePool {
+    public KVMPhysicalDisk createPhysicalDisk(String name,
+            PhysicalDiskFormat format, long size);
+
+    public KVMPhysicalDisk createPhysicalDisk(String name, long size);
+
+    public KVMPhysicalDisk getPhysicalDisk(String volumeUuid);
+
+    public boolean deletePhysicalDisk(String uuid);
+
+    public List<KVMPhysicalDisk> listPhysicalDisks();
+
+    public String getUuid();
+
+    public long getCapacity();
+
+    public long getUsed();
+
+    public boolean refresh();
+
+    public boolean isExternalSnapshot();
+
+    public String getLocalPath();
+
+    public String getSourceHost();
+
+    public String getSourceDir();
+
+    public int getSourcePort();
+
+    public String getAuthUserName();
+
+    public String getAuthSecret();
+
+    public StoragePoolType getType();
+
+    public boolean delete();
+
+    PhysicalDiskFormat getDefaultFormat();
+
+    public boolean createFolder(String path);
+}