Metadata-Version: 2.1
Name: PyCloudSim
Version: 1.0.2
Summary: A small example package
Author-email: Yifei Ren <ryf0510@live.com>
Project-URL: Homepage, https://ulfaric.github.io/PyCloudSim-dev/
Project-URL: Bug Tracker, https://ulfaric.github.io/PyCloudSim-dev/issues
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.7
Description-Content-Type: text/markdown
Requires-Dist: bitmath
Requires-Dist: networkx
Requires-Dist: Akatosh

#Quick Start Guide

##Installation

PyCloudSIm can be easily installed via pip with:

    pip install -U PyCloudSim

Its dependencies will be automatically installed!

##Basic Example

Let's sceipt a basic example of simulation that consists five vHost, one switch and two vMicroservice. To start, we firstly import the modules:

    from PyCloudSim.entity import vDefaultMicroservice, vHost, vSwitch

Then, we can create a core switch that connects all the simulated hosts:

    core_switch = vSwitch(
        ipc=1,
        frequency=5000,
        num_cores=4,
        cpu_tdps=150,
        cpu_mode=1,
        ram=8,
        rom=16,
        subnet=IPv4Network("192.168.0.0/24"),
        label="Core",
        create_at=0,
    )
    core_switch.power_on(0)

Remeber you must call the power on function to actualy power on the simulated switch. Then, we create our hosts and link them with the switch:

    hosts: List[vHost] = []
    for i in range(5):
        host = vHost(
            ipc=1,
            frequency=5000,
            num_cores=4,
            cpu_tdps=150,
            cpu_mode=2,
            ram=2,
            rom=16,
            label=str(i),
            create_at=0,
        )

        host.power_on(0)
        simulation.network.add_link(host, core_switch, 1, 0)
        hosts.append(host)

Next, we create our microservices:

    ms_1 = vDefaultMicroservice(
        cpu=100,
        cpu_limit=500,
        ram=500,
        ram_limit=1000,
        label="test 1",
        image_size=100,
        create_at=0,
        deamon=True,
        min_num_instances=2,
        max_num_instances=4,
    )

    ms_2 = vDefaultMicroservice(
        cpu=100,
        cpu_limit=500,
        ram=500,
        ram_limit=1000,
        label="test 2",
        image_size=100,
        create_at=0,
        deamon=True,
        min_num_instances=3,
        max_num_instances=4,
    )

The "vDefaultMicroservice" is similar to a Kubernetes deployment that the number of container instances schedule up and down based on the utilization threshold. The default configuration is scale up whenever CPU or RAM reach 80% and scale down when they reach 20%.

Next, we create simulated API calls that engages with the microservice:

from Akatosh import instant_event

    @instant_event(at=0.11)
    def test():
        test = vAPICall(
            src=ms_1,
            dst=ms_2,
            src_process_length=10,
            dst_process_length=10,
            ack_process_length=10,
            num_src_packets=10,
            num_ret_packets=10,
            num_ack_packets=10,
            src_packet_size=100,
            ret_packet_size=100,
            ack_packet_size=100,
            priority=1,
            create_at=0.11,
            label="test",
        )
        
        post_test = vAPICall(
            src=ms_2,
            dst=ms_1,
            src_process_length=10,
            dst_process_length=10,
            ack_process_length=10,
            num_src_packets=10,
            num_ret_packets=10,
            num_ack_packets=10,
            src_packet_size=100,
            ret_packet_size=100,
            ack_packet_size=100,
            priority=1,
            create_at=0.11,
            label="Post test",
            precursor=test,
        )

In this simple example, we simply one API call after another. You can create a SFC process with a group of API Calls chaining together. This example can be considered as an SFC with two microservices only.

Next, we set the container scheduler and use a built in container monitor:

    from PyCloudSim.monitor.container_monitor import LoggingContainerMonitor
    from PyCloudSim.scheduler import DefaultContainerScheduler

    DefaultContainerScheduler()

    LoggingContainerMonitor(label="Container Monitor", sample_period=0.01)

Finally, we start the simulation:

    simulation.debug(False)
    simulation.simulate(1.5)
