#2266 - Fixed some minor bugs that prevented basic networks without a default gateway from being parsed. Completed the basic client-server P2P network documentation, file and retrieval method.
This commit is contained in:
@@ -29,7 +29,75 @@ and a Server on the same subnet with a single Link connecting the two.
|
|||||||
:width: 800
|
:width: 800
|
||||||
:align: center
|
:align: center
|
||||||
|
|
||||||
|
The yaml file contains two nodes in the ``simulation.network.nodes`` array, one with the `pc_1` reference and another
|
||||||
|
with the `server_1` reference. both nodes are given a node type, `pc_1` being a `computer` and `server_1` being a
|
||||||
|
`server`. Both nodes are then given an ip address and subnet mask.
|
||||||
|
|
||||||
|
The link between the two nodes is configured in the ``simulation.network.links`` array, with the hostname and network
|
||||||
|
interface for each being configured under ``endpoint_<a or b>_hostname`` and ``endpoint_<a or b>_port`` respectively.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
:linenos:
|
||||||
|
:emphasive-lines:
|
||||||
|
|
||||||
|
simulation:
|
||||||
|
network:
|
||||||
|
nodes:
|
||||||
|
- hostname: pc_1
|
||||||
|
type: computer
|
||||||
|
ip_address: 192.168.1.11
|
||||||
|
subnet_mask: 255.255.255.0
|
||||||
|
|
||||||
|
- hostname: server_1
|
||||||
|
type: server
|
||||||
|
ip_address: 192.168.1.13
|
||||||
|
subnet_mask: 255.255.255.0
|
||||||
|
|
||||||
|
links:
|
||||||
|
- endpoint_a_hostname: pc_1
|
||||||
|
endpoint_a_port: 1
|
||||||
|
endpoint_b_hostname: server_1
|
||||||
|
endpoint_b_port: 1
|
||||||
|
|
||||||
|
The following codeblock demonstrates how to access this network and all ``.show()`` to output the network details:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
from primaite.simulator.network.networks import client_server_p2p_network
|
||||||
|
|
||||||
|
network = client_server_p2p_network()
|
||||||
|
|
||||||
|
network.show()
|
||||||
|
|
||||||
|
Which gives the output:
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
+---------------------------------------+
|
||||||
|
| Nodes |
|
||||||
|
+----------+----------+-----------------+
|
||||||
|
| Node | Type | Operating State |
|
||||||
|
+----------+----------+-----------------+
|
||||||
|
| server_1 | Server | ON |
|
||||||
|
| pc_1 | Computer | ON |
|
||||||
|
+----------+----------+-----------------+
|
||||||
|
+------------------------------------------------------------------+
|
||||||
|
| IP Addresses |
|
||||||
|
+----------+------+--------------+---------------+-----------------+
|
||||||
|
| Node | Port | IP Address | Subnet Mask | Default Gateway |
|
||||||
|
+----------+------+--------------+---------------+-----------------+
|
||||||
|
| server_1 | 1 | 192.168.1.13 | 255.255.255.0 | None |
|
||||||
|
| pc_1 | 1 | 192.168.1.11 | 255.255.255.0 | None |
|
||||||
|
+----------+------+--------------+---------------+-----------------+
|
||||||
|
+------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
|
| Links |
|
||||||
|
+------------+----------------------------------------+------------+----------------------------------------+-------+-------------------+--------------+
|
||||||
|
| Endpoint A | A Port | Endpoint B | B Port | is Up | Bandwidth (MBits) | Current Load |
|
||||||
|
+------------+----------------------------------------+------------+----------------------------------------+-------+-------------------+--------------+
|
||||||
|
| pc_1 | Port 1: dd:70:be:52:b1:a9/192.168.1.11 | server_1 | Port 1: 17:3a:11:af:9b:b1/192.168.1.13 | True | 100.0 | 0.00000% |
|
||||||
|
+------------+----------------------------------------+------------+----------------------------------------+-------+-------------------+--------------+
|
||||||
|
|
||||||
#2. Basic Switched Network
|
#2. Basic Switched Network
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|||||||
@@ -1,3 +1,11 @@
|
|||||||
|
game:
|
||||||
|
ports:
|
||||||
|
- ARP
|
||||||
|
protocols:
|
||||||
|
- ICMP
|
||||||
|
- TCP
|
||||||
|
- UDP
|
||||||
|
|
||||||
simulation:
|
simulation:
|
||||||
network:
|
network:
|
||||||
nodes:
|
nodes:
|
||||||
@@ -8,7 +16,7 @@ simulation:
|
|||||||
|
|
||||||
- hostname: server_1
|
- hostname: server_1
|
||||||
type: server
|
type: server
|
||||||
ip_address: 192.168.1.11
|
ip_address: 192.168.1.13
|
||||||
subnet_mask: 255.255.255.0
|
subnet_mask: 255.255.255.0
|
||||||
|
|
||||||
links:
|
links:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""Manages the observation space for the agent."""
|
"""Manages the observation space for the agent."""
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from typing import Any, Dict, Iterable, Type
|
from typing import Any, Dict, Iterable, Type, Optional, Union
|
||||||
|
|
||||||
from gymnasium import spaces
|
from gymnasium import spaces
|
||||||
from gymnasium.core import ObsType
|
from gymnasium.core import ObsType
|
||||||
@@ -9,7 +9,7 @@ from pydantic import BaseModel, ConfigDict
|
|||||||
from primaite import getLogger
|
from primaite import getLogger
|
||||||
|
|
||||||
_LOGGER = getLogger(__name__)
|
_LOGGER = getLogger(__name__)
|
||||||
WhereType = Iterable[str | int] | None
|
WhereType = Optional[Iterable[Union[str, int]]]
|
||||||
|
|
||||||
|
|
||||||
class AbstractObservation(ABC):
|
class AbstractObservation(ABC):
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ the structure:
|
|||||||
```
|
```
|
||||||
"""
|
"""
|
||||||
from abc import abstractmethod
|
from abc import abstractmethod
|
||||||
from typing import Callable, Dict, Iterable, List, Optional, Tuple, Type, TYPE_CHECKING
|
from typing import Callable, Dict, Iterable, List, Optional, Tuple, Type, TYPE_CHECKING, Union
|
||||||
|
|
||||||
from typing_extensions import Never
|
from typing_extensions import Never
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ if TYPE_CHECKING:
|
|||||||
from primaite.game.agent.interface import AgentActionHistoryItem
|
from primaite.game.agent.interface import AgentActionHistoryItem
|
||||||
|
|
||||||
_LOGGER = getLogger(__name__)
|
_LOGGER = getLogger(__name__)
|
||||||
WhereType = Iterable[str | int] | None
|
WhereType = Optional[Iterable[Union[str, int]]]
|
||||||
|
|
||||||
|
|
||||||
class AbstractReward:
|
class AbstractReward:
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ class PrimaiteGame:
|
|||||||
hostname=node_cfg["hostname"],
|
hostname=node_cfg["hostname"],
|
||||||
ip_address=node_cfg["ip_address"],
|
ip_address=node_cfg["ip_address"],
|
||||||
subnet_mask=IPv4Address(node_cfg.get("subnet_mask", "255.255.255.0")),
|
subnet_mask=IPv4Address(node_cfg.get("subnet_mask", "255.255.255.0")),
|
||||||
default_gateway=node_cfg["default_gateway"],
|
default_gateway=node_cfg.get("default_gateway"),
|
||||||
dns_server=node_cfg.get("dns_server", None),
|
dns_server=node_cfg.get("dns_server", None),
|
||||||
operating_state=NodeOperatingState.ON
|
operating_state=NodeOperatingState.ON
|
||||||
if not (p := node_cfg.get("operating_state"))
|
if not (p := node_cfg.get("operating_state"))
|
||||||
@@ -255,7 +255,7 @@ class PrimaiteGame:
|
|||||||
hostname=node_cfg["hostname"],
|
hostname=node_cfg["hostname"],
|
||||||
ip_address=node_cfg["ip_address"],
|
ip_address=node_cfg["ip_address"],
|
||||||
subnet_mask=IPv4Address(node_cfg.get("subnet_mask", "255.255.255.0")),
|
subnet_mask=IPv4Address(node_cfg.get("subnet_mask", "255.255.255.0")),
|
||||||
default_gateway=node_cfg["default_gateway"],
|
default_gateway=node_cfg.get("default_gateway"),
|
||||||
dns_server=node_cfg.get("dns_server", None),
|
dns_server=node_cfg.get("dns_server", None),
|
||||||
operating_state=NodeOperatingState.ON
|
operating_state=NodeOperatingState.ON
|
||||||
if not (p := node_cfg.get("operating_state"))
|
if not (p := node_cfg.get("operating_state"))
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
from ipaddress import IPv4Address
|
from ipaddress import IPv4Address
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from primaite import PRIMAITE_PATHS
|
||||||
|
from primaite.game.game import PrimaiteGame
|
||||||
from primaite.simulator.network.container import Network
|
from primaite.simulator.network.container import Network
|
||||||
from primaite.simulator.network.hardware.nodes.host.computer import Computer
|
from primaite.simulator.network.hardware.nodes.host.computer import Computer
|
||||||
from primaite.simulator.network.hardware.nodes.host.host_node import NIC
|
from primaite.simulator.network.hardware.nodes.host.host_node import NIC
|
||||||
@@ -279,3 +283,13 @@ def arcd_uc2_network() -> Network:
|
|||||||
router_1.acl.add_rule(action=ACLAction.PERMIT, src_port=Port.HTTP, dst_port=Port.HTTP, position=3)
|
router_1.acl.add_rule(action=ACLAction.PERMIT, src_port=Port.HTTP, dst_port=Port.HTTP, position=3)
|
||||||
|
|
||||||
return network
|
return network
|
||||||
|
|
||||||
|
|
||||||
|
def client_server_p2p_network_example() -> Network:
|
||||||
|
path = PRIMAITE_PATHS.user_config_path / "example_config" / "client-server-p2p-network-example.yaml"
|
||||||
|
with open(path, "r") as file:
|
||||||
|
cfg = yaml.safe_load(file)
|
||||||
|
|
||||||
|
game = PrimaiteGame.from_config(cfg)
|
||||||
|
|
||||||
|
return game.simulation.network
|
||||||
|
|||||||
Reference in New Issue
Block a user