7547 Commits

Author SHA1 Message Date
Jeremy Grossmann
4ea31f98b7
Merge pull request #2893 from markparonyan/mypy-agent-mcp
fix(typing): resolve mypy errors in agent.mcp
2026-09-28 20:49:10 +02:00
Mark Paronyan
6ffa39642f
fix(typing): resolve mypy errors in agent.mcp 2026-09-28 21:41:58 +03:00
Jeremy Grossmann
0c9f6aa9e3
Merge pull request #2892 from markparonyan/mypy-compute-qemu-vm
fix(typing): resolve mypy errors in compute.qemu.qemu_vm
2026-09-28 12:00:10 +02:00
Mark Paronyan
6bff55d3c7
Remove gns3server.compute.project from pyproject.toml
Removed 'gns3server.compute.project' from the list.
2026-09-28 12:41:51 +03:00
Mark Paronyan
798edca81d
Remove qemu_vm typing ignore from pyproject.toml 2026-09-28 12:40:51 +03:00
Mark Paronyan
8c0a5404ac
Merge branch '3.1' into mypy-compute-qemu-vm 2026-09-28 12:39:38 +03:00
Mark Paronyan
525ef8ca57
fix(typing): resolve mypy errors in compute.qemu.qemu_vm 2026-09-28 12:37:28 +03:00
Jeremy Grossmann
79ecb15164
Merge pull request #2888 from markparonyan/mypy-compute-vmware-vm
fix(typing): resolve mypy errors in compute.vmware.vmware_vm
2026-09-28 11:06:12 +02:00
Jeremy Grossmann
310bb193a5
Merge pull request #2887 from markparonyan/mypy-compute-docker-vm
fix(typing): resolve mypy errors in compute.docker vm modules
2026-09-28 11:03:44 +02:00
Jeremy Grossmann
ccee503b74
Merge pull request #2891 from markparonyan/mypy-controller-compute
fix(typing): resolve mypy errors in controller.compute
2026-09-28 11:01:30 +02:00
Jeremy Grossmann
378751070c
Merge pull request #2885 from markparonyan/mypy-compute-project
fix(typing): resolve mypy errors in compute.project
2026-09-28 10:55:33 +02:00
Jeremy Grossmann
10b5c1bb6b
Merge branch '3.1' into mypy-compute-project 2026-09-28 10:55:25 +02:00
Jeremy Grossmann
0bd1204d15
Merge pull request #2884 from markparonyan/mypy-config
fix(typing): resolve mypy errors in config
2026-09-28 10:54:17 +02:00
Jeremy Grossmann
0718e038f7
Merge pull request #2883 from markparonyan/mypy-utils-embed-shell
fix(typing): resolve mypy errors in utils.asyncio.embed_shell
2026-09-28 10:47:23 +02:00
Jeremy Grossmann
f2b8b32d59
Merge pull request #2882 from markparonyan/mypy-api-index
Fix mypy errors in api.routes.index
2026-09-28 10:39:46 +02:00
Mark Paronyan
21643fe89d
fix(typing): resolve mypy errors in controller.compute 2026-09-28 04:56:59 +00:00
Mark Paronyan
d1df96e0a6
fix(typing): resolve mypy errors in utils.asyncio.embed_shell 2026-09-28 04:56:18 +00:00
Mark Paronyan
fdfb2d5591
fix(typing): resolve mypy errors in compute.vmware.vmware_vm 2026-09-28 04:55:44 +00:00
Mark Paronyan
667b0531f6
fix(typing): resolve mypy errors in compute.project 2026-09-28 04:55:38 +00:00
Mark Paronyan
b8ae84031e
fix(typing): resolve mypy errors in compute.docker vm modules 2026-09-28 04:55:32 +00:00
Mark Paronyan
f858ae23a6
fix(typing): resolve mypy errors in api.routes.index 2026-09-28 04:55:30 +00:00
Mark Paronyan
2512556770
fix(typing): resolve mypy errors in config 2026-09-28 04:55:20 +00:00
grossmj
8df25dec32
Development on 3.1.0.dev7 2026-09-27 20:21:12 +02:00
grossmj
4fa4ef7c2f
Release v3.1.0a6 v3.1.0a6 2026-09-27 19:18:25 +02:00
grossmj
3f2afb0e4a
Bundle web-ui v3.1.0a6 2026-09-27 19:10:11 +02:00
Jeremy Grossmann
902b1f8ea1
Merge pull request #2881 from GNS3/update-dependencies
Update dependencies
2026-09-27 19:07:55 +02:00
grossmj
1f3d00dd1a
Merge remote-tracking branch 'origin/update-dependencies' into update-dependencies 2026-09-27 19:01:56 +02:00
Jeremy Grossmann
539d9f94f9
Merge branch '3.1' into update-dependencies 2026-09-27 19:01:34 +02:00
grossmj
b96774d1f7
Sync appliances 2026-09-27 18:59:42 +02:00
grossmj
52f2774c05
sqlalchemy v2.0.54 is the last version that supports Python 3.10 2026-09-27 18:55:33 +02:00
Jeremy Grossmann
d99b89f1e9
Merge pull request #2880 from markparonyan/harden-ci
ci: mypy, ruff, pytest
2026-09-27 18:52:08 +02:00
grossmj
76e85b552a
chore(deps): update dependencies 2026-09-27 18:51:14 +02:00
Mark Paronyan
544890c6b4
chore: delete mac and win reqs 2026-09-27 19:09:25 +03:00
grossmj
45a0f596c8
Ignore Markdown files 2026-09-27 17:52:40 +02:00
grossmj
5c686b0c20
Revert changes to rbac-user-isolation-roadmap.md 2026-09-27 17:13:34 +02:00
Mark Paronyan
ef579dfa8f
ci: no flake8 checks for now, ruff covers them 2026-09-27 16:07:44 +03:00
Mark Paronyan
a0450b6bce
refactor: ruff autofixes 2026-09-27 15:55:10 +03:00
Mark Paronyan
2ac637c662
ci: run just test 2026-09-27 15:43:49 +03:00
Mark Paronyan
8dfe05df3d
chore: justfile with mypy, ruff, pytest checks 2026-09-27 15:43:18 +03:00
Jeremy Grossmann
efd6bb77fe
Merge pull request #2878 from cristian-ciobanu/project-missing-images
Allow projects containing unavailable images to open in a degraded state instead of failing to load
2026-09-22 15:34:36 +02:00
grossmj
34923e46e0
chore(docs): update gns3_server.conf sample about the default NAT interface 2026-09-22 14:56:58 +02:00
Cristi
da16dc9874 fix(qemu): Fixed missing image replacement for linked-clone nodes 2026-09-18 23:58:49 +03:00
Cristi
59a367b88d Allow projects containing missing images to open in a degraded state instead of failing to load 2026-09-18 15:06:17 +03:00
Jeremy Grossmann
de8e1039a9
Merge pull request #2876 from yueguobin/fix/node-delete-rmtree-race
Make node working directory deletion robust against races and mode mangling
2026-09-15 17:49:19 +02:00
YueGuobin
84e7ead465
fix: make node working directory deletion robust
The rmtree error handler in BaseNode.delete() was chmod'ing the failed
path to S_IWRITE (0o200). On POSIX this strips the search permission
from directories, turning a transient deletion failure into a directory
that can no longer be traversed or deleted. The node deletion itself
silently "succeeds" (rmtree gives up once its error handler returns)
and a later project deletion then fails with EACCES. The handler also
never retried the failed operation, so it did not help on Windows
either (the platform it was written for).

