Pārlūkot izejas kodu

引入 libvirt-java 管理 kvm 虚拟机

reghao 1 gadu atpakaļ
vecāks
revīzija
84c3dfc57e

+ 16 - 0
mgr/pom.xml

@@ -184,6 +184,22 @@
             <artifactId>alibabacloud-alidns20150109</artifactId>
             <version>3.0.24</version>
         </dependency>
+
+        <dependency>
+            <groupId>net.java.dev.jna</groupId>
+            <artifactId>jna</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.libvirt</groupId>
+            <artifactId>libvirt</artifactId>
+            <version>0.5.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>2.1.1</version>
+        </dependency>
     </dependencies>
 
     <profiles>

+ 28 - 0
mgr/src/main/java/cn/reghao/devops/mgr/mgr/vm/Network.java

@@ -0,0 +1,28 @@
+package cn.reghao.devops.mgr.mgr.vm;
+
+import org.libvirt.Connect;
+
+/**
+ * @author reghao
+ * @date 2020-10-29 14:29:40
+ */
+public class Network {
+    private final String uri;
+
+    public Network() {
+        this.uri = "qemu:///system";
+    }
+
+    public void listNetwork() throws Exception {
+        Connect conn = new Connect(uri, false);
+        String[] networks = conn.listNetworks();
+        String[] networkFilters = conn.listNetworkFilters();
+        String[] definedNetworks = conn.listDefinedNetworks();
+        System.out.println();
+    }
+
+    public static void main(String[] args) throws Exception {
+        Network network = new Network();
+        network.listNetwork();
+    }
+}

+ 128 - 0
mgr/src/main/java/cn/reghao/devops/mgr/mgr/vm/Storage.java

@@ -0,0 +1,128 @@
+package cn.reghao.devops.mgr.mgr.vm;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dom4j.Document;
+import org.dom4j.io.SAXReader;
+import org.libvirt.*;
+
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 存储
+ *
+ * @author reghao
+ * @date 2020-10-28 21:44:01
+ */
+@Slf4j
+public class Storage {
+    private final String uri;
+
+    public Storage() {
+        this.uri = "qemu:///system";
+    }
+
+    public void createStoragePool() throws Exception {
+        Connect conn = new Connect(uri, false);
+        String xml = "/home/reghao/docs/zzz/backend/kvm/xml/pool.xml";
+        Document doc = new SAXReader().read(new FileInputStream(xml));
+        StoragePool storagePool = conn.storagePoolCreateXML(doc.asXML(), 0);
+    }
+
+    public List<StoragePool> listStoragePool() throws Exception {
+        Connect conn = new Connect(uri, true);
+
+        List<StoragePool> poolList = new ArrayList<>();
+        String[] activePoolNames = conn.listStoragePools();
+        String[] inactivePoolNames = conn.listDefinedStoragePools();
+        for (String poolName : activePoolNames) {
+            StoragePool storagePool = conn.storagePoolLookupByName(poolName);
+            poolList.add(storagePool);
+
+            storagePool.isPersistent();
+            storagePool.isActive();
+            storagePool.getAutostart();
+            storagePool.getXMLDesc(0);
+            storagePool.getUUIDString();
+        }
+
+        return poolList;
+    }
+
+    public void deleteStoragePool(String poolName) throws Exception {
+        Connect conn = new Connect(uri, false);
+        StoragePool storagePool = conn.storagePoolLookupByName(poolName);
+        int res = storagePool.isActive();
+        if (res == 1) {
+            //storagePool.destroy();
+            //storagePool.undefine();
+            // 释放所有与存储池关联的内存,存储池的状态不会改变
+            storagePool.free();
+        } else if (res == 0) {
+            //
+            storagePool.undefine();
+            storagePool.free();
+        } else {
+            throw new Exception("存储池状态错误...");
+        }
+    }
+
+    public StorageVol createStorageVolume(StoragePool storagePool) throws Exception {
+        String xml = "/home/reghao/docs/zzz/backend/kvm/xml/volume.xml";
+        Document doc = new SAXReader().read(new FileInputStream(xml));
+        return storagePool.storageVolCreateXML(doc.asXML(), 0);
+    }
+
+    public List<StorageVol> listStorageVolume(String poolName) throws Exception {
+        Connect conn = new Connect(uri, true);
+        StoragePool storagePool = conn.storagePoolLookupByName(poolName);
+
+        List<StorageVol> volList = new ArrayList<>();
+        String[] volumeNames = storagePool.listVolumes();
+        for (String volName : volumeNames) {
+            StorageVol storageVol = storagePool.storageVolLookupByName(volName);
+            volList.add(storageVol);
+            //list.add(storagePool.storageVolLookupByName(vol));
+            /*StorageVolInfo volInfo = storageVol.getInfo();
+            log.info("存储卷的类型:{}", volInfo.type);
+            log.info("存储卷的容量:{}GB", volInfo.capacity / 1024.00 / 1024.00 / 1024.00);
+            log.info("存储卷的已用容量:{}GB", volInfo.allocation / 1024.00 / 1024.00 / 1024.00);*/
+        }
+
+        return volList;
+    }
+
+    public static void cloneVolume(StoragePool storagePool) throws LibvirtException {
+        String xmlDesc = "";
+        StorageVol cloneVolume = null;
+        // StoragePool.BuildFlags.VIR_STORAGE_POOL_BUILD_NEW
+        storagePool.storageVolCreateXMLFrom(xmlDesc, cloneVolume, 0);
+    }
+
+    public static void main(String[] args) throws Exception {
+        Storage storage = new Storage();
+
+        List<StoragePool> storagePools = storage.listStoragePool();
+        /*if (storagePools.isEmpty()) {
+            StoragePool storagePool = storage.createStoragePool();
+            //StorageVol storageVol = storage.createStorageVolume(storagePool);
+            return;
+        }*/
+
+        for (StoragePool storagePool: storagePools) {
+            String poolName = storagePool.getName();
+            log.info("存储池: {}", poolName);
+
+            List<StorageVol> storageVols = storage.listStorageVolume(poolName);
+            for (StorageVol storageVol : storageVols) {
+                // 释放所有指向 volume 的指针(domain)
+                //storageVol.free();
+                // 物理删除
+                //storageVol.delete(0);
+                log.info("存储卷:{}", storageVol.getName());
+            }
+            log.info("---------------------------------------------------------------------");
+        }
+    }
+}

