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
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
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
View Source
def free_all_reserved_resource(self): """ Release all the reserved resources. """ self.__reserved_resource = dict()
Release all the reserved resources.
View Source
def get_reserved_resource(self): """ Return the reserved resources. """ return self.__reserved_resource
Return the reserved resources.
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
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
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