The transient failure exists in practice: a concurrent MD5 checksum
computation caching its result in the node directory (e.g. a properties
request racing the deletion) can recreate a file after rmtree has
listed the directory, making the final rmdir fail with ENOTEMPTY.

- add the missing user permissions instead of replacing the whole mode,
  and retry the failed unlink/rmdir
- retry the whole deletion a few times to absorb files recreated while
  the directory is being deleted
- raise a ComputeError when the directory cannot be fully deleted
  instead of failing silently
2026-09-15 01:23:31 +08:00
Jeremy Grossmann
1c57bd7dca
Merge pull request #2875 from yueguobin/feat/docker-image-sync
Sync Docker images from the controller to remote computes
2026-09-13 20:11:03 +02:00
YueGuobin
be62e8c022
feat: keep Docker images on computes consistent with the controller host
Only relying on the image name lets a moved tag (e.g. a newer :latest)
silently serve stale content from a compute that already has an image
under the same name. When creating a Docker node, the controller now
pins the image id (Id from the Docker daemon on the controller host)
into the create payload. A compute holding a different image under the
same tag reports the image as missing, which routes it through the
image sync added by the previous commit and re-aligns the tag.

No new template fields or database changes: the controller host daemon
remains the source of truth and the pin is resolved per creation. When
the image is not available on the controller host the pin is omitted
and behavior is unchanged (the compute pulls from the repository).
2026-09-14 00:55:18 +08:00
YueGuobin
c477812332
feat: sync Docker images from the controller to remote computes
When a Docker node is created on a remote compute whose Docker daemon
does not have the image, the compute now raises ImageMissingError
instead of blindly pulling from the Docker repository. The controller
exports the image from the Docker daemon on its host (docker save
stream) and streams it to the compute which loads it, so locally built
or docker-loaded images work across computes. When the image is not
available on the controller host either, the compute is asked to pull
it from the Docker repository as a fallback.

- add a POST /docker/images/load compute endpoint that streams a
  docker save tar into the Docker daemon
- let Docker.http_query pass raw (non-dict) request bodies through so
  the tar can be streamed to the daemon
- drop the inline pull from DockerVM.create() and the now unused
  DockerVM.pull_image wrapper
2026-09-14 00:36:54 +08:00
Jeremy Grossmann
2a3626824f
Merge pull request #2874 from yueguobin/fix/docker-root-owned-file-reclaim
fix: reclaim root-owned container files so docker nodes and projects can be deleted
2026-09-13 17:19:09 +02:00
YueGuobin
4b239cc11a
fix: run the reclaim helper as root regardless of the image's default USER
The one-shot reclaim container inherited the image's baked-in USER:
ghcr.io/nokia/srlinux runs as "user:user", so the "privileged" helper
was exactly as unprivileged as the server itself — chmod/chown on files
written by other uids (srlinux writes as a large internal uid) failed
with EPERM and node/project deletion still broke, just with a different
error. Pass --user 0:0 explicitly so the helper is root no matter what
the image declares, and fix the manual reclaim hint the same way.

Validated live on two stuck srlinux node directories (257/258
foreign-owned entries reclaimed to 0 in ~0.5 s each).
2026-09-12 23:15:52 +08:00