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

news2024/11/26 23:35:02

实验名称

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1808682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tkinter菜单栏

tkinter菜单栏 菜单栏效果代码 菜单栏 在 Tkinter 中&#xff0c;Menu 组件用于创建菜单栏、下拉菜单和上下文菜单&#xff0c;是构建图形用户界面&#xff08;GUI&#xff09;应用程序的常见需求。 效果 代码 import tkinter as tk from tkinter import messagebox# 创建主…

linux安装jdk + docker+dockercompose+aliyunACR

下载安装包 链接&#xff1a;https://pan.baidu.com/s/1AyFvPA5qwy4IxfZoTQohrQ 提取码&#xff1a;6666 安装jdk jdk-8u411-linux-x64.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1BZ7J4L5PY-9nuQyxBMDGTA 提取码&#xff1a;6666 1、解压jdk tar -xvf jdk-8u411-li…

上市公司短视主义数据集(2001-2022年)

数据简介&#xff1a;上市公司短视主义是指公司管理层过于关注短期业绩和股价表现&#xff0c;而忽视公司的长期发展和战略规划。这种短视行为可能会导致公司投资决策的失误&#xff0c;影响公司的长期竞争力。 在上市公司年度报告年度中&#xff0c;通过已有的反映管理者“短…

SpringBoot的Mybatis-plus实战之基础知识

文章目录 MybatisPlus 介绍一、MyBatisPlus 集成步骤第一步、引入依赖第二步、定义mapper 二、注解TableNameTableldTableField 三、配置文件四、加解密实现步骤 在SpringBoot项目中使用Mybatis-plus&#xff0c;记录下来&#xff0c;方便备查。 MybatisPlus 介绍 为简化开发而…

C语言 图形化界面方式连接MySQL【C/C++】【图形化界面组件分享】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一.配置开发环境 二…

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册

晨控CK-UR12-E01与欧姆龙NX/NJ系列EtherNet/IP通讯手册 晨控CK-UR12-E01 是天线一体式超高频读写器头&#xff0c;工作频率默认为902MHz&#xff5e;928MHz&#xff0c;符合EPC Global Class l Gen 2&#xff0f;IS0-18000-6C 标准&#xff0c;最大输出功率 33dBm。读卡器同时…

41 mysql subquery 的实现

前言 sub query 是一个我们经常会使用到的一个 用法 我们这里 看一看各个场景下面的 sub query 的相关处理 查看 本文, 需要 先看一下 join 的相关处理 测试数据表如下, 两张测试表, tz_test, tz_test03, 表结构 一致 CREATE TABLE tz_test (id int(11) unsigned NOT NUL…

HTML静态网页成品作业(HTML+CSS)—— 名人霍金介绍网页(6个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有6个页面。 二、作品演示 三、代…

千万别买BBA 有40万+预算冲它就对了

文 | Auto芯球 作者 | 擎天 如果现在买BBA 不是纯纯大冤种吗&#xff1f; 有钱就无脑冲M9啊 不然肯定会后悔 这话说给所有有40万预算的朋友听 别不信 今天我才看到一组数据 从4月29号到6月2号 短短五周时间 问界M9就卖了1.82万辆 在40万以上的国产车中遥遥领先 比…

ChatTTS改良版 - 新增精选高品质音色,新增超长文本推理,新增api接口

这个版本是ChatTTS的一个分支&#xff0c;基于ChatTTS修改&#xff0c;由6drf21e大佬改良&#xff0c;大佬GitHub地址 GitHub - 6drf21e/ChatTTS_colab: &#x1f680; 一键部署&#xff08;含离线整合包&#xff09;&#xff01;基于 ChatTTS &#xff0c;支持音色抽卡、长音频…

港中文斯坦福提出SD加速模型PCM,一步即可生成图像和视频,可直接与SD1.5,SDXL,AnimateLCM结合!

又有新的SD加速模型可以用了&#xff0c;PCM解决了原来LCM模型的各种问题。并且对 AnimateLCM 也做了优化&#xff0c;用PCM直接生成动画也可以保证质量了。 PCM从这三个角度说明了LCM的设计空间是有限的并很好地解决了这些限制。 PCM主要改善了三个LCM原有的问题&#xff1a;…

【Labview】通过串口通信从上位机读取和写入数据

最近博主需要通过Labview的上位机控制一个温控仪表&#xff0c;主要实现在上位机读取实时温度和设定的目标温度&#xff0c;以及通过上位机设定目标温度。这里将其中遇到的问题和心得分享给大家&#xff0c;博主自己也做一个记录。 由于温控仪表采用的485通讯&#xff0c;modb…

阿里云邮件推送服务配置教程:怎么做批发?

阿里云邮件推送的API配置步骤&#xff1f;配置教程有哪些步骤&#xff1f; 阿里云邮件推送服务凭借其高并发、稳定性强和安全性高等特点&#xff0c;成为众多企业的首选。Aok将详细介绍如何使用阿里云邮件推送服务进行批发配置&#xff0c;并简要提及AokSend的优势。 阿里云邮…

DeepSORT(目标跟踪算法)中的数值表格与调参的关系

DeepSORT&#xff08;目标跟踪算法&#xff09;中的数值表格与调参的关系 flyfish DeepSORT&#xff08;目标跟踪算法&#xff09;中的马氏距离详解&#xff08;很详细&#xff09; DeepSORT&#xff08;目标跟踪算法&#xff09;中 可以设置阈值进行异常检测或目标跟踪的原…

Xilinx(AMD) vivado对FPGA网表文件进行功能仿真的方法

1 概述 在FPGA开发中很多商用IP核出于知识产权保护的目的&#xff0c;不提供源代码&#xff0c;而是提供综合后的FPGA网表。由于没有源代码&#xff0c;也无法对网表文件直接进行仿真的操作来验证功能&#xff0c;此时需要独立的仿真模型文件。 本文介绍在Xilinx(AMD) vivado软…

阻塞队列和线程池

一、什么是阻塞队列 1.1 什么是队列 队列是先进先出。 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作&#xff0c;和栈一样&#xff0c;队…

数据可视化Python实现超详解【数据分析】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 Python 初阶 Python–语言基础与由来介绍 Python–…

深度学习模型的生命周期与推理系统架构

目录 深度学习模型的生命周期 ​编辑 深度学习模型的生命周期 推理相比训练的新特点与挑战 推理系统架构 推理系统 vs 推理引擎 顶层:API接口和模型转换 中层:运行时(计算引擎) 底层:硬件级优化 边缘设备计算 主要问题 边缘部署和推理方式 方式1:边缘设备计…

0元白嫖阿里云4G内存云服务器——感谢伟大的CSDN和阿里云

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) 学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程-CSDN博客 目录 1、学生认证领取300元优惠券 ​2、购买云服务器 1、学生认证领取…

Upscayl:款利用人工智能技术,深度学习算法,实现图像无损放大和增强的强大工具。

Upscayl AI&#xff1a; Upscayl AI是一款基于先进的人工智能技术&#xff0c;特别是深度学习算法开发的图像增强工具。它能够智能地分析并改善图像质量&#xff0c;实现无损放大、细节重建和模糊消除&#xff0c;让老旧、低分辨率或模糊的照片焕发新生&#xff0c;达到高清画…