Conversation
# Conflicts: # go.sum
# Conflicts: # go.mod # go.sum
# Conflicts: # go.mod # go.sum
Download Containerlab binaries for commit 7cea67f:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9616259261/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9616180216/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
…etes runtime Adapt the clabernetes lab runtime to the direct (native kubernetes) clabernetes architecture and make the Topology resource the primary deployment path: containerlab persists the rendered topology and the manager compiles and owns the Node, Link, and NodeProfile resources. Deploy waits until the controller has observed the Topology's current generation (status.observedGeneration) and the lab reports ready; controllers that predate observedGeneration fall back to the readiness wait alone. The created Topology sets statusProbes.enabled explicitly because CRD structural defaulting cannot materialize the absent statusProbes object. --no-topology-cr on deploy and redeploy keeps the previous behavior: the topology is compiled client-side and the Node, Link, and NodeProfile resources are managed directly, with no Topology object persisted. A Topology-owned lab is rejected when the flag is set, and deploying a primitive-only lab without the flag hands ownership to the controller, which adopts the label-matched resources in place.
Download Containerlab binaries for commit 3e8ce69:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9648400953/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9648295761/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
The rollback of an interrupted deployment ran from the signal handler goroutine, concurrently with the deploy that was still unwinding, and both it and main raced to os.Exit(1). On the clabernetes runtime main always won because the deploy returns from its wait loop the instant the context is canceled, so the process died before the destroy had issued a single request and the lab was left behind in full: namespace, Topology, Nodes, pods, services and staged ConfigMaps. Give the rollback to the command that created the lab instead. deployFn now tears down what it managed to create before surfacing the cancellation, so nothing races the process exit and the destroy no longer runs against a deploy that is still creating resources. The signal handler keeps exiting immediately when there is nothing to roll back, which preserves the behaviour for reconciliations and every non-deploy command, and a second signal aborts a cleanup that hangs or that the user does not want. The rollback deadline is now runtime aware: controller-driven runtimes wait for the cluster to converge on the deletion, which legitimately outlasts the bound that is generous for a local teardown. CleanOnCancel becomes an atomic.Bool: it is written by deploy and read from the signal handler goroutine, and it now decides whether the process waits for a cleanup. As a side effect a signal arriving after a deploy has already succeeded no longer destroys the finished lab.
Download Containerlab binaries for commit e04e9ce:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9649038778/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9649010166/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Download Containerlab binaries for commit 6a70892:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9712890496/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9712889260/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Download Containerlab binaries for commit 1ab005c:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9713006343/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9713002934/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
|
TODO:
|
Download Containerlab binaries for commit 2caa997:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9737082449/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9737077308/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
|
Field report from a Talos cluster (public images only, no pull secret needed): every What happens:
Verified on a live cluster with this branch @2caa997: 1-node lab with Proposal:
Related clabernetes-side issue from the same debugging session: clabernetes/clabernetes#322 (OCI metadata resolution cannot follow CRI registry mirrors on airgapped clusters). |
…sted An unset --image-pull-secret no longer falls back to an implicit "regcred": the Topology (and the --no-topology-cr NodeProfile) carries no pull secret reference at all, and a reconcile clears a previously stamped default. The deploy wait now also aborts on the manager's ImagePullSecret* plan failures with the same debounce as registry metadata failures instead of hanging until the lab timeout.
Download Containerlab binaries for commit 20fcb05:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9768460597/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9768451010/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Download Containerlab binaries for commit 963aa4d:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9863324260/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9863262389/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Download Containerlab binaries for commit e38f8fb:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9886240718/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9886229109/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Local files a lab mounts into its nodes (startup configs, binds, env files, licenses) were always staged as ConfigMap binaryData, which Kubernetes serializes as base64. That kept every staged file unreadable in the cluster and in any exported manifest. Text files (valid UTF-8 without NUL bytes) now land in data as plain strings; only genuinely binary content stays in binaryData. The c9s node controller reads either field, and reconciling an existing lab rewrites its ConfigMaps in place while keeping their owner references.
`deploy --emit-crs` renders the resources a c9s deployment would create and writes them to stdout as a multi-document YAML stream (or a v1 List with --format json) without contacting the cluster, so they can be saved, edited by hand, and applied with kubectl. The bundle follows the runtime's apply order: the managed lab Namespace (omitted when a namespace override is in effect), the staged ConfigMaps, and then the Topology or, with --no-topology-cr, the compiled NodeProfile, Link, and Node resources. The other c9s deploy flags shape the emitted objects exactly as they shape a real deployment, and every object carries the labels containerlab uses to discover a lab, so an applied bundle stays manageable with inspect, exec, and destroy. The emitter is a ManifestEmitter implemented by the c9s runtime on top of the same preparation step deploy uses; the Namespace and ConfigMap constructors are shared with the apply path so emitted and applied objects are identical.
Download Containerlab binaries for commit de83aab:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9892339308/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/9892325197/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Download Containerlab binaries for commit 55ff224:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10110862205/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10110757623/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Download Containerlab binaries for commit 208cd5b:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10111400587/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10111392665/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Download Containerlab binaries for commit cca4dd9:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10111671154/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10111659057/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Download Containerlab binaries for commit e0830fb:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10113644220/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10113629035/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Download Containerlab binaries for commit 8c9679a:curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10149367389/zip" \
-o containerlab.zip && unzip -p containerlab.zip containerlab > containerlab.tmp && \
mv containerlab.tmp containerlab && rm containerlab.zip && chmod +x containerlabcontainerlab-arm64 (linux/arm64) curl -sL \
-H "Authorization: Bearer $(gh auth token)" \
"https://api.github.com/repos/srl-labs/containerlab/actions/artifacts/10149358527/zip" \
-o containerlab-arm.zip && unzip -p containerlab-arm.zip containerlab > containerlab-arm.tmp && \
mv containerlab-arm.tmp containerlab && rm containerlab-arm.zip && chmod +x containerlab |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #3217 +/- ##
==========================================
- Coverage 59.41% 58.06% -1.35%
==========================================
Files 252 277 +25
Lines 27126 31967 +4841
==========================================
+ Hits 16116 18562 +2446
- Misses 9249 11339 +2090
- Partials 1761 2066 +305
🚀 New features to boost your workflow:
|
Summary