云服务平台仿真-身份认证/授权/申请和释放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. 其他功能:其他功能不限数量,均记为加分项。

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

package org.cloudbus.cloudsim;
import java.util.HashMap;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class zzf {
    private static Map<String, List<Vm>> VMmap = new HashMap<>();

    // 查看并打印与给定ID关联的用户下的所有IT资源(虚拟机由Vm类表示),接受一个字符串参数ID
    private static void viewResources(String ID){
        List<Vm> vmlist; //声明了一个Vm类型的列表 vmlist,用于存储与给定 ID 关联的虚拟机

        //检查VMmap中的用户ID
        if(VMmap.get(ID) == null) {       //VMmap中没有和ID关联的列表
            vmlist = new ArrayList<Vm>(); //创建新的空Vm列表
            VMmap.put(ID,vmlist);         //将该列表与ID存取在VMmap中

            System.out.println( ID +",此用户暂无任何IT资源---------\n");
        } else {
            //从VMmap中获取与ID关联的Vm列表
            vmlist = VMmap.get(ID);
        }

        //遍历并打印虚拟机信息 使用迭代器遍历vmlist中的每一个Vm对象
        for (Iterator<Vm> iterator = vmlist.iterator(); iterator.hasNext();) {
            Vm vm = iterator.next();
            System.out.println("当前用户" + ID + "编号为" + vm.getId() + "的虚拟机!!");
            System.out.println("-------------------------------------------------");
            System.out.println("用户的宽带  :" + vm.getBw() + "Mbps");
            System.out.println("用户的CPU数量:" + vm.getNumberOfPes());
            System.out.println("用户的内存:" + vm.getRam() + "MB");
            System.out.println("\n");
        }
    }

    // 申请各类IT资源
    public static void applyResource(String ID) {
        Scanner sc = new Scanner(System.in);
        List<Vm> vmlist;
        String num = null;

        if(VMmap.get(ID) == null){
            vmlist = new ArrayList<Vm>();
            VMmap.put(ID,vmlist);
        } else {
            vmlist = VMmap.get(ID);
        }

        System.out.println("选择默认参数,输入1:");
        if(sc.hasNext()){
            num = sc.next();
        }

        // VM 对象
        long ram = 2048; // RAM 容量(MB)
        long bw = 100; //带宽Mbps()
        int pesNumber = 1;// PE 数量


        if(num.equals("1")){
            System.out.println("默认申请的规格具体如下:");
            System.out.println("----------------------------------------");
            System.out.println("CPU个数: "+ pesNumber);
            System.out.println("内存 :"+ram+"MB");
            System.out.println("带宽 :"+bw +"Mbps");
            System.out.println("----------------------------------------");
        }
    }

    // 释放vmID的IT资源
    public static void releaseRes(String ID, String vmID) {
        Scanner sc = new Scanner(System.in);
        String choice = null;
        List<Vm> vmlist = VMmap.get(ID);
        Vm vm = null;

        for(Iterator<Vm> iterator = vmlist.iterator(); iterator.hasNext();) {
            vm = iterator.next();
            if((vm.getId() + "").equals(vmID)) break;
        }

        tar: while (true) {
            System.out.println("您想要释放哪些IT资源?");
            System.out.println("输入0: 返回");
            System.out.println("输入数字1: 带宽");
            System.out.println("输入数字2: 内存");
            System.out.println("输入数字3: 存储空间");
            System.out.println("请选择:");
            if(sc.hasNext()){
                choice = sc.next();
            }

            long ramSize = vm.getRam();

            if(choice.equals("3")) {
                System.out.println(vmID+"号虚拟机一共有"+vm.getSize()+"MB"+"想要释放多少存储空间?");
                long num1 = sc.nextLong();
                num1 = vm.getSize() - num1;
                vm.setSize(num1);
            } else if (choice.equals("2")){
                System.out.println(vmID+"号虚拟机一共有"+ramSize+"MB"+"想要释放多少内存空间?");
                int num2 = sc.nextInt();
                num2 = vm.getRam() - num2;
                vm.setRam(num2);
            } else if (choice.equals("1")) {
                System.out.println(vmID+"号虚拟机一共有"+ vm.getBw()+"M"+"想要释放多少带宽?");
            } else if (choice.equals("0")) {
                break tar;
            }
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Log.printLine("Starting zzf...");

        while (true) {
            System.out.println("请输入用户ID进行操作或输入'exit'退出:");
            String userID = scanner.nextLine();

            if (userID.equals("exit")) {
                break;
            }

            System.out.println("选择操作:\n1. 查看IT资源\n2. 申请IT资源\n3. 释放IT资源\n请输入选项:");
            String choice = scanner.nextLine();

            switch (choice) {
                case "1":
                    viewResources(userID);
                    break;
                case "2":
                    applyResource(userID);
                    break;
                case "3":
                    System.out.println("请输入要释放的虚拟机ID:");
                    String vmID = scanner.nextLine();
                    releaseRes(userID, vmID);
                    break;
                default:
                    System.out.println("无效的选项,请重新输入.");
            }
        }

            Log.printLine("zzf finished!");
            scanner.close();
        }
}

报错位置:释放资源功能

报错信息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 对象之前,确保其存在。

相关推荐

  1. AIOps、微服务平台

    2024-06-14 11:06:01       35 阅读
  2. 计算服务

    2024-06-14 11:06:01       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-14 11:06:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-14 11:06:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-14 11:06:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-14 11:06:01       18 阅读

热门阅读

  1. vue设置点击自身以外其他区域关闭列表

    2024-06-14 11:06:01       5 阅读
  2. 查询ubuntu的ip方法

    2024-06-14 11:06:01       8 阅读
  3. 后端开发面试题5(附答案)

    2024-06-14 11:06:01       5 阅读
  4. 在Spring中如何手动开启事务(使用编程式事务)

    2024-06-14 11:06:01       9 阅读
  5. 【Go】十三、TOKEN机制与跨域处理方式

    2024-06-14 11:06:01       7 阅读
  6. Python类,面向对象详解

    2024-06-14 11:06:01       5 阅读
  7. windows命令帮助大全

    2024-06-14 11:06:01       5 阅读
  8. Codeforces Round 952 (Div. 4)

    2024-06-14 11:06:01       7 阅读
  9. 2024.6.13 刷题总结

    2024-06-14 11:06:01       8 阅读
  10. MySql几十万条数据,同时新增或者修改

    2024-06-14 11:06:01       6 阅读
  11. ELasticSearch数据迁移方案-elasticdump

    2024-06-14 11:06:01       6 阅读