当前位置:   article > 正文

云服务平台仿真-身份认证/授权/申请和释放IT资源[云计算3]

云服务平台仿真-身份认证/授权/申请和释放IT资源[云计算3]

实验名称

服务平台仿真--身份认证/授权/申请和释放IT资源

实验目的

  1. 通过CloudSim仿真,熟悉云服务平台的构建。
  2. 通过CloudSim仿真,熟悉各种云机制在云服务中的实现原理。

实验原理

CloudSim可以模拟云服务的各类底层方法。在省略技术细节的前提下, 可以实现一个人机交互界面,通过调用CloudSim的库函数来模拟一个 能够满足云用户申请和使用IT资源的云服务平台(功能参考阿里云平台)。

实验要求

开发一个基于CloudSim仿真的云服务平台,并至少实现以下功能:

  1. 界面:使用JSP等Web开发技术实现B/S架构的云平台(云用户使用浏览器访问云平台); 或者使用Java Console模式实现单机版云平台(云用户使用命令提示符窗口通过交互命令来访问云平台)。
  2. 身份认证:需要有账户登录和验证功能,能够实现多租户使用云平台。
  3. 授权:不同类型的用户拥有不同的权限。
  4. 申请和释放IT资源:申请和释放各类IT资源(CPU、内存、硬盘、带宽、……)。
  5. 其他功能:其他功能不限数量,均记为加分项。

