package org.cloudbus.cloudsim.examples;

import org.cloudbus.cloudsim.Cloudlet;
import org.cloudbus.cloudsim.CloudletSchedulerTimeShared;
import org.cloudbus.cloudsim.Datacenter;
import org.cloudbus.cloudsim.DatacenterBroker;
import org.cloudbus.cloudsim.DatacenterCharacteristics;
import org.cloudbus.cloudsim.Host;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.Pe;
import org.cloudbus.cloudsim.Storage;
import org.cloudbus.cloudsim.UtilizationModel;
import org.cloudbus.cloudsim.UtilizationModelFull;
import org.cloudbus.cloudsim.Vm;
import org.cloudbus.cloudsim.VmAllocationPolicySimple;
import org.cloudbus.cloudsim.VmSchedulerTimeShared;
import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.provisioners.BwProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.PeProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;


import java.util.ArrayList;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;

/**
 * ClassName CloudsimFCFS
 * Description
 * Create by HW
 * Date 2021/8/20 21:37
 */
public class CloudsimFCFS {

    private  static List<Cloudlet> cloudletList;

    /**
     * 创建相关的虚拟机列表
     */
    private static  List<Vm> VmList;

    /**
     * 对创建的虚拟机列表进行赋值
     */
    private static List<Vm> createVm(int userId,int Vms){
        LinkedList<Vm> vmLinkedList=new LinkedList<>();
        //Vm parameters
        long size=10000;//image size
        int ram=512;
        int mips=1000;
        int bw=1000;
        int peNumber=1;//运算的处理单元
        String vmm="Xen";

        //create Vm
        Vm[] vms=new Vm[Vms];
        for (int i=0;i<Vms;i++){
            vms[i]=new Vm(i,userId,mips*(i+10),peNumber,ram,bw,size,vmm,new CloudletSchedulerTimeShared());
            vmLinkedList.add(vms[i]);
        }
        return vmLinkedList;
    }

    //创建相关的云任务
    private static List<Cloudlet> createCloudletList(int userId,int CloudletNumber){
        LinkedList<Cloudlet> list=new LinkedList<>();

        //cloudtlet parameter
        long length=1000;
        long filesize=300;
        long outputsize=300;
        int peNumber=1;

        UtilizationModel utilizationModel = new UtilizationModelFull();
        Cloudlet[] cloudlets=new Cloudlet[CloudletNumber];

        for (int i = 0; i < CloudletNumber; i++) {
            cloudlets[i]=new Cloudlet(i,(length+2*i*10),peNumber,filesize,outputsize,utilizationModel,utilizationModel,utilizationModel);
            cloudlets[i].setUserId(userId);
            list.add(cloudlets[i]);
        }
        return list;
    }
    @SuppressWarnings("unused")
    public static void main(String[] args) {
        Log.printLine("开始进行模拟");
        try {
            int num_user=1;//创建相关的grid users
            Calendar calendar = Calendar.getInstance();
            boolean trace_flag=false;

            CloudSim.init(num_user,calendar,trace_flag);

            //创建一个数据中心
            Datacenter datacenter0 =createDatacenter("Datacenter_0");
            @SuppressWarnings("unused")
            Datacenter datacenter1 =createDatacenter("Datacenter_1");
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    //创建数据中心
    private static Datacenter createDatacenter(String name) {

        // Here are the steps needed to create a PowerDatacenter:
        // 1. We need to create a list to store
        // our machine
        List<Host> hostList = new ArrayList<Host>();

        // 2. A Machine contains one or more PEs or CPUs/Cores.
        // In this example, it will have only one core.
        List<Pe> peList = new ArrayList<Pe>();

        int mips = 1000;

        // 3. Create PEs and add these into a list.
        peList.add(new Pe(0, new PeProvisionerSimple(mips))); // need to store Pe id and MIPS Rating

        // 4. Create Host with its id and list of PEs and add them to the list
        // of machines
        int hostId = 0;
        int ram = 2048; // host memory (MB)
        long storage = 1000000; // host storage
        int bw = 10000;

        hostList.add(
                new Host(
                        hostId,
                        new RamProvisionerSimple(ram),
                        new BwProvisionerSimple(bw),
                        storage,
                        peList,
                        new VmSchedulerTimeShared(peList)
                )
        ); // This is our machine

        // 5. Create a DatacenterCharacteristics object that stores the
        // properties of a data center: architecture, OS, list of
        // Machines, allocation policy: time- or space-shared, time zone
        // and its price (G$/Pe time unit).
        String arch = "x86"; // system architecture
        String os = "Linux"; // operating system
        String vmm = "Xen";
        double time_zone = 10.0; // time zone this resource located
        double cost = 3.0; // the cost of using processing in this resource
        double costPerMem = 0.05; // the cost of using memory in this resource
        double costPerStorage = 0.001; // the cost of using storage in this
        // resource
        double costPerBw = 0.0; // the cost of using bw in this resource
        LinkedList<Storage> storageList = new LinkedList<Storage>(); // we are not adding SAN
        // devices by now

        DatacenterCharacteristics characteristics = new DatacenterCharacteristics(
                arch, os, vmm, hostList, time_zone, cost, costPerMem,
                costPerStorage, costPerBw);

        // 6. Finally, we need to create a PowerDatacenter object.
        Datacenter datacenter = null;
        try {
            datacenter = new Datacenter(name, characteristics, new VmAllocationPolicySimple(hostList), storageList, 0);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return datacenter;
    }
}




