From d64ce33e2ab9e32274c819507047e7ce168371fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Roth?= Date: Mon, 29 Jun 2026 11:14:56 +0200 Subject: [PATCH] mirror: fix rename --- api/mirror.go | 1 + system/t12_api/mirrors.py | 72 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/api/mirror.go b/api/mirror.go index afc7d007..80aa8e0a 100644 --- a/api/mirror.go +++ b/api/mirror.go @@ -597,6 +597,7 @@ func apiMirrorsUpdate(c *gin.Context) { if err == nil { return &task.ProcessReturnValue{Code: http.StatusConflict, Value: nil}, fmt.Errorf("unable to rename: mirror %s already exists", b.Name) } + remote.Name = b.Name } downloader := context.NewDownloader(out) diff --git a/system/t12_api/mirrors.py b/system/t12_api/mirrors.py index a38efe3e..1e610f8f 100644 --- a/system/t12_api/mirrors.py +++ b/system/t12_api/mirrors.py @@ -279,6 +279,78 @@ class MirrorsAPITestEditArchiveURL(APITest): self.check_equal(resp.json()['ArchiveRoot'], 'http://repo.aptly.info/system-tests/ftp.ch.debian.org/debian/') +class MirrorsAPITestRename(APITest): + """ + PUT /api/mirrors/:name - Rename mirror via update endpoint + """ + def check(self): + mirror_name = self.random_name() + mirror_desc = {'Name': mirror_name, + 'ArchiveURL': 'http://repo.aptly.info/system-tests/packagecloud.io/varnishcache/varnish30/debian/', + 'IgnoreSignatures': True, + 'Distribution': 'wheezy', + 'Components': ['main'], + 'Architectures': ['amd64']} + + resp = self.post("/api/mirrors", json=mirror_desc) + self.check_equal(resp.status_code, 201) + + # Rename the mirror via PUT + new_name = self.random_name() + resp = self.put_task("/api/mirrors/" + mirror_name, json={'Name': new_name, 'IgnoreSignatures': True}) + self.check_task(resp) + + # Old name should no longer exist + resp = self.get("/api/mirrors/" + mirror_name) + self.check_equal(resp.status_code, 404) + + # New name should exist with correct data + resp = self.get("/api/mirrors/" + new_name) + self.check_equal(resp.status_code, 200) + self.check_subset({'Name': new_name, + 'ArchiveRoot': 'http://repo.aptly.info/system-tests/packagecloud.io/varnishcache/varnish30/debian/', + 'Distribution': 'wheezy'}, resp.json()) + + +class MirrorsAPITestRenameConflict(APITest): + """ + PUT /api/mirrors/:name - Rename mirror to an already existing name should fail with 409 + """ + def check(self): + mirror_name_a = self.random_name() + mirror_name_b = self.random_name() + + mirror_desc_a = {'Name': mirror_name_a, + 'ArchiveURL': 'http://repo.aptly.info/system-tests/packagecloud.io/varnishcache/varnish30/debian/', + 'IgnoreSignatures': True, + 'Distribution': 'wheezy', + 'Components': ['main'], + 'Architectures': ['amd64']} + + mirror_desc_b = {'Name': mirror_name_b, + 'ArchiveURL': 'http://repo.aptly.info/system-tests/packagecloud.io/varnishcache/varnish30/debian/', + 'IgnoreSignatures': True, + 'Distribution': 'wheezy', + 'Components': ['main'], + 'Architectures': ['amd64']} + + resp = self.post("/api/mirrors", json=mirror_desc_a) + self.check_equal(resp.status_code, 201) + + resp = self.post("/api/mirrors", json=mirror_desc_b) + self.check_equal(resp.status_code, 201) + + # Try to rename mirror A to mirror B's name — should fail with 409 + resp = self.put("/api/mirrors/" + mirror_name_a, json={'Name': mirror_name_b, 'IgnoreSignatures': True}) + self.check_equal(resp.status_code, 409) + self.check_in('unable to rename', resp.json()['error']) + + # Mirror A should still exist under its original name + resp = self.get("/api/mirrors/" + mirror_name_a) + self.check_equal(resp.status_code, 200) + self.check_subset({'Name': mirror_name_a}, resp.json()) + + class MirrorsAPITestEditFlatMirrorUdebs(APITest): """ POST /api/mirrors/{name} - Edit flat mirror with udebs (should fail)