SimPlacement.placement

View Source
import abc
from typing import List, Dict, Any

from SimPlacement.entity import Entity
from SimPlacement.entities.node import Node
from SimPlacement.entities.sfc_request import SFCRequest
from SimPlacement.types import Resource


class Placement(Entity):
    """
    Abstracted class of all the concrete placement implementations
    """
    def __init__(self, name: str, extra_parameters: dict = None):
        """
        Create the placement.

        :param name: The name of the placement.
        :param extra_parameters: Extra parameters used to customize the environment.
        """
        super().__init__(name, extra_parameters)
        self.domain_name = ""
        self.environment: Dict[str, Any] = dict()

        self.__reserved_resource: Dict[str, Resource] = dict()
        """
        Store data about the reserved resources in the node.
        Only used to internal control in the placement.
        """

    def reserve_resource(self, node: Node, resource: Resource):
        """
        Store the resource reserved in the node.

        :param node: The node object.
        :param resource: The resource that will be reserved.
        :return:
        """
        if node.name in self.__reserved_resource.keys():
            self.__reserved_resource[node.name]['cpu'] += resource['cpu']
            self.__reserved_resource[node.name]['mem'] += resource['mem']
        else:
            self.__reserved_resource[node.name] = Resource(cpu=resource['cpu'], mem=resource['mem'])

    def reserved_resource(self, node: Node) -> Resource:
        """
        Return the reserved resources.

        :param node: The node object
        :return: Resource
        """
        if node.name in self.__reserved_resource.keys():
            return self.__reserved_resource[node.name]

        return Resource(cpu=0, mem=0)

    def free_reserved_resource(self, node: Node) -> Resource:
        """
        Release the reserved resources of a node.

        :param node: The node object.
        :return: Resource
        """
        self.__reserved_resource[node.name] = Resource(cpu=0, mem=0)

        return self.__reserved_resource[node.name]

    def free_all_reserved_resource(self):
        """
        Release all the reserved resources.
        """
        self.__reserved_resource = dict()

    def get_reserved_resource(self):
        """
        Return the reserved resources.
        """
        return self.__reserved_resource

    def get_domain(self):
        """
        Return the domain where the placement runs
        :return:
        """
        return self.environment['domains'][self.domain_name]

    def get_nodes(self) -> Dict[str, Node]:
        """
        Return all the nodes in the domain.
        :return:
        """
        return self.environment['domains'][self.domain_name].nodes

    @property
    def domain_name(self):
        """
        The domain where the placement component runs.
        """
        return self._domain_name

    @domain_name.setter
    def domain_name(self, value):
        """
        Set the domain_name.
        """
        self._domain_name = value

    @abc.abstractmethod
    def add_sfc_requests(self, sfc_requests: List[SFCRequest]):  # pragma: no cover
        """
        Add a list of SFC Request to be placed
        :param sfc_requests: List of SFC Requests
        :return:
        """
        return

    @abc.abstractmethod
    def add_sfc_request(self, sfc_request: SFCRequest):  # pragma: no cover
        """
        Add an SFC Request to be placed
        :param sfc_request: SFC Request object
        :return:
        """
        return

    @abc.abstractmethod
    def run(self, time: int):  # pragma: no cover
        """
        This performs the placement algorithm

        A dict will be return with the placement plan.

        The format can be seen above:

        ```json
        {
            "sfc_request_name": "sr_1",
            "success": true,
            "time": 0,
            "vnfs": {
                "vnf_1": {
                    "node_name": "n_1",
                    "virtual_link_path": [
                        [
                            "n_1",
                            "n_2",
                            0
                        ]
                    ],
                    "vnf_instance_name": ""
                },
                "vnf_2": {
                    "node_name": "n_2",
                    "virtual_link_path": [],
                    "vnf_instance_name": ""
                }
            }
        }
        ```
        :param time: simulation time
        :return: placement plan
        """
        return
