云服务平台仿真-身份认证/授权/申请和释放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 对象之前,确保其存在。

相关推荐
₯㎕星空&繁华14 小时前
阿里云服务器安装MySQL服务器
服务器·ubuntu·阿里云·云计算
你的大佬9991 天前
阿里云百炼ai模型
人工智能·阿里云·云计算
一只栖枝1 天前
备考华为HCIA - 云计算,培训与自学到底该怎么选?
云计算·华为认证·hcia·考证·职业规划
数据与人工智能律师1 天前
AI的法治迷宫:技术层、模型层、应用层的法律痛点
大数据·网络·人工智能·云计算·区块链
荣光波比2 天前
Docker(三)—— Docker Compose 编排与 Harbor 私有仓库实战指南
运维·docker·容器·云计算
企鹅侠客2 天前
mysqldump导入备份数据到阿里云RDS会报错吗
阿里云·adb·云计算
iHero2 天前
【Jitsi Meet】阿里云Docker安装Jitsi Meet后的调整
阿里云·docker·云计算
荣光波比2 天前
Ansible(三)—— 使用Ansible自动化部署LNMP环境实战指南
运维·自动化·云计算·ansible
荣光波比2 天前
Docker(五)—— Docker Compose 一键搭建 LNMP 架构并部署 WordPress
运维·docker·容器·云计算
mjhcsp3 天前
深入解析 IDM 插件开发挑战赛:技术要点与实践指南
服务器·阿里云·云计算