扩展弹性云服务器实例硬盘空间
引导式阅读
Java
扩展弹性云服务器实例硬盘空间
作者
C***
上架时间
2021-06-28 11:46:38

版本说明

本示例基于华为云SDK V2.0版本开发,高版本示例正在开发中。

场景介绍

公司IT管理员小明为员工分配了一台华为云ECS弹性云服务器实例作为办公系统,但半年后该员工反馈硬盘空间快被占满了。请参考华为云ECS服务SDK文档,通过调用接口方式为指定ECS实例扩充200G硬盘空间的代码示例。

前提条件

  • java8+idea

示例代码

展示示例主要功能的代码片段

import java.util.HashMap; import java.util.List; import java.util.Map; import com.huawei.openstack4j.api.OSClient.OSClientV3; import com.huawei.openstack4j.model.common.Identifier; import com.huawei.openstack4j.model.compute.Server; import com.huawei.openstack4j.openstack.OSFactory; import com.huawei.openstack4j.openstack.evs.v2.domain.CloudVolumeResponse; import com.huawei.openstack4j.openstack.evs.v2.domain.CloudVolumesResponse; import com.huawei.openstack4j.openstack.evs.v2.domain.Extend; import com.huawei.openstack4j.openstack.evs.v2.domain.OSExtend; public class VolumeDemo { // 执行的时候将这个值改成200,如果200报错,那就201,202,203,原因是磁盘当前已经是200g了 public static int NEWSIZE = 43; // ECS的名字 public static String ECSNAME = "ecs-7063"; public static void main(String[] args) throws InterruptedException { OSClientV3 os = getCon(); // 获取磁盘的uuid String volumeUUidByServerName = getVolumeUUidByServerName(os); // 如果没有名字对应的机器,直接关了 if (volumeUUidByServerName.equals("1")) { System.out.println("机器不存在"); return; } System.out.println("************磁盘修改之前获取的数据*************"); getVolumeinfo(os,volumeUUidByServerName); // 暂停5s看结果 for (int i = 0; i < 10; i++) { Thread.sleep(1000); System.out.println("努力执行根据ec2机器名字获取磁盘Id中,静静等待" + (10 - i) + "秒"); } // 修改磁盘 resizeVolume(os, volumeUUidByServerName); // 暂停5s看结果 for (int i = 0; i < 10; i++) { Thread.sleep(1000); System.out.println("数据努力获取中," + (10 - i) + "秒后查看修改后的数据"); } System.out.println("************磁盘修改之后获取的数据*************"); getVolumeinfo(os,volumeUUidByServerName); } /* * @Description 扩容磁盘 * @Date 16:25 2020/9/4 **/ private static void resizeVolume(OSClientV3 os, String volumeId) { Extend extend = Extend.builder().osExtend(OSExtend.builder().newSize(NEWSIZE).build()).build(); Extend extend1 = Extend.builder().osExtend(OSExtend.builder().newSize(NEWSIZE).build()).build(); String extendJobId = os.evs().volumes().extend(extend, volumeId); if (null != extendJobId) { System.out.println("submit extendJobId success, jobId = " + extendJobId); } else { System.out.println("submit extendJobId failed"); } } /* * @Description 获取磁盘信息 * @Date 16:25 2020/9/4 **/ private static void getVolumeinfo(OSClientV3 os,String s) { // 根据磁盘id获取磁盘 Map<String, Object> filteringParams = new HashMap<String, Object>(); filteringParams.put("id", s); CloudVolumesResponse volumes2 = os.evs().volumes().list(filteringParams); if (null != volumes2 && volumes2.getCount() >= 0) { CloudVolumeResponse cloudVolumeResponse = volumes2.getVolumeList().get(0); System.out.println("小明的机器一共有" + volumes2.getCount() + "块磁盘"); System.out.println("小明的机器的磁盘id为" + cloudVolumeResponse.getId()); System.out.println("小明的机器的磁盘状态为" + cloudVolumeResponse.getStatus()); System.out.println("小明的机器的磁盘名称为" + cloudVolumeResponse.getName()); System.out.println("小明的机器的磁盘大小为" + cloudVolumeResponse.getSize()); } else { System.out.println("获取失败"); } } /* * @Description 获取链接 * @Date 16:25 2020/9/4 **/ private static OSClientV3 getCon() { // Using credentials for authentication String authUrl = "https://iam.cn-north-4.myhuaweicloud.com/v3"; // endpoint Url String user = "username"; //username String password = "password"; //password String projectId = "063387954b******2f1bc00c37b6f4e3"; // projectId String userDomainId = "3e53b441a5******92528eea692e2fbf"; // domainId // create connection return OSFactory.builderV3().endpoint(authUrl).credentials(user, password, Identifier.byId(userDomainId)).scopeToProject(Identifier.byId(projectId)).authenticate(); } /* * @Description 根据ecs名字获取磁盘的uuidS * @Date 16:25 2020/9/4 **/ private static String getVolumeUUidByServerName(OSClientV3 os) { String s = null; Map<String, String> filteringParams = new HashMap<String, String>(); filteringParams.put("name", ECSNAME); List<? extends Server> filterList = os.compute().servers().list(filteringParams); if (filterList.size() > 0) { s = filterList.get(0).getOsExtendedVolumesAttached().get(0); System.out.println(s); } else { System.out.println("机器不存在"); return "1"; } return s; } }

运行示例

描述将代码示例运行起来所相关的命令和步骤
1、idea导入项目
2、修改 VolumeDemo的静态变量NEWSIZE 为200 ,如果200报错,那就201,202,203,原因是磁盘当前已经是200g了
3、修改ECSNAME 为小明机器的name
4、右键VolumeDemo的main方法,执行

运行结果

描述示例最终运行起来的结果是什么样的

  • 若ecs名字不存在,那么控制台就会打印 > 机器不存在
    > 机器不存在

  • 如果一个机器下有多个磁盘,那么默认使用第一块磁盘,实际场景中,可以进行select选择

  • 如果运行正常 运行结果如下

************磁盘修改之前获取的数据************* 小明的机器一共有1块磁盘 小明的机器的磁盘id为865b1b8e-4341-40a1-a293-a8891119021c 小明的机器的磁盘状态为in-use 小明的机器的磁盘名称为ecs-a5e4 小明的机器的磁盘大小为40 努力执行根据ec2机器名字获取磁盘Id中,静静等待10秒 努力执行根据ec2机器名字获取磁盘Id中,静静等待9秒 努力执行根据ec2机器名字获取磁盘Id中,静静等待8秒 努力执行根据ec2机器名字获取磁盘Id中,静静等待7秒 努力执行根据ec2机器名字获取磁盘Id中,静静等待6秒 努力执行根据ec2机器名字获取磁盘Id中,静静等待5秒 努力执行根据ec2机器名字获取磁盘Id中,静静等待4秒 努力执行根据ec2机器名字获取磁盘Id中,静静等待3秒 努力执行根据ec2机器名字获取磁盘Id中,静静等待2秒 努力执行根据ec2机器名字获取磁盘Id中,静静等待1秒 submit extendJobId success, jobId = ff80808273cf149501745843016076bd 数据努力获取中,10秒后查看修改后的数据 数据努力获取中,9秒后查看修改后的数据 数据努力获取中,8秒后查看修改后的数据 数据努力获取中,7秒后查看修改后的数据 数据努力获取中,6秒后查看修改后的数据 数据努力获取中,5秒后查看修改后的数据 数据努力获取中,4秒后查看修改后的数据 数据努力获取中,3秒后查看修改后的数据 数据努力获取中,2秒后查看修改后的数据 数据努力获取中,1秒后查看修改后的数据 ************磁盘修改之后获取的数据************* 小明的机器一共有1块磁盘 小明的机器的磁盘id为865b1b8e-4341-40a1-a293-a8891119021c 小明的机器的磁盘状态为in-use 小明的机器的磁盘名称为ecs-a5e4 小明的机器的磁盘大小为41