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; }
清爽!结束!
- Openstack4J API初体验之删除一个实例(删除一个虚拟机)
- Openstack4J API初体验之启动一个实例并为实例分配IP(将实例挂在某个网段上)
- Openstack4J API初体验之浮动IP的查询,关联和删除
- Openstack4J API初体验之Authentication
- layer初体验之弹出一个删除确认界面
- Openstack4J API初体验之在获取节点控制台的链接
- Trello使用体验之如何删除一个Board
- Trello使用体验之如何删除一个Card
- bat查到一个进程,并删除实例
- Activiti挂起或者删除一个流程实例
- Mac虚拟机安装win7教程之Mac双系统怎么删除一个WINDOWS
- matlab之删除其中一个subplot
- 删除一个文件夹
- 删除一个文件夹
- 如何删除一个目录
- 一个无敌删除命令
- 删除一个目录
- 删除一个函数: remove
- Java泛型-类型擦除
- 【JZOJ4425】【HNOI2016模拟4.4】Fenwit
- Java并发之并行与并发的区别
- ShuffleNet算法详解
- 最长上升子序列1006
- Openstack4J API初体验之删除一个实例(删除一个虚拟机)
- Crazy Learning for Day 14
- 数学之美番外篇:平凡而又神奇的贝叶斯方法
- 高仿淘宝购物车分分钟让你集成
- Go 语言的Template Package
- Python高效编程的19个技巧
- 视觉里程计(三)
- BZOJ 1935 Tree 园丁的烦恼 [差分][树状数组]
- 类加载器