mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-03 05:51:15 +02:00
Use generic symbol names
This commit is contained in:
1 parent
b7f4a4cbda
commit
bfbac2e93a
15 files changed
+70
-44
No files matched your search
@@ -19,7 +19,7 @@
|
||||
CLASSIC_SYMBOL_THEME = {
|
||||
"cloud": ":/symbols/classic/cloud.svg",
|
||||
"ethernet_switch": ":/symbols/classic/ethernet_switch.svg",
|
||||
"ethernet_hub": ":/symbols/classic/hub.svg",
|
||||
"hub": ":/symbols/classic/hub.svg",
|
||||
"frame_relay_switch": ":/symbols/classic/frame_relay_switch.svg",
|
||||
"atm_switch": ":/symbols/classic/atm_switch.svg",
|
||||
"router": ":/symbols/classic/router.svg",
|
||||
@@ -36,8 +36,8 @@ CLASSIC_SYMBOL_THEME = {
|
||||
AFFINITY_SQUARE_BLUE_SYMBOL_THEME = {
|
||||
"cloud": ":/symbols/affinity/square/blue/cloud.svg",
|
||||
"ethernet_switch": ":/symbols/affinity/square/blue/switch.svg",
|
||||
"ethernet_hub": ":/symbols/affinity/square/blue/hub.svg",
|
||||
"frame_relay_switch.svg": ":/symbols/affinity/square/blue/isdn.svg",
|
||||
"hub": ":/symbols/affinity/square/blue/hub.svg",
|
||||
"frame_relay_switch": ":/symbols/affinity/square/blue/isdn.svg",
|
||||
"atm_switch": ":/symbols/affinity/square/blue/atm.svg",
|
||||
"router": ":/symbols/affinity/square/blue/router.svg",
|
||||
"multilayer_switch": ":/symbols/affinity/square/blue/switch_multilayer.svg",
|
||||
@@ -53,7 +53,7 @@ AFFINITY_SQUARE_BLUE_SYMBOL_THEME = {
|
||||
AFFINITY_SQUARE_RED_SYMBOL_THEME = {
|
||||
"cloud": ":/symbols/affinity/square/red/cloud.svg",
|
||||
"ethernet_switch": ":/symbols/affinity/square/red/switch.svg",
|
||||
"ethernet_hub": ":/symbols/affinity/square/red/hub.svg",
|
||||
"hub": ":/symbols/affinity/square/red/hub.svg",
|
||||
"frame_relay_switch": ":/symbols/affinity/square/red/isdn.svg",
|
||||
"atm_switch": ":/symbols/affinity/square/red/atm.svg",
|
||||
"router": ":/symbols/affinity/square/red/router.svg",
|
||||
@@ -70,7 +70,7 @@ AFFINITY_SQUARE_RED_SYMBOL_THEME = {
|
||||
AFFINITY_SQUARE_GRAY_SYMBOL_THEME = {
|
||||
"cloud": ":/symbols/affinity/square/gray/cloud.svg",
|
||||
"ethernet_switch": ":/symbols/affinity/square/gray/switch.svg",
|
||||
"ethernet_hub": ":/symbols/affinity/square/gray/hub.svg",
|
||||
"hub": ":/symbols/affinity/square/gray/hub.svg",
|
||||
"frame_relay_switch": ":/symbols/affinity/square/gray/isdn.svg",
|
||||
"atm_switch": ":/symbols/affinity/square/gray/atm.svg",
|
||||
"router": ":/symbols/affinity/square/gray/router.svg",
|
||||
@@ -87,7 +87,7 @@ AFFINITY_SQUARE_GRAY_SYMBOL_THEME = {
|
||||
AFFINITY_CIRCLE_BLUE_SYMBOL_THEME = {
|
||||
"cloud": ":/symbols/affinity/circle/blue/cloud.svg",
|
||||
"ethernet_switch": ":/symbols/affinity/circle/blue/switch.svg",
|
||||
"ethernet_hub": ":/symbols/affinity/circle/blue/hub.svg",
|
||||
"hub": ":/symbols/affinity/circle/blue/hub.svg",
|
||||
"frame_relay_switch": ":/symbols/affinity/circle/blue/isdn.svg",
|
||||
"atm_switch": ":/symbols/affinity/circle/blue/atm.svg",
|
||||
"router": ":/symbols/affinity/circle/blue/router.svg",
|
||||
@@ -104,7 +104,7 @@ AFFINITY_CIRCLE_BLUE_SYMBOL_THEME = {
|
||||
AFFINITY_CIRCLE_RED_SYMBOL_THEME = {
|
||||
"cloud": ":/symbols/affinity/circle/red/cloud.svg",
|
||||
"ethernet_switch": ":/symbols/affinity/circle/red/switch.svg",
|
||||
"ethernet_hub": ":/symbols/affinity/circle/red/hub.svg",
|
||||
"hub": ":/symbols/affinity/circle/red/hub.svg",
|
||||
"frame_relay_switch": ":/symbols/affinity/circle/red/isdn.svg",
|
||||
"atm_switch": ":/symbols/affinity/circle/red/atm.svg",
|
||||
"router": ":/symbols/affinity/circle/red/router.svg",
|
||||
@@ -121,7 +121,7 @@ AFFINITY_CIRCLE_RED_SYMBOL_THEME = {
|
||||
AFFINITY_CIRCLE_GRAY_SYMBOL_THEME = {
|
||||
"cloud": ":/symbols/affinity/circle/gray/cloud.svg",
|
||||
"ethernet_switch": ":/symbols/affinity/circle/gray/switch.svg",
|
||||
"ethernet_hub": ":/symbols/affinity/circle/gray/hub.svg",
|
||||
"hub": ":/symbols/affinity/circle/gray/hub.svg",
|
||||
"frame_relay_switch": ":/symbols/affinity/circle/gray/isdn.svg",
|
||||
"atm_switch": ":/symbols/affinity/circle/gray/atm.svg",
|
||||
"router": ":/symbols/affinity/circle/gray/router.svg",
|
||||
|
||||
@@ -43,7 +43,7 @@ class Symbols:
|
||||
|
||||
# Keep a cache of symbols size
|
||||
self._symbol_size_cache = {}
|
||||
self._current_theme = "Classic"
|
||||
self._current_theme = "Affinity-square-blue"
|
||||
self._themes = BUILTIN_SYMBOL_THEMES
|
||||
|
||||
@property
|
||||
@@ -69,7 +69,7 @@ class Symbols:
|
||||
raise ControllerNotFoundError(f"Could not find symbol theme '{symbol_theme}'")
|
||||
symbol_path = theme.get(symbol)
|
||||
if symbol_path not in self._symbols_path:
|
||||
log.warning(f"Default symbol {symbol_path} was not found")
|
||||
log.warning(f"Default symbol {symbol} was not found")
|
||||
return None
|
||||
return symbol_path
|
||||
|
||||
@@ -125,7 +125,17 @@ class Symbols:
|
||||
|
||||
return self._symbols_path.get(symbol_id)
|
||||
|
||||
def resolve_symbol(self, symbol_name):
|
||||
|
||||
if not symbol_name.startswith(":/"):
|
||||
symbol = self.get_default_symbol(symbol_name, self._current_theme)
|
||||
if symbol:
|
||||
return symbol
|
||||
return symbol_name
|
||||
|
||||
def get_path(self, symbol_id):
|
||||
|
||||
symbol_id = self.resolve_symbol(symbol_id)
|
||||
try:
|
||||
return self._symbols_path[symbol_id]
|
||||
except KeyError:
|
||||
|
||||
@@ -31,7 +31,7 @@ class CloudTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "guest"
|
||||
default_name_format: Optional[str] = "Cloud{0}"
|
||||
symbol: Optional[str] = ":/symbols/cloud.svg"
|
||||
symbol: Optional[str] = "cloud"
|
||||
ports_mapping: List[Union[EthernetPort, TAPPort, UDPPort]] = Field(default_factory=list)
|
||||
remote_console_host: Optional[str] = Field("127.0.0.1", description="Remote console host or IP")
|
||||
remote_console_port: Optional[int] = Field(23, gt=0, le=65535, description="Remote console TCP port")
|
||||
|
||||
@@ -26,7 +26,7 @@ class DockerTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "guest"
|
||||
default_name_format: Optional[str] = "{name}-{0}"
|
||||
symbol: Optional[str] = ":/symbols/docker_guest.svg"
|
||||
symbol: Optional[str] = "docker_guest"
|
||||
image: str = Field(..., description="Docker image name")
|
||||
adapters: Optional[int] = Field(1, ge=0, le=100, description="Number of adapters")
|
||||
start_command: Optional[str] = Field("", description="Docker CMD entry")
|
||||
|
||||
@@ -34,7 +34,7 @@ class DynamipsTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "router"
|
||||
default_name_format: Optional[str] = "R{0}"
|
||||
symbol: Optional[str] = ":/symbols/router.svg"
|
||||
symbol: Optional[str] = "router"
|
||||
platform: DynamipsPlatform = Field(..., description="Cisco router platform")
|
||||
image: str = Field(..., description="Path to the IOS image")
|
||||
exec_area: Optional[int] = Field(64, description="Exec area value")
|
||||
|
||||
@@ -37,7 +37,7 @@ class EthernetHubTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "switch"
|
||||
default_name_format: Optional[str] = "Hub{0}"
|
||||
symbol: Optional[str] = ":/symbols/hub.svg"
|
||||
symbol: Optional[str] = "hub"
|
||||
ports_mapping: Optional[List[EthernetHubPort]] = Field(DEFAULT_PORTS, description="Ports")
|
||||
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ class EthernetSwitchTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "switch"
|
||||
default_name_format: Optional[str] = "Switch{0}"
|
||||
symbol: Optional[str] = ":/symbols/ethernet_switch.svg"
|
||||
symbol: Optional[str] = "ethernet_switch"
|
||||
ports_mapping: Optional[List[EthernetSwitchPort]] = Field(DEFAULT_PORTS, description="Ports")
|
||||
console_type: Optional[ConsoleType] = Field("none", description="Console type")
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ class IOUTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "router"
|
||||
default_name_format: Optional[str] = "IOU{0}"
|
||||
symbol: Optional[str] = ":/symbols/multilayer_switch.svg"
|
||||
symbol: Optional[str] = "multilayer_switch"
|
||||
path: str = Field(..., description="Path of IOU executable")
|
||||
ethernet_adapters: Optional[int] = Field(2, description="Number of ethernet adapters")
|
||||
serial_adapters: Optional[int] = Field(2, description="Number of serial adapters")
|
||||
|
||||
@@ -35,7 +35,7 @@ class QemuTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "guest"
|
||||
default_name_format: Optional[str] = "{name}-{0}"
|
||||
symbol: Optional[str] = ":/symbols/qemu_guest.svg"
|
||||
symbol: Optional[str] = "qemu_guest"
|
||||
qemu_path: Optional[str] = Field("", description="Qemu executable path")
|
||||
platform: Optional[QemuPlatform] = Field("x86_64", description="Platform to emulate")
|
||||
linked_clone: Optional[bool] = Field(True, description="Whether the VM is a linked clone or not")
|
||||
|
||||
@@ -30,7 +30,7 @@ class VirtualBoxTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "guest"
|
||||
default_name_format: Optional[str] = "{name}-{0}"
|
||||
symbol: Optional[str] = ":/symbols/vbox_guest.svg"
|
||||
symbol: Optional[str] = "vbox_guest"
|
||||
vmname: str = Field(..., description="VirtualBox VM name (in VirtualBox itself)")
|
||||
ram: Optional[int] = Field(256, gt=0, description="Amount of RAM in MB")
|
||||
linked_clone: Optional[bool] = Field(False, description="Whether the VM is a linked clone or not")
|
||||
|
||||
@@ -31,7 +31,7 @@ class VMwareTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "guest"
|
||||
default_name_format: Optional[str] = "{name}-{0}"
|
||||
symbol: Optional[str] = ":/symbols/vmware_guest.svg"
|
||||
symbol: Optional[str] = "vmware_guest"
|
||||
vmx_path: str = Field(..., description="Path to the vmx file")
|
||||
linked_clone: Optional[bool] = Field(False, description="Whether the VM is a linked clone or not")
|
||||
first_port_name: Optional[str] = Field("", description="Optional name of the first networking port example: eth0")
|
||||
|
||||
@@ -26,7 +26,7 @@ class VPCSTemplate(TemplateBase):
|
||||
|
||||
category: Optional[Category] = "guest"
|
||||
default_name_format: Optional[str] = "PC{0}"
|
||||
symbol: Optional[str] = ":/symbols/vpcs_guest.svg"
|
||||
symbol: Optional[str] = "vpcs_guest"
|
||||
base_script_file: Optional[str] = Field("vpcs_base_config.txt", description="Script file")
|
||||
console_type: Optional[ConsoleType] = Field("telnet", description="Console type")
|
||||
console_auto_start: Optional[bool] = Field(
|
||||
|
||||
@@ -86,7 +86,7 @@ BUILTIN_TEMPLATES = [
|
||||
"name": "Cloud",
|
||||
"default_name_format": "Cloud{0}",
|
||||
"category": "guest",
|
||||
"symbol": ":/symbols/cloud.svg",
|
||||
"symbol": "cloud",
|
||||
"compute_id": None,
|
||||
"builtin": True,
|
||||
},
|
||||
@@ -96,7 +96,7 @@ BUILTIN_TEMPLATES = [
|
||||
"name": "NAT",
|
||||
"default_name_format": "NAT{0}",
|
||||
"category": "guest",
|
||||
"symbol": ":/symbols/cloud.svg",
|
||||
"symbol": "cloud",
|
||||
"compute_id": None,
|
||||
"builtin": True,
|
||||
},
|
||||
@@ -106,7 +106,7 @@ BUILTIN_TEMPLATES = [
|
||||
"name": "VPCS",
|
||||
"default_name_format": "PC{0}",
|
||||
"category": "guest",
|
||||
"symbol": ":/symbols/vpcs_guest.svg",
|
||||
"symbol": "vpcs_guest",
|
||||
"base_script_file": "vpcs_base_config.txt",
|
||||
"compute_id": None,
|
||||
"builtin": True,
|
||||
@@ -118,7 +118,7 @@ BUILTIN_TEMPLATES = [
|
||||
"console_type": "none",
|
||||
"default_name_format": "Switch{0}",
|
||||
"category": "switch",
|
||||
"symbol": ":/symbols/ethernet_switch.svg",
|
||||
"symbol": "ethernet_switch",
|
||||
"compute_id": None,
|
||||
"builtin": True,
|
||||
},
|
||||
@@ -128,7 +128,7 @@ BUILTIN_TEMPLATES = [
|
||||
"name": "Ethernet hub",
|
||||
"default_name_format": "Hub{0}",
|
||||
"category": "switch",
|
||||
"symbol": ":/symbols/hub.svg",
|
||||
"symbol": "hub",
|
||||
"compute_id": None,
|
||||
"builtin": True,
|
||||
},
|
||||
@@ -138,7 +138,7 @@ BUILTIN_TEMPLATES = [
|
||||
"name": "Frame Relay switch",
|
||||
"default_name_format": "FRSW{0}",
|
||||
"category": "switch",
|
||||
"symbol": ":/symbols/frame_relay_switch.svg",
|
||||
"symbol": "frame_relay_switch",
|
||||
"compute_id": None,
|
||||
"builtin": True,
|
||||
},
|
||||
@@ -148,7 +148,7 @@ BUILTIN_TEMPLATES = [
|
||||
"name": "ATM switch",
|
||||
"default_name_format": "ATMSW{0}",
|
||||
"category": "switch",
|
||||
"symbol": ":/symbols/atm_switch.svg",
|
||||
"symbol": "atm_switch",
|
||||
"compute_id": None,
|
||||
"builtin": True,
|
||||
},
|
||||
@@ -163,6 +163,10 @@ class TemplatesService:
|
||||
from gns3server.controller import Controller
|
||||
self._controller = Controller.instance()
|
||||
|
||||
# resolve built-in template symbols
|
||||
for builtin_template in BUILTIN_TEMPLATES:
|
||||
builtin_template["symbol"] = self._controller.symbols.resolve_symbol(builtin_template["symbol"])
|
||||
|
||||
def get_builtin_template(self, template_id: UUID) -> dict:
|
||||
|
||||
for builtin_template in BUILTIN_TEMPLATES:
|
||||
@@ -241,6 +245,8 @@ class TemplatesService:
|
||||
except pydantic.ValidationError as e:
|
||||
raise ControllerBadRequestError(f"JSON schema error received while creating new template: {e}")
|
||||
|
||||
# resolve the template symbol
|
||||
template_settings["symbol"] = self._controller.symbols.resolve_symbol(template_settings["symbol"])
|
||||
images_to_add_to_template = await self._find_images(template_create.template_type, template_settings)
|
||||
db_template = await self._templates_repo.create_template(template_create.template_type, template_settings)
|
||||
for image in images_to_add_to_template:
|
||||
|
||||
Reference in new issue
Block a user