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

相关推荐
企业管理8MSaaS1 分钟前
如何选择适合Scrum团队的项目管理系统?
云计算·scrum
企业管理8MSaaS3 分钟前
如何在 Scrum 管理中化解团队冲突?
云计算·scrum
正在走向自律8 小时前
阿里云ESC服务器一次性全部迁移到另一个ESC
服务器·阿里云·云计算
OkeyProxy11 小时前
HTTP、HTTPS和SOCKS5代理協議
网络协议·https·云计算·代理服务器·海外ip代理
小峰编程14 小时前
独一无二,万字详谈——Linux之文件管理
linux·运维·服务器·云原生·云计算·ai原生
終不似少年遊*16 小时前
华为云计算HCIE笔记04
网络·华为云·云计算·学习笔记·hcie·认证·数据中心
神秘的土鸡17 小时前
LGMRec:结合局部与全局图学习的多模态推荐系统
目标检测·计算机视觉·云计算
♡喜欢做梦20 小时前
腾讯云云开发 Copilot 深度探索与实战分享
云计算·腾讯云·copilot·玩转云开发 copilot
HUIBUR科技21 小时前
人工智能与云计算的结合:如何释放数据的无限潜力?
人工智能·ai·云计算
云计算DevOps-韩老师21 小时前
【网络云计算】2024第52周-每日【2024/12/23】小测-理论&实操-解析
linux·运维·服务器·开发语言·网络·云计算·perl