源码:功能不全,比较简陋,而且释放资源的时候还会报错。

  1. package org.cloudbus.cloudsim;
  2. import java.util.HashMap;
  3. import java.util.Scanner;
  4. import java.util.ArrayList;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Map;
  8. public class zzf {
  9. private static Map<String, List<Vm>> VMmap = new HashMap<>();
  10. // 查看并打印与给定ID关联的用户下的所有IT资源(虚拟机由Vm类表示),接受一个字符串参数ID
  11. private static void viewResources(String ID){
  12. List<Vm> vmlist; //声明了一个Vm类型的列表 vmlist,用于存储与给定 ID 关联的虚拟机
  13. //检查VMmap中的用户ID
  14. if(VMmap.get(ID) == null) { //VMmap中没有和ID关联的列表
  15. vmlist = new ArrayList<Vm>(); //创建新的空Vm列表
  16. VMmap.put(ID,vmlist); //将该列表与ID存取在VMmap中
  17. System.out.println( ID +",此用户暂无任何IT资源---------\n");
  18. } else {
  19. //从VMmap中获取与ID关联的Vm列表
  20. vmlist = VMmap.get(ID);
  21. }
  22. //遍历并打印虚拟机信息 使用迭代器遍历vmlist中的每一个Vm对象
  23. for (Iterator<Vm> iterator = vmlist.iterator(); iterator.hasNext();) {
  24. Vm vm = iterator.next();
  25. System.out.println("当前用户" + ID + "编号为" + vm.getId() + "的虚拟机!!");
  26. System.out.println("-------------------------------------------------");
  27. System.out.println("用户的宽带 :" + vm.getBw() + "Mbps");
  28. System.out.println("用户的CPU数量:" + vm.getNumberOfPes());
  29. System.out.println("用户的内存:" + vm.getRam() + "MB");
  30. System.out.println("\n");
  31. }
  32. }
  33. // 申请各类IT资源
  34. public static void applyResource(String ID) {
  35. Scanner sc = new Scanner(System.in);
  36. List<Vm> vmlist;
  37. String num = null;
  38. if(VMmap.get(ID) == null){
  39. vmlist = new ArrayList<Vm>();
  40. VMmap.put(ID,vmlist);
  41. } else {
  42. vmlist = VMmap.get(ID);
  43. }
  44. System.out.println("选择默认参数,输入1:");
  45. if(sc.hasNext()){
  46. num = sc.next();
  47. }
  48. // VM 对象
  49. long ram = 2048; // RAM 容量(MB)
  50. long bw = 100; //带宽Mbps()
  51. int pesNumber = 1;// PE 数量
  52. if(num.equals("1")){
  53. System.out.println("默认申请的规格具体如下:");
  54. System.out.println("----------------------------------------");
  55. System.out.println("CPU个数: "+ pesNumber);
  56. System.out.println("内存 :"+ram+"MB");
  57. System.out.println("带宽 :"+bw +"Mbps");
  58. System.out.println("----------------------------------------");
  59. }
  60. }
  61. // 释放vmID的IT资源
  62. public static void releaseRes(String ID, String vmID) {
  63. Scanner sc = new Scanner(System.in);
  64. String choice = null;
  65. List<Vm> vmlist = VMmap.get(ID);
  66. Vm vm = null;
  67. for(Iterator<Vm> iterator = vmlist.iterator(); iterator.hasNext();) {
  68. vm = iterator.next();
  69. if((vm.getId() + "").equals(vmID)) break;
  70. }
  71. tar: while (true) {
  72. System.out.println("您想要释放哪些IT资源?");
  73. System.out.println("输入0: 返回");
  74. System.out.println("输入数字1: 带宽");
  75. System.out.println("输入数字2: 内存");
  76. System.out.println("输入数字3: 存储空间");
  77. System.out.println("请选择:");
  78. if(sc.hasNext()){
  79. choice = sc.next();
  80. }
  81. long ramSize = vm.getRam();
  82. if(choice.equals("3")) {
  83. System.out.println(vmID+"号虚拟机一共有"+vm.getSize()+"MB"+"想要释放多少存储空间?");
  84. long num1 = sc.nextLong();
  85. num1 = vm.getSize() - num1;
  86. vm.setSize(num1);
  87. } else if (choice.equals("2")){
  88. System.out.println(vmID+"号虚拟机一共有"+ramSize+"MB"+"想要释放多少内存空间?");
  89. int num2 = sc.nextInt();
  90. num2 = vm.getRam() - num2;
  91. vm.setRam(num2);
  92. } else if (choice.equals("1")) {
  93. System.out.println(vmID+"号虚拟机一共有"+ vm.getBw()+"M"+"想要释放多少带宽?");
  94. } else if (choice.equals("0")) {
  95. break tar;
  96. }
  97. }
  98. }
  99. public static void main(String[] args) {
  100. Scanner scanner = new Scanner(System.in);
  101. Log.printLine("Starting zzf...");
  102. while (true) {
  103. System.out.println("请输入用户ID进行操作或输入'exit'退出:");
  104. String userID = scanner.nextLine();
  105. if (userID.equals("exit")) {
  106. break;
  107. }
  108. System.out.println("选择操作:\n1. 查看IT资源\n2. 申请IT资源\n3. 释放IT资源\n请输入选项:");
  109. String choice = scanner.nextLine();
  110. switch (choice) {
  111. case "1":
  112. viewResources(userID);
  113. break;
  114. case "2":
  115. applyResource(userID);
  116. break;
  117. case "3":
  118. System.out.println("请输入要释放的虚拟机ID:");
  119. String vmID = scanner.nextLine();
  120. releaseRes(userID, vmID);
  121. break;
  122. default:
  123. System.out.println("无效的选项,请重新输入.");
  124. }
  125. }
  126. Log.printLine("zzf finished!");
  127. scanner.close();
  128. }
  129. }

报错位置:释放资源功能

报错信息Exception in thread "main" java.lang.NullPointerException: Cannot invoke "org.cloudbus.cloudsim.Vm.getRam()" because "vm" is null

chatGPT给出的建议:

通常表示你尝试访问一个尚未被初始化或已设为 null 的对象的方法或属性。从你提供的错误信息来看,可能是在某个地方尝试访问一个未成功创建或未正确引用的 Vm 实例的 RAM。

错误可能出现在处理 releaseResources 方法中,尝试访问已删除或未找到的 Vm 对象。为了避免这个问题,我们需要在尝试访问 Vm 对象之前,确保其存在。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号