117 lines
3.9 KiB
ReStructuredText
117 lines
3.9 KiB
ReStructuredText
.. only:: comment
|
|
|
|
© Crown-owned copyright 2025, Defence Science and Technology Laboratory UK
|
|
|
|
.. _network_node_adder:
|
|
|
|
Network Node Adder Module
|
|
#########################
|
|
|
|
This module provides a framework for adding nodes to a network in a standardised way. It defines a base class ``NetworkNodeAdder``, which can be extended to create specific node adders, and utility functions to calculate network infrastructure requirements.
|
|
|
|
The module allows you to use the pre-defined node adders, ``OfficeLANAdder``, or create custom ones by extending the base class.
|
|
|
|
How It Works
|
|
============
|
|
|
|
The main class in the module is ``NetworkNodeAdder``, which defines the interface for adding nodes to a network. Child classes are expected to:
|
|
|
|
1. Define a ``ConfigSchema`` nested class to define configuration options.
|
|
2. Implement the ``add_nodes_to_net(config, network)`` method, which adds the nodes to the network according to the configuration object.
|
|
|
|
The ``NetworkNodeAdder`` base class handles node adders defined in the primAITE config YAML file as well. It does this by keeping a registry of node adder classes, and uses the ``type`` field of the config to select the appropriate class to which to pass the configuration.
|
|
|
|
Example Usage
|
|
=============
|
|
|
|
Via Python API
|
|
--------------
|
|
|
|
Adding nodes to a network can be done using the python API by constructing the relevant ``ConfigSchema`` object like this:
|
|
|
|
.. code-block:: python
|
|
|
|
net = Network()
|
|
|
|
office_lan_config = OfficeLANAdder.ConfigSchema(
|
|
lan_name="CORP-LAN",
|
|
subnet_base=2,
|
|
pcs_ip_block_start=10,
|
|
num_pcs=8,
|
|
include_router=False,
|
|
bandwidth=150,
|
|
)
|
|
OfficeLANAdder.add_nodes_to_net(config=office_lan_config, network=net)
|
|
|
|
In this example, a network with 8 computers connected by a switch will be added to the network object.
|
|
|
|
|
|
Via YAML Config
|
|
---------------
|
|
|
|
.. code-block:: yaml
|
|
|
|
simulation:
|
|
network:
|
|
nodes:
|
|
# ... nodes go here
|
|
node_sets:
|
|
- type: office-lan
|
|
lan_name: CORP_LAN
|
|
subnet_base: 2
|
|
pcs_ip_block_start: 10
|
|
num_pcs: 8
|
|
include_router: False
|
|
bandwidth: 150
|
|
# ... additional node sets can be added below
|
|
|
|
``NetworkNodeAdder`` reads the ``type`` property of the config, then constructs and passes the configuration to ``OfficeLANAdder.add_nodes_to_net()``.
|
|
|
|
In this example, a network with 8 computers connected by a switch will be added to the network object. Equivalent to the above.
|
|
|
|
|
|
Creating Custom Node Adders
|
|
===========================
|
|
To create a custom node adder, subclass NetworkNodeAdder and define:
|
|
|
|
* A ConfigSchema class that defines the configuration schema for the node adder.
|
|
* The add_nodes_to_net method that implements how nodes should be added to the network.
|
|
|
|
Example: DataCenterAdder
|
|
------------------------
|
|
Here is an example of creating a custom node adder, DataCenterAdder:
|
|
|
|
.. code-block:: python
|
|
|
|
class DataCenterAdder(NetworkNodeAdder, discriminator="data-center"):
|
|
class ConfigSchema(NetworkNodeAdder.ConfigSchema):
|
|
type: Literal["data-center"] = "data-center"
|
|
num_servers: int
|
|
data_center_name: str
|
|
|
|
@classmethod
|
|
def add_nodes_to_net(cls, config: ConfigSchema, network: Network) -> None:
|
|
for i in range(config.num_servers):
|
|
server = Computer(
|
|
hostname=f"server_{i}_{config.data_center_name}",
|
|
ip_address=f"192.168.100.{i + 8}",
|
|
subnet_mask="255.255.255.0",
|
|
default_gateway="192.168.100.1",
|
|
start_up_duration=0
|
|
)
|
|
server.power_on()
|
|
network.add_node(server)
|
|
|
|
**Using the Custom Node Adder:**
|
|
|
|
.. code-block:: python
|
|
|
|
config = {
|
|
"type": "data-center",
|
|
"num_servers": 5,
|
|
"data_center_name": "dc1"
|
|
}
|
|
|
|
network = Network()
|
|
DataCenterAdder.from_config(config, network)
|