Files
aptly/system/t12_api/mirrors.py
2026-04-12 22:26:58 +02:00

303 lines
12 KiB
Python

from api_lib import APITest
class MirrorsAPITestCreateShow(APITest):
"""
POST /api/mirrors, GET /api/mirrors/:name/packages
"""
def check(self):
mirror_name = self.random_name()
mirror_desc = {'Name': mirror_name,
'ArchiveURL': 'http://repo.aptly.info/system-tests/security.debian.org/debian-security/',
'Architectures': ['amd64'],
'Components': ['main'],
'Distribution': 'buster/updates'}
resp = self.post("/api/mirrors", json=mirror_desc)
self.check_equal(resp.status_code, 400)
self.check_equal({
'error': 'unable to fetch mirror: verification of detached signature failed: exit status 2',
}, resp.json())
mirror_desc['IgnoreSignatures'] = True
resp = self.post("/api/mirrors", json=mirror_desc)
self.check_equal(resp.status_code, 201)
resp = self.get("/api/mirrors/" + mirror_name)
self.check_equal(resp.status_code, 200)
self.check_subset({'Name': mirror_name,
'ArchiveRoot': 'http://repo.aptly.info/system-tests/security.debian.org/debian-security/',
'Architectures': ['amd64'],
'Components': ['main'],
'Distribution': 'buster/updates'}, resp.json())
resp = self.get("/api/mirrors/" + mirror_desc["Name"] + "/packages")
self.check_equal(resp.status_code, 404)
class MirrorsAPITestCreateUpdate(APITest):
"""
POST /api/mirrors, PUT /api/mirrors/:name, GET /api/mirrors/:name/packages
"""
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/',
'Distribution': 'wheezy',
'Keyrings': ["aptlytest.gpg"],
'Architectures': ["amd64"],
'Components': ['main']}
mirror_desc['IgnoreSignatures'] = True
resp = self.post("/api/mirrors", json=mirror_desc)
self.check_equal(resp.status_code, 201)
resp = self.get("/api/mirrors/" + mirror_name + "/packages")
self.check_equal(resp.status_code, 404)
resp = self.put_task("/api/mirrors/" + mirror_name, json=mirror_desc)
self.check_task(resp)
_id = resp.json()['ID']
resp = self.get("/api/tasks/" + str(_id) + "/detail")
self.check_equal(resp.status_code, 200)
self.check_equal(resp.json()['RemainingDownloadSize'], 0)
self.check_equal(resp.json()['RemainingNumberOfPackages'], 0)
resp = self.get("/api/mirrors/" + mirror_desc["Name"])
self.check_equal(resp.status_code, 200)
self.check_subset({'Name': mirror_desc["Name"],
'ArchiveRoot': 'http://repo.aptly.info/system-tests/packagecloud.io/varnishcache/varnish30/debian/',
'Distribution': 'wheezy'}, resp.json())
resp = self.get("/api/mirrors/" + mirror_desc["Name"] + "/packages")
self.check_equal(resp.status_code, 200)
class MirrorsAPITestCreateDelete(APITest):
"""
POST /api/mirrors, DELETE /api/mirrors/:name
"""
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']}
resp = self.post("/api/mirrors", json=mirror_desc)
self.check_equal(resp.status_code, 201)
resp = self.delete_task("/api/mirrors/" + mirror_name)
self.check_task(resp)
class MirrorsAPITestCreateList(APITest):
"""
GET /api/mirrors, POST /api/mirrors, GET /api/mirrors
"""
def check(self):
resp = self.get("/api/mirrors")
self.check_equal(resp.status_code, 200)
count = len(resp.json())
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']}
resp = self.post("/api/mirrors", json=mirror_desc)
self.check_equal(resp.status_code, 201)
resp = self.get("/api/mirrors")
self.check_equal(resp.status_code, 200)
self.check_equal(len(resp.json()), count + 1)
class MirrorsAPITestSkipArchitectureCheck(APITest):
"""
GET /api/mirrors, POST /api/mirrors, GET /api/mirrors
This tests SkipArchitectureCheck and IgnoreSignatures via API.
The repo to be mirrored requires the SkipArchitectureCheck and SkipComponentCheck in order to be mirrored.
"""
def check(self):
resp = self.get("/api/mirrors")
self.check_equal(resp.status_code, 200)
count = len(resp.json())
mirror_name = self.random_name()
mirror_desc = {'Name': mirror_name,
'ArchiveURL': 'http://repo.aptly.info/system-tests/pkg.duosecurity.com/Debian',
'Architectures': ['amd64', 'i386'],
'SkipArchitectureCheck': True,
'SkipComponentCheck': True,
'IgnoreSignatures': True,
'Distribution': 'bookworm',
'Components': ['main']}
resp = self.post("/api/mirrors", json=mirror_desc)
self.check_equal(resp.status_code, 201)
resp = self.get("/api/mirrors")
self.check_equal(resp.status_code, 200)
self.check_equal(len(resp.json()), count + 1)
mirror_desc = {'Name': mirror_name,
'IgnoreSignatures': True}
resp = self.put_task("/api/mirrors/" + mirror_name, json=mirror_desc)
self.check_task(resp)
class MirrorsAPITestEdit(APITest):
"""
POST /api/mirrors/{name} - Edit mirror configuration
"""
def check(self):
# Create a mirror first
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)
# Test editing basic properties (Filter, FilterWithDeps, Download options)
edit_params = {
'Filter': 'varnish',
'FilterWithDeps': True,
'DownloadSources': True,
'DownloadInstaller': False,
'DownloadUdebs': False
}
resp = self.post("/api/mirrors/" + mirror_name, json=edit_params)
self.check_equal(resp.status_code, 200)
self.check_subset({
'Name': mirror_name,
'Filter': 'varnish',
'FilterWithDeps': True,
'DownloadSources': True
}, resp.json())
# Verify the changes persisted
resp = self.get("/api/mirrors/" + mirror_name)
self.check_equal(resp.status_code, 200)
self.check_subset({
'Filter': 'varnish',
'FilterWithDeps': True,
'DownloadSources': True
}, resp.json())
# Test editing with empty filter to clear it
edit_params = {'Filter': ''}
resp = self.post("/api/mirrors/" + mirror_name, json=edit_params)
self.check_equal(resp.status_code, 200)
self.check_equal(resp.json()['Filter'], '')
class MirrorsAPITestEditNotFound(APITest):
"""
POST /api/mirrors/{name} - Edit non-existent mirror
"""
def check(self):
resp = self.post("/api/mirrors/non-existent-mirror", json={'Filter': 'test'})
self.check_equal(resp.status_code, 404)
self.check_in('unable to edit', resp.json()['error'])
class MirrorsAPITestEditArchitectures(APITest):
"""
POST /api/mirrors/{name} - Edit mirror architectures (triggers fetch)
"""
def check(self):
# Create a mirror
mirror_name = self.random_name()
mirror_desc = {'Name': mirror_name,
'ArchiveURL': 'http://repo.aptly.info/system-tests/security.debian.org/debian-security/',
'IgnoreSignatures': True,
'Distribution': 'buster/updates',
'Components': ['main'],
'Architectures': ['amd64']}
resp = self.post("/api/mirrors", json=mirror_desc)
self.check_equal(resp.status_code, 201)
# Edit architectures (should trigger a fetch)
edit_params = {
'Architectures': ['amd64', 'i386'],
'IgnoreSignatures': True
}
resp = self.post("/api/mirrors/" + mirror_name, json=edit_params)
self.check_equal(resp.status_code, 200)
# Verify architectures were updated
resp = self.get("/api/mirrors/" + mirror_name)
self.check_equal(resp.status_code, 200)
architectures = resp.json()['Architectures']
self.check_equal(sorted(architectures), ['amd64', 'i386'])
class MirrorsAPITestEditArchiveURL(APITest):
"""
POST /api/mirrors/{name} - Edit mirror archive URL (triggers fetch)
"""
def check(self):
# Create a mirror
mirror_name = self.random_name()
mirror_desc = {'Name': mirror_name,
'ArchiveURL': 'http://repo.aptly.info/system-tests/ftp.ru.debian.org/debian',
'IgnoreSignatures': True,
'Distribution': 'bookworm',
'Components': ['main'],
'Architectures': ['amd64']}
resp = self.post("/api/mirrors", json=mirror_desc)
self.check_equal(resp.status_code, 201)
# Edit archive URL (should trigger a fetch)
edit_params = {
'ArchiveURL': 'http://repo.aptly.info/system-tests/ftp.ch.debian.org/debian',
'IgnoreSignatures': True
}
resp = self.post("/api/mirrors/" + mirror_name, json=edit_params)
self.check_equal(resp.status_code, 200)
# Verify URL was updated
resp = self.get("/api/mirrors/" + mirror_name)
self.check_equal(resp.status_code, 200)
self.check_equal(resp.json()['ArchiveRoot'], 'http://repo.aptly.info/system-tests/ftp.ch.debian.org/debian/')
class MirrorsAPITestEditFlatMirrorUdebs(APITest):
"""
POST /api/mirrors/{name} - Edit flat mirror with udebs (should fail)
"""
def check(self):
# Create a flat mirror
mirror_name = self.random_name()
mirror_desc = {'Name': mirror_name,
'ArchiveURL': 'http://repo.aptly.info/system-tests/cloud.r-project.org/bin/linux/debian/bullseye-cran40/',
'IgnoreSignatures': True,
'Architectures': ['amd64']}
resp = self.post("/api/mirrors", json=mirror_desc)
self.check_equal(resp.status_code, 201)
# Try to enable udebs on a flat mirror (should fail)
edit_params = {'DownloadUdebs': True}
resp = self.post("/api/mirrors/" + mirror_name, json=edit_params)
self.check_equal(resp.status_code, 400)
self.check_in("flat mirrors don't support udebs", resp.json()['error'])