#   class Placement(SimPlacement.entity.Entity):
View Source
class Placement(Entity):
    """
    Abstracted class of all the concrete placement implementations
    """
    def __init__(self, name: str, extra_parameters: dict = None):
        """
        Create the placement.

        :param name: The name of the placement.
        :param extra_parameters: Extra parameters used to customize the environment.
        """
        super().__init__(name, extra_parameters)
        self.domain_name = ""
        self.environment: Dict[str, Any] = dict()

        self.__reserved_resource: Dict[str, Resource] = dict()
        """
        Store data about the reserved resources in the node.
        Only used to internal control in the placement.
        """

    def reserve_resource(self, node: Node, resource: Resource):
        """
        Store the resource reserved in the node.

        :param node: The node object.
        :param resource: The resource that will be reserved.
        :return:
        """
        if node.name in self.__reserved_resource.keys():
            self.__reserved_resource[node.name]['cpu'] += resource['cpu']
            self.__reserved_resource[node.name]['mem'] += resource['mem']
        else:
            self.__reserved_resource[node.name] = Resource(cpu=resource['cpu'], mem=resource['mem'])

    def reserved_resource(self, node: Node) -> Resource:
        """
        Return the reserved resources.

        :param node: The node object
        :return: Resource
        """
        if node.name in self.__reserved_resource.keys():
            return self.__reserved_resource[node.name]

        return Resource(cpu=0, mem=0)

    def free_reserved_resource(self, node: Node) -> Resource:
        """
        Release the reserved resources of a node.

        :param node: The node object.
        :return: Resource
        """
        self.__reserved_resource[node.name] = Resource(cpu=0, mem=0)

        return self.__reserved_resource[node.name]

    def free_all_reserved_resource(self):
        """
        Release all the reserved resources.
        """
        self.__reserved_resource = dict()

    def get_reserved_resource(self):
        """
        Return the reserved resources.
        """
        return self.__reserved_resource

    def get_domain(self):
        """
        Return the domain where the placement runs
        :return:
        """
        return self.environment['domains'][self.domain_name]

    def get_nodes(self) -> Dict[str, Node]:
        """
        Return all the nodes in the domain.
        :return:
        """
        return self.environment['domains'][self.domain_name].nodes

    @property
    def domain_name(self):
        """
        The domain where the placement component runs.
        """
        return self._domain_name

    @domain_name.setter
    def domain_name(self, value):
        """
        Set the domain_name.
        """
        self._domain_name = value

    @abc.abstractmethod
    def add_sfc_requests(self, sfc_requests: List[SFCRequest]):  # pragma: no cover
        """
        Add a list of SFC Request to be placed
        :param sfc_requests: List of SFC Requests
        :return:
        """
        return

    @abc.abstractmethod
    def add_sfc_request(self, sfc_request: SFCRequest):  # pragma: no cover
        """
        Add an SFC Request to be placed
        :param sfc_request: SFC Request object
        :return:
        """
        return

    @abc.abstractmethod
    def run(self, time: int):  # pragma: no cover
        """
        This performs the placement algorithm

        A dict will be return with the placement plan.

        The format can be seen above:

        ```json
        {
            "sfc_request_name": "sr_1",
            "success": true,
            "time": 0,
            "vnfs": {
                "vnf_1": {
                    "node_name": "n_1",
                    "virtual_link_path": [
                        [
                            "n_1",
                            "n_2",
                            0
                        ]
                    ],
                    "vnf_instance_name": ""
                },
                "vnf_2": {
                    "node_name": "n_2",
                    "virtual_link_path": [],
                    "vnf_instance_name": ""
                }
            }
        }
        ```
        :param time: simulation time
        :return: placement plan
        """
        return

Abstracted class of all the concrete placement implementations

#   Placement(name: str, extra_parameters: dict = None)
View Source
    def __init__(self, name: str, extra_parameters: dict = None):
        """
        Create the placement.

        :param name: The name of the placement.
        :param extra_parameters: Extra parameters used to customize the environment.
        """
        super().__init__(name, extra_parameters)
        self.domain_name = ""
        self.environment: Dict[str, Any] = dict()

        self.__reserved_resource: Dict[str, Resource] = dict()
        """
        Store data about the reserved resources in the node.
        Only used to internal control in the placement.
        """

Create the placement.

Parameters
  • name: The name of the placement.
  • extra_parameters: Extra parameters used to customize the environment.
#   domain_name

The domain where the placement component runs.

#   def reserve_resource( self, node: SimPlacement.entities.node.Node, resource: SimPlacement.types.Resource ):
View Source
    def reserve_resource(self, node: Node, resource: Resource):
        """
        Store the resource reserved in the node.

        :param node: The node object.
        :param resource: The resource that will be reserved.
        :return:
        """
        if node.name in self.__reserved_resource.keys():
            self.__reserved_resource[node.name]['cpu'] += resource['cpu']
            self.__reserved_resource[node.name]['mem'] += resource['mem']
        else:
            self.__reserved_resource[node.name] = Resource(cpu=resource['cpu'], mem=resource['mem'])

