Openstack4J API初体验之删除一个实例(删除一个虚拟机)

来源:互联网 发布:测试键盘按键软件 编辑:程序博客网 时间:2024/06/05 16:10

说明:本文中,节点,实例,虚拟机这几个词是等价的。
今天写了一个删除虚拟机的函数,发现数据库设计得有问题,之前创建节点的函数是学长写的,现在看来也需要改一改才能用了,于是动手,花了大概一个小时时间,把创建删除节点的整个过程再完善了一下。
先说一下背景,我们的web界面是大概是这个样子:
这里写图片描述
这里从左边拖节点到右侧的画布区域,每拖一个卫星实际上有两件主要事要做:
1、在数据库插入创建节点的信息
2、在Openstack上创建一个虚拟机或者docker
我们是不允许用户在同一场景下(就是右边的画布区域看成一个场景)创建名字相同的节点的。
但是我们允许用户在不同场景下创建同样名字的节点的,举个例子,同一个文件夹下不能有同名和文件,不同文件夹下可以有同名的文件。这里文件夹对应场景,文件对应一个卫星节点(底层对应虚拟机)。这样就造成了一个这样的现象:
1、在数据库中Node表上实际上是有同名的node的但是,同名的node中的所属场景字段是一定不同的。
2、在Openstack上是有同名的虚拟实例的。

了解了上面的背景,现在我们来看看在删除节点是时候遇到了什么问题呢?
先再看看Openstack4J 提供的删除节点的主要代码:

os.compute().servers().delete("serverId");

看到了吧?删除实例只能用实例的ID,这下就麻烦了,回过头看看上面的那幅图,前端是我室友在做,由于技术的限制,他只能将卫星节点(虚拟机)的名字和卫星节点所属场景传到后台,那么我是可以在数据库中唯一确定一条节点信息的。但是说到底,我要想调用Openstack4J的删除节点函数,那么我必须要拿到这个节点的ID(这里的ID非数据库中的ID,而是Openstack中自动生成的标识),如何拿呢?开始的一个错误的办法就是这样:

        OSClientV3 os = this.authenticate();        List<? extends Server> servers = os.compute().servers().list();        for (Server server : servers) {            if (server.getName().equals("Ubuntu 4")) {                ActionResponse response = os.compute().servers().delete(server.getId());                System.out.println(response);                System.out.println(response.isSuccess());                System.out.println(server.getName());            }        }

假设我要删除名字为“Ubuntu 4”的节点。
我先拿到当前用户下的所有虚拟机实例,然后遍历虚拟机实例,看看哪一个实例的名字是Ubuntu 4,但是前文已经提到,在Openstack中是允许实例名字重复!这下就完蛋了,假设我有10个实例名字都叫“Ubuntu 4”,我只想删其中一个,但是就一下子把所有Ubuntu 4都删除了,这显然是错的。
想了一下,这个数据库中就应该加上Openstack中的标识字段,就是下图中的标识:
这里写图片描述

在增加了数据库中增加了uuid字段之后,在Openstack上创建了节点之后 返回这个节点的uuid,然后再把这个uuid赋值给java中Node对象中的uuid成员变量:

        public String createNode(String name, String ip, String zone) {        OSClientV3 os = OSClientFactory.authenticate("zph", "123456", Constants.ZPH_PROJECT_ID);        System.out.println(os);        if (zone.equals("vm")) {            System.out.println("生成虚拟机节点");            Server server = ServerFactory.createServer(os, name, ip);            **return server.getId();**        } else if (zone.equals("docker")) {            Server server = ServerFactory.createDockerServer(os, name, ip);            **return server.getId();**        }        return "创建失败!";    }

加粗部分是返回创建的虚拟机的标识。

                node.setUuid(uuid);                nodeDao.insertNode(node);

之后拿到uuid之后赋值非node对象。

现在在Openstack上删除节点代码就成了这个样子:

public ActionResponse deleteNode(String uuid) {        OSClientV3 os = OSClientFactory.authenticate("zph", "123456", Constants.ZPH_PROJECT_ID);        ActionResponse actionResponse = os.compute().servers().delete(uuid);        return actionResponse;    }

清爽!结束!

原创粉丝点击