gns3-server 3.0.0rc2__py3-none-any.whl → 3.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of gns3-server might be problematic. Click here for more details.

Files changed (37) hide show
  1. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/METADATA +3 -3
  2. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/RECORD +37 -31
  3. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/WHEEL +1 -1
  4. gns3server/api/routes/controller/projects.py +20 -4
  5. gns3server/api/routes/index.py +3 -3
  6. gns3server/api/server.py +38 -3
  7. gns3server/appliances/arista-veos.gns3a +20 -514
  8. gns3server/appliances/cisco-7200.gns3a +26 -0
  9. gns3server/appliances/cisco-asav.gns3a +14 -1
  10. gns3server/appliances/cisco-iou-l2.gns3a +16 -4
  11. gns3server/appliances/cisco-iou-l3.gns3a +16 -4
  12. gns3server/appliances/innovaphone-app.gns3a +50 -0
  13. gns3server/appliances/innovaphone-ipva.gns3a +78 -0
  14. gns3server/appliances/pfsense.gns3a +14 -0
  15. gns3server/compute/iou/iou_vm.py +22 -12
  16. gns3server/controller/__init__.py +22 -21
  17. gns3server/controller/compute.py +1 -1
  18. gns3server/controller/node.py +2 -6
  19. gns3server/controller/project.py +1 -2
  20. gns3server/crash_report.py +1 -1
  21. gns3server/db/repositories/pools.py +1 -1
  22. gns3server/disks/empty100G.qcow2 +0 -0
  23. gns3server/disks/empty200G.qcow2 +0 -0
  24. gns3server/disks/empty30G.qcow2 +0 -0
  25. gns3server/disks/empty8G.qcow2 +0 -0
  26. gns3server/schemas/config.py +1 -1
  27. gns3server/static/favicon.ico +0 -0
  28. gns3server/static/redoc.standalone.js +1782 -0
  29. gns3server/static/swagger-ui-bundle.js +2 -0
  30. gns3server/static/swagger-ui.css +3 -0
  31. gns3server/static/web-ui/index.html +1 -1
  32. gns3server/static/web-ui/{main.ed82697b58d803e7.js → main.e55eeff5c0ba1cf4.js} +1 -1
  33. gns3server/utils/images.py +45 -35
  34. gns3server/version.py +2 -2
  35. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/LICENSE +0 -0
  36. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/entry_points.txt +0 -0
  37. {gns3_server-3.0.0rc2.dist-info → gns3_server-3.0.1.dist-info}/top_level.txt +0 -0
@@ -13,13 +13,19 @@
13
13
  "iou": {
14
14
  "ethernet_adapters": 4,
15
15
  "serial_adapters": 0,
16
- "nvram": 128,
17
- "ram": 256,
16
+ "nvram": 512,
17
+ "ram": 512,
18
18
  "startup_config": "iou_l2_base_startup-config.txt"
19
19
  },
20
20
  "images": [
21
21
  {
22
- "filename": "x86_64_crb_linux_l2-adventerprisek9-ms.bin",
22
+ "filename": "x86_64_crb_linux_l2-adventerprisek9-ms.iol",
23
+ "version": "17.15.1",
24
+ "md5sum": "6c587cdfd5056078e70b3f6c26800d66",
25
+ "filesize": 243251976
26
+ },
27
+ {
28
+ "filename": "x86_64_crb_linux_l2-adventerprisek9-ms",
23
29
  "version": "17.12.1",
24
30
  "md5sum": "2b5055e4cef8fd257416d74a94adb626",
25
31
  "filesize": 240355720
@@ -44,10 +50,16 @@
44
50
  }
45
51
  ],