Store the resource reserved in the node.

Parameters
  • node: The node object.
  • resource: The resource that will be reserved.
Returns
#   def reserved_resource( self, node: SimPlacement.entities.node.Node ) -> SimPlacement.types.Resource:
View Source
    def reserved_resource(self, node: Node) -> Resource:
        """
        Return the reserved resources.

        :param node: The node object
        :return: Resource
        """
        if node.name in self.__reserved_resource.keys():
            return self.__reserved_resource[node.name]

        return Resource(cpu=0, mem=0)

Return the reserved resources.

Parameters
  • node: The node object
Returns

Resource

#   def free_reserved_resource( self, node: SimPlacement.entities.node.Node ) -> SimPlacement.types.Resource:
View Source
    def free_reserved_resource(self, node: Node) -> Resource:
        """
        Release the reserved resources of a node.

        :param node: The node object.
        :return: Resource
        """
        self.__reserved_resource[node.name] = Resource(cpu=0, mem=0)

        return self.__reserved_resource[node.name]

Release the reserved resources of a node.

Parameters
  • node: The node object.
Returns

Resource

#   def free_all_reserved_resource(self):
View Source
    def free_all_reserved_resource(self):
        """
        Release all the reserved resources.
        """
        self.__reserved_resource = dict()

Release all the reserved resources.

#   def get_reserved_resource(self):
View Source
    def get_reserved_resource(self):
        """
        Return the reserved resources.
        """
        return self.__reserved_resource

Return the reserved resources.

#   def get_domain(self):
View Source
    def get_domain(self):
        """
        Return the domain where the placement runs
        :return:
        """
        return self.environment['domains'][self.domain_name]

Return the domain where the placement runs

Returns
#   def get_nodes(self) -> Dict[str, SimPlacement.entities.node.Node]:
View Source
    def get_nodes(self) -> Dict[str, Node]:
        """
        Return all the nodes in the domain.
        :return:
        """
        return self.environment['domains'][self.domain_name].nodes

Return all the nodes in the domain.

Returns
#  
@abc.abstractmethod
def add_sfc_requests( self, sfc_requests: List[SimPlacement.entities.sfc_request.SFCRequest] ):
View Source
    @abc.abstractmethod
    def add_sfc_requests(self, sfc_requests: List[SFCRequest]):  # pragma: no cover
        """
        Add a list of SFC Request to be placed
        :param sfc_requests: List of SFC Requests
        :return:
        """
        return

Add a list of SFC Request to be placed

Parameters
  • sfc_requests: List of SFC Requests
Returns
#  
@abc.abstractmethod
def add_sfc_request(self, sfc_request: SimPlacement.entities.sfc_request.SFCRequest):
View Source
    @abc.abstractmethod
    def add_sfc_request(self, sfc_request: SFCRequest):  # pragma: no cover
        """
        Add an SFC Request to be placed
        :param sfc_request: SFC Request object
        :return:
        """
        return

Add an SFC Request to be placed

Parameters
  • sfc_request: SFC Request object
Returns
#  
@abc.abstractmethod
def run(self, time: int):
View Source
    @abc.abstractmethod
    def run(self, time: int):  # pragma: no cover
        """
        This performs the placement algorithm

        A dict will be return with the placement plan.

        The format can be seen above:

        ```json
        {
            "sfc_request_name": "sr_1",
            "success": true,
            "time": 0,
            "vnfs": {
                "vnf_1": {
                    "node_name": "n_1",
                    "virtual_link_path": [
                        [
                            "n_1",
                            "n_2",
                            0
                        ]
                    ],
                    "vnf_instance_name": ""
                },
                "vnf_2": {
                    "node_name": "n_2",
                    "virtual_link_path": [],
                    "vnf_instance_name": ""
                }
            }
        }
        ```
        :param time: simulation time
        :return: placement plan
        """
        return

This performs the placement algorithm

A dict will be return with the placement plan.

The format can be seen above:

{
    "sfc_request_name": "sr_1",
    "success": true,
    "time": 0,
    "vnfs": {
        "vnf_1": {
            "node_name": "n_1",
            "virtual_link_path": [
                [
                    "n_1",
                    "n_2",
                    0
                ]
            ],
            "vnf_instance_name": ""
        },
        "vnf_2": {
            "node_name": "n_2",
            "virtual_link_path": [],
            "vnf_instance_name": ""
        }
    }
}
Parameters
  • time: simulation time
Returns

placement plan