+ 85 - 0
mgr/src/main/java/cn/reghao/devops/mgr/mgr/vm/VirtualHost.java

@@ -0,0 +1,85 @@
+package cn.reghao.devops.mgr.mgr.vm;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dom4j.Document;
+import org.dom4j.io.SAXReader;
+import org.libvirt.Connect;
+import org.libvirt.Domain;
+import org.libvirt.DomainInfo;
+
+import java.io.FileInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 虚拟主机
+ *
+ * @author reghao
+ * @date 2020-10-28 18:48:52
+ */
+@Slf4j
+public class VirtualHost {
+    private final String uri;
+
+    public VirtualHost() {
+        this.uri = "qemu:///system";
+    }
+
+    public void start(Domain domain) throws Exception {
+        domain.create();
+    }
+
+    public void restart(Domain domain) throws Exception {
+        domain.reboot(0);
+    }
+
+    public void stop(Domain domain) throws Exception {
+        domain.shutdown();
+    }
+
+    public Domain createDomain() throws Exception {
+        Connect conn = new Connect(uri, false);
+        String xml = "/home/reghao/data/os/vhost.xml";
+        Document doc = new SAXReader().read(new FileInputStream(xml));
+        return conn.domainDefineXML(doc.asXML());
+    }
+
+    public List<Domain> listDomain() throws Exception {
+        Connect conn = new Connect(uri, false);
+        List<Domain> list = new ArrayList<>();
+        String[] domainNames = conn.listDefinedDomains();
+        for (String domainName : domainNames) {
+            list.add(conn.domainLookupByName(domainName));
+        }
+
+        int[] active = conn.listDomains();
+        for (int id : active) {
+            list.add(conn.domainLookupByID(id));
+        }
+        return list;
+    }
+
+    public static void main(String[] args) throws Exception {
+        VirtualHost vhost = new VirtualHost();
+        //Domain domain1 = vhost.createDomain();
+        List<Domain> domains = vhost.listDomain();
+        for (Domain domain : domains) {
+            String domainName = domain.getName();
+            DomainInfo domainInfo = domain.getInfo();
+            int active = domain.isActive();
+            if (active == 0) {
+                domain.create();
+                log.info("start {}", domainName);
+            } else {
+                //domain.shutdown();
+                log.info("shutdown {}", domainName);
+            }
+            //domain.undefine();
+            //domain.free();
+
+            /*String xmlDesc = domain.getXMLDesc(0);
+            domain.detachDevice(xmlDesc);
+            domain.destroy();*/
+        }
+    }
+}