46
52
  "versions": [
53
+ {
54
+ "name": "17.15.1",
55
+ "images": {
56
+ "image": "x86_64_crb_linux_l2-adventerprisek9-ms.iol"
57
+ }
58
+ },
47
59
  {
48
60
  "name": "17.12.1",
49
61
  "images": {
50
- "image": "x86_64_crb_linux_l2-adventerprisek9-ms.bin"
62
+ "image": "x86_64_crb_linux_l2-adventerprisek9-ms"
51
63
  }
52
64
  },
53
65
  {
@@ -13,13 +13,19 @@
13
13
  "iou": {
14
14
  "ethernet_adapters": 2,
15
15
  "serial_adapters": 2,
16
- "nvram": 128,
17
- "ram": 256,
16
+ "nvram": 512,
17
+ "ram": 512,
18
18
  "startup_config": "iou_l3_base_startup-config.txt"
19
19
  },
20
20
  "images": [
21
21
  {
22
- "filename": "x86_64_crb_linux-adventerprisek9-ms.bin",
22
+ "filename": "x86_64_crb_linux-adventerprisek9-ms.iol",
23
+ "version": "17.15.1",
24
+ "md5sum": "5d584f6cfbeaadc87d55f613da1049ed",
25
+ "filesize": 292001512
26
+ },
27
+ {
28
+ "filename": "x86_64_crb_linux-adventerprisek9-ms",
23
29
  "version": "17.12.1",
24
30
  "md5sum": "4a2fce8de21d1831fbceffd155e41ae7",
25
31
  "filesize": 288947184
@@ -44,10 +50,16 @@
44
50
  }
45
51
  ],
46
52
  "versions": [
53
+ {
54
+ "name": "17.15.1",
55
+ "images": {
56
+ "image": "x86_64_crb_linux-adventerprisek9-ms.iol"
57
+ }
58
+ },
47
59
  {
48
60
  "name": "17.12.1",
49
61
  "images": {
50
- "image": "x86_64_crb_linux-adventerprisek9-ms.bin"
62
+ "image": "x86_64_crb_linux-adventerprisek9-ms"
51
63
  }
52
64
  },
53
65
  {
@@ -0,0 +1,50 @@
1
+ {
2
+ "appliance_id": "92dbd0e9-144e-4c59-a4a8-97b6a1661818",
3
+ "name": "Innovaphone App-Platform",
4
+ "category": "guest",
5
+ "description": "In addition to telephony, apps for Video Telephony, Chat, Conferencing, Application Sharing and many other functions have become indispensable UCC tools in the area of business communication. Based on the myApps platform and its various components, innovaphone provides a collaborative work and communication platform for enhanced corporate communications \u2013 regardless of the location and the device being used. The innovaphone platform myApps consists of many independent components that work well individually, yet unfold their remarkable performance when combined.",
6
+ "vendor_name": "Innovaphone",
7
+ "vendor_url": "https://www.innovaphone.com",
8
+ "vendor_logo_url": "https://www.innovaphone.com/content/downloads/innovaphone-myapps-logo-short-without-background-screen.png",
9
+ "documentation_url": "https://wiki.innovaphone.com/index.php?title=Reference14r2:Concept_App_Platform",
10
+ "product_name": "App-Platform",
11
+ "product_url": "https://www.innovaphone.com/en/products/myapps/myapps-platform.html",
12
+ "registry_version": 4,
13
+ "status": "experimental",
14
+ "availability": "free-to-try",
15
+ "maintainer": "Thomas Marchsteiner",
16
+ "maintainer_email": "thomas.marchsteiner@acp.at",
17
+ "usage": "Default users console:root/iplinux , ssh:admin/ipapps , Webinterface:pwd \nAfter first boot wait for automatic reboot.\nA static ip can be set via the setip utility. \nLoading another keymap can be done via the loadkeys command. \nThe app-platform-disk1.vmdk file is contained within an ova file. \nIt can be extraced with the tar utility, 7Zip or any other tool which can handle tar files.",
18
+ "symbol": "innovaphone-ap-icon.jpg",
19
+ "first_port_name": "eth0",
20
+ "qemu": {
21
+ "adapter_type": "vmxnet3",
22
+ "adapters": 1,
23
+ "ram": 512,
24
+ "cpus": 1,
25
+ "hda_disk_interface": "scsi",
26
+ "arch": "x86_64",
27
+ "console_type": "vnc",
28
+ "boot_priority": "d",
29
+ "kvm": "allow",
30
+ "on_close": "power_off",
31
+ "process_priority": "normal"
32
+ },
33
+ "images": [
34
+ {
35
+ "filename": "app-platform-disk1_120010.vmdk",
36
+ "version": "12.0010",
37
+ "md5sum": "d5a5a77f682c2c988b0810935d79a787",
38
+ "filesize": 129474560,
39
+ "download_url": "https://store.innovaphone.com/"
40
+ }
41
+ ],
42
+ "versions": [
43
+ {
44
+ "images": {
45
+ "hda_disk_image": "app-platform-disk1_120010.vmdk"
46
+ },
47
+ "name": "12.0010"
48
+ }
49
+ ]
50
+ }
@@ -0,0 +1,78 @@
1
+ {
2
+ "appliance_id": "ddf8f7a4-60c0-4c9d-849c-ffc3c9d1d082",
3
+ "name": "Innovaphone IPVA",
4
+ "category": "guest",
5
+ "description": "The innovaphone PBX is a professional IP telephone system. The IPVA is a software-only solution. It appears as and performs as an innovaphone 'hard-box' excluding DSP-, ISDN-/AB-resources.",
6
+ "vendor_name": "Innovaphone",
7
+ "vendor_url": "https://www.innovaphone.com/",
8
+ "vendor_logo_url": "https://www.innovaphone.com/content/downloads/innovaphone-myapps-logo-short-without-background-screen.png",
9
+ "documentation_url": "https://wiki.innovaphone.com/index.php?title=Reference15r1:Concept_Innovaphone_Virtual_Appliance_(IPVA)",
10
+ "product_name": "IPVA",
11
+ "product_url": "https://www.innovaphone.com/en/products/innovaphone-pbx.html",
12
+ "registry_version": 4,
13
+ "status": "experimental",
14
+ "availability": "free-to-try",
15
+ "maintainer": "Thomas Marchsteiner",
16
+ "maintainer_email": "thomas.marchsteiner@acp.at",
17
+ "usage": "Default user admin/ipva \nDefault network configuration: DHCP client on eth0 with fallback to static address 192.168.0.1/24 after timeout. Static address 192.168.1.1/24 on eth1\n The ova in the zip file contains the disk images to run this appliance. Disableing the dhcp client and setting a static IP is possible with the following commands:\n> config change IP0 ETH0 /addr 192.168.0.1 /mask 255.255.255.0 \n> config change DHCP0 /mode off \n> config write \n> config activate \n> reset",
18
+ "symbol": "innovaphone-pbx-green.png",
19
+ "first_port_name": "eth0",
20
+ "port_name_format": "eth{port1}",
21
+ "qemu": {
22
+ "adapter_type": "vmxnet3",
23
+ "adapters": 2,
24
+ "ram": 256,
25
+ "cpus": 1,
26
+ "hda_disk_interface": "ide",
27
+ "hdb_disk_interface": "ide",
28
+ "hdc_disk_interface": "ide",
29
+ "hdd_disk_interface": "ide",
30
+ "arch": "x86_64",
31
+ "console_type": "vnc",
32
+ "boot_priority": "d",
33
+ "kvm": "allow",
34
+ "on_close": "power_off",
35
+ "process_priority": "normal"
36
+ },
37
+ "images": [
38
+ {
39
+ "filename": "ipva-qemu-disk1-14r2.vmdk",
40
+ "version": "14r2",
41
+ "md5sum": "aaa1c3885eee30ca6ffa3827619e8643",
42
+ "filesize": 6269952,
43
+ "download_url": "https://store.innovaphone.com/"
44
+ },
45
+ {
46
+ "filename": "ipva-qemu-disk2-14r2.vmdk",
47
+ "version": "14r2",
48
+ "md5sum": "008a8fc6b0b1e5f11a3e7fd6f22ba349",
49
+ "filesize": 72192,
50
+ "download_url": "https://store.innovaphone.com/"
51
+ },
52
+ {
53
+ "filename": "ipva-qemu-disk3-14r2.vmdk",
54
+ "version": "14r2",
55
+ "md5sum": "20516731c480e2112b3fb4a4d7f514f2",
56
+ "filesize": 68096,
57
+ "download_url": "https://store.innovaphone.com/"
58
+ },
59
+ {
60
+ "filename": "ipva-qemu-disk4-14r2.vmdk",
61
+ "version": "14r2",
62
+ "md5sum": "15d7d79ef8c28bd29b2eceac8405f964",
63
+ "filesize": 68096,
64
+ "download_url": "https://store.innovaphone.com/"
65
+ }
66
+ ],
67
+ "versions": [
68
+ {
69
+ "images": {
70
+ "hda_disk_image": "ipva-qemu-disk1-14r2.vmdk",
71
+ "hdb_disk_image": "ipva-qemu-disk2-14r2.vmdk",
72
+ "hdc_disk_image": "ipva-qemu-disk3-14r2.vmdk",
73
+ "hdd_disk_image": "ipva-qemu-disk4-14r2.vmdk"
74
+ },
75
+ "name": "14r2"
76
+ }
77
+ ]
78
+ }
@@ -24,6 +24,13 @@
24
24
  "process_priority": "normal"
25
25
  },
26
26
  "images": [
27
+ {
28
+ "filename": "pfSense-CE-2.7.2-RELEASE-amd64.iso",
29
+ "version": "2.7.2",
30
+ "md5sum": "50c3e723d68ec74d038041a34fa846f8",
31
+ "filesize": 874672128,
32
+ "download_url": "https://www.pfsense.org/download/mirror.php?section=downloads"
33
+ },
27
34
  {
28
35
  "filename": "pfSense-CE-2.7.0-RELEASE-amd64.iso",
29
36
  "version": "2.7.0",
@@ -76,6 +83,13 @@
76
83
  }
77
84
  ],
78
85
  "versions": [
86
+ {
87
+ "name": "2.7.2",
88
+ "images": {
89
+ "hda_disk_image": "empty100G.qcow2",
90
+ "cdrom_image": "pfSense-CE-2.7.2-RELEASE-amd64.iso"
91
+ }
92
+ },
79
93
  {
80
94
  "name": "2.7.0",
81
95
  "images": {
@@ -436,14 +436,16 @@ class IOUVM(BaseNode):
436
436
  )
437
437
  )
438
438
 
439
- async def _check_iou_licence(self):
439
+ def _is_iou_license_check_enabled(self):
440
440
  """
441
- Checks for a valid IOU key in the iourc file (paranoid mode).
441
+ Returns if IOU license check is enabled.
442
+
443
+ :return: boolean
442
444
  """
443
445
 
444
446
  # license check is sent by the controller
445
447
  if self.license_check is False:
446
- return
448
+ return False
447
449
 
448
450
  try:
449
451
  # we allow license check to be disabled server wide
@@ -453,7 +455,14 @@ class IOUVM(BaseNode):
453
455
 
454
456
  if server_wide_license_check is False:
455
457
  log.warning("License check is explicitly disabled on this server")
456
- return
458
+ return False
459
+
460
+ return True
461
+
462
+ async def _check_iou_license(self):
463
+ """
464
+ Checks for a valid IOU key in the iourc file (paranoid mode).
465
+ """
457
466
 
458
467
  config = configparser.ConfigParser()
459
468
  try:
@@ -559,15 +568,16 @@ class IOUVM(BaseNode):
559
568
  except OSError as e:
560
569
  raise IOUError(f"Could not rename nvram files: {e}")
561
570
 
562
- iourc_path = self.iourc_path
563
- if not iourc_path:
564
- raise IOUError("Could not find an iourc file (IOU license), please configure an IOU license")
565
- if not os.path.isfile(iourc_path):
566
- raise IOUError(f"The iourc path '{iourc_path}' is not a regular file")
571
+ iourc_path = None
572
+ if self._is_iou_license_check_enabled():
573
+ iourc_path = self.iourc_path
574
+ if not iourc_path:
575
+ raise IOUError("Could not find an iourc file (IOU license), please configure an IOU license")
576
+ if not os.path.isfile(iourc_path):
577
+ raise IOUError(f"The iourc path '{iourc_path}' is not a regular file")
578
+ await self._check_iou_license()
567
579
 
568
- await self._check_iou_licence()
569
580
  await self._start_ubridge()
570
-
571
581
  self._create_netmap_config()
572
582
  if self.use_default_iou_values:
573
583
  # make sure we have the default nvram amount to correctly push the configs
@@ -579,7 +589,7 @@ class IOUVM(BaseNode):
579
589
 
580
590
  self._nvram_watcher = FileWatcher(self._nvram_file(), self._nvram_changed, delay=2)
581
591
 
582
- # created a environment variable pointing to the iourc file.
592
+ # created an environment variable pointing to the iourc file.
583
593
  env = os.environ.copy()
584
594
  if "IOURC" not in os.environ and iourc_path:
585
595
  env["IOURC"] = iourc_path
@@ -64,7 +64,7 @@ class Controller:
64
64
  self.gns3vm = GNS3VM(self)
65
65
  self.symbols = Symbols()
66
66
  self._appliance_manager = ApplianceManager()
67
- self._iou_license_settings = {"iourc_content": "", "license_check": True}
67
+ self._iou_license_settings = {"iourc_content": "", "license_check": False}
68
68
  self._vars_loaded = False
69
69
  self._vars_file = Config.instance().controller_vars
70
70
  log.info(f'Loading controller vars file "{self._vars_file}"')
@@ -134,7 +134,9 @@ class Controller:
134
134
  log.warning(str(e))
135
135
 
136
136
  await self.load_projects()
137
- await self._project_auto_open()
137
+
138
+ # start to auto open projects (if configured) 5 seconds after the controller has started
139
+ asyncio.get_event_loop().call_later(5, asyncio.create_task, self._project_auto_open())
138
140
 
139
141
  def _create_ssl_context(self, server_config):
140
142
 
@@ -208,19 +210,15 @@ class Controller:
208
210
  if self._vars_loaded:
209
211
  controller_vars = {
210
212
  "appliances_etag": self._appliance_manager.appliances_etag,
213
+ "iou_license_check": self._iou_license_settings["license_check"],
211
214
  "version": __version__
212
215
  }
213
216
 
214
217
  if self._iou_license_settings["iourc_content"]:
215
218
 
216
- iou_config = Config.instance().settings.IOU
217
219
  server_config = Config.instance().settings.Server
218
-
219
- if iou_config.iourc_path:
220
- iourc_path = iou_config.iourc_path
221
- else:
222
- os.makedirs(server_config.secrets_dir, exist_ok=True)
223
- iourc_path = os.path.join(server_config.secrets_dir, "gns3_iourc_license")
220
+ os.makedirs(server_config.secrets_dir, exist_ok=True)
221
+ iourc_path = os.path.join(server_config.secrets_dir, "iou_license")
224
222
 
225
223
  try:
226
224
  with open(iourc_path, "w+") as f:
@@ -251,15 +249,11 @@ class Controller:
251
249
  return []
252
250
 
253
251
  # load the IOU license settings
254
- iou_config = Config.instance().settings.IOU
255
252
  server_config = Config.instance().settings.Server
256
253
 
257
- if iou_config.iourc_path:
258
- iourc_path = iou_config.iourc_path
259
- else:
260
- if not server_config.secrets_dir:
261
- server_config.secrets_dir = os.path.dirname(Config.instance().server_config)
262
- iourc_path = os.path.join(server_config.secrets_dir, "gns3_iourc_license")
254
+ if not server_config.secrets_dir:
255
+ server_config.secrets_dir = os.path.dirname(Config.instance().server_config)
256
+ iourc_path = os.path.join(server_config.secrets_dir, "iou_license")
263
257
 
264
258
  if os.path.exists(iourc_path):
265
259
  try:
@@ -268,7 +262,10 @@ class Controller:
268
262
  log.info(f"iourc file '{iourc_path}' loaded")
269
263
  except OSError as e:
270
264
  log.error(f"Cannot read IOU license file '{iourc_path}': {e}")
271
- self._iou_license_settings["license_check"] = iou_config.license_check
265
+
266
+ # IOU license check is disabled by default
267
+ self._iou_license_settings["license_check"] = controller_vars.get("iou_license_check", False)
268
+ log.info("IOU license check is {} on the controller".format("enabled" if self._iou_license_settings["license_check"] else "disabled"))
272
269
 
273
270
  # install the built-in appliances if needed
274
271
  if Config.instance().settings.Server.install_builtin_appliances:
@@ -347,6 +344,7 @@ class Controller:
347
344
  dst_path = self.configs_path()
348
345
  log.info(f"Installing base configs in '{dst_path}'")
349
346
  try:
347
+ # do not overwrite base configs because they may have been customized by the user
350
348
  Controller.install_resource_files(dst_path, "configs", upgrade_resources=False)
351
349
  except OSError as e:
352
350
  log.error(f"Could not install base config files to {dst_path}: {e}")
@@ -360,7 +358,7 @@ class Controller:
360
358
  dst_path = self.disks_path()
361
359
  log.info(f"Installing built-in disks in '{dst_path}'")
362
360
  try:
363
- Controller.install_resource_files(dst_path, "disks", upgrade_resources=False)
361
+ Controller.install_resource_files(dst_path, "disks")
364
362
  except OSError as e:
365
363
  log.error(f"Could not install disk files to {dst_path}: {e}")
366
364
 
@@ -600,9 +598,12 @@ class Controller:
600
598
  Auto open the project with auto open enable
601
599
  """
602
600
 
603
- for project in self._projects.values():
604
- if project.auto_open:
605
- await project.open()
601
+ try:
602
+ for project in self._projects.values():
603
+ if project.auto_open:
604
+ await project.open()
605
+ except ControllerError as e:
606
+ log.error(f"Could not auto open projects: {e}")
606
607
 
607
608
  def get_free_project_name(self, base_name):
608
609
  """
@@ -502,7 +502,7 @@ class Compute:
502
502
  """ Returns URL for specific path at Compute"""
503
503
  return self._getUrl(path)
504
504
 
505
- async def _run_http_query(self, method, path, data=None, timeout=20, raw=False):
505
+ async def _run_http_query(self, method, path, data=None, timeout=120, raw=False):
506
506
  async with async_timeout.timeout(delay=timeout):
507
507
  url = self._getUrl(path)
508
508
  headers = {"content-type": "application/json"}
@@ -572,15 +572,11 @@ class Node:
572
572
  Start a node
573
573
  """
574
574
  try:
575
- # For IOU we need to send the licence everytime
575
+ # For IOU: we need to send the licence everytime we start a node
576
576
  if self.node_type == "iou":
577
577
  license_check = self._project.controller.iou_license.get("license_check", True)
578
578
  iourc_content = self._project.controller.iou_license.get("iourc_content", None)
579
- # if license_check and not iourc_content:
580
- # raise aiohttp.web.HTTPConflict(text="IOU licence is not configured")
581
- await self.post(
582
- "/start", timeout=240, data={"license_check": license_check, "iourc_content": iourc_content}
583
- )
579
+ await self.post("/start", timeout=240, data={"license_check": license_check, "iourc_content": iourc_content})
584
580
  else:
585
581
  await self.post("/start", data=data, timeout=240)
586
582
  except asyncio.TimeoutError:
@@ -595,7 +595,7 @@ class Project:
595
595
 
596
596
  if node_type == "iou":
597
597
  async with self._iou_id_lock:
598
- # wait for a IOU node to be completely created before adding a new one
598
+ # wait for an IOU node to be completely created before adding a new one
599
599
  # this is important otherwise we allocate the same application ID (used
600
600
  # to generate MAC addresses) when creating multiple IOU node at the same time
601
601
  if "properties" in kwargs.keys():
@@ -1339,7 +1339,6 @@ class Project:
1339
1339
  Copy the project files directly rather than in an import-export fashion.
1340
1340
 
1341
1341
  :param name: Name of the new project. A new one will be generated in case of conflicts
1342
- :param location: Parent directory of the new project
1343
1342
  :param reset_mac_addresses: Reset MAC addresses for the new project
1344
1343
  """
1345
1344
 
@@ -58,7 +58,7 @@ class CrashReport:
58
58
  Report crash to a third party service
59
59
  """
60
60
 
61
- DSN = "https://29d15f2b7fde7fbd860843b7ee24dc7f@o19455.ingest.us.sentry.io/38482"
61
+ DSN = "https://847198b87dbd50ef8962901641918a08@o19455.ingest.us.sentry.io/38482"
62
62
  _instance = None
63
63
 
64
64
  def __init__(self):
@@ -80,7 +80,7 @@ class ResourcePoolsRepository(BaseRepository):
80
80
  await self._db_session.commit()
81
81
  return result.rowcount > 0
82
82
 
83
- async def get_resource_memberships(self, resource_id: UUID) -> List[models.UserGroup]:
83
+ async def get_resource_memberships(self, resource_id: UUID) -> List[models.ResourcePool]:
84
84
  """
85
85
  Get all resource memberships in resource pools.
86
86
  """
Binary file
Binary file
Binary file
Binary file
@@ -147,7 +147,7 @@ class ServerSettings(BaseModel):
147
147
  allow_remote_console: bool = False
148
148
  enable_builtin_templates: bool = True
149
149
  install_builtin_appliances: bool = True
150
- model_config = ConfigDict(validate_assignment=True, str_strip_whitespace=True, use_enum_values=True)
150
+ model_config = ConfigDict(validate_assignment=True, str_strip_whitespace=True)
151
151
 
152
152
  @field_validator("additional_images_paths", mode="before")
153
153
  @classmethod
Binary file