mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-01-12 03:21:33 +00:00
improve api tests and error output
show only relevant aptly logs if a test fails. for async tasks, show task output, as it contains the error message.
This commit is contained in:
@@ -5,6 +5,7 @@ import random
|
||||
import shutil
|
||||
import string
|
||||
import time
|
||||
import tempfile
|
||||
|
||||
from lib import BaseTest
|
||||
|
||||
@@ -18,11 +19,32 @@ TASK_SUCCEEDED = 2
|
||||
TASK_FAILED = 3
|
||||
|
||||
|
||||
class AptlyStream:
|
||||
def __init__(self):
|
||||
self.tmp_file = tempfile.NamedTemporaryFile(delete=False)
|
||||
self.read_pos = 0
|
||||
|
||||
def fileno(self):
|
||||
return self.tmp_file.fileno()
|
||||
|
||||
def get_contents(self):
|
||||
self.tmp_file.seek(self.read_pos, 0)
|
||||
return self.tmp_file.read().decode("utf-8")
|
||||
|
||||
def close(self):
|
||||
self.tmp_file.close()
|
||||
|
||||
def clear(self):
|
||||
self.read_pos = self.tmp_file.tell()
|
||||
|
||||
|
||||
class APITest(BaseTest):
|
||||
"""
|
||||
BaseTest + testing aptly API
|
||||
"""
|
||||
aptly_server = None
|
||||
aptly_out = None
|
||||
debugOutput = True
|
||||
base_url = "127.0.0.1:8765"
|
||||
configOverride = {
|
||||
"FileSystemPublishEndpoints": {
|
||||
@@ -40,13 +62,20 @@ class APITest(BaseTest):
|
||||
if APITest.aptly_server is None:
|
||||
super(APITest, self).prepare()
|
||||
|
||||
APITest.aptly_out = AptlyStream()
|
||||
|
||||
configPath = os.path.join(os.environ["HOME"], self.aptlyConfigFile)
|
||||
APITest.aptly_server = self._start_process(f"aptly api serve -no-lock -config={configPath} -listen={self.base_url}",)
|
||||
APITest.aptly_server = self._start_process(f"aptly api serve -no-lock -config={configPath} -listen={self.base_url}", stdout=APITest.aptly_out, stderr=APITest.aptly_out)
|
||||
time.sleep(1)
|
||||
else:
|
||||
APITest.aptly_out.clear()
|
||||
|
||||
if os.path.exists(os.path.join(os.environ["HOME"], self.aptlyDir, "upload")):
|
||||
shutil.rmtree(os.path.join(os.environ["HOME"], self.aptlyDir, "upload"))
|
||||
|
||||
def debug_output(self):
|
||||
return APITest.aptly_out.get_contents()
|
||||
|
||||
def run(self):
|
||||
pass
|
||||
|
||||
@@ -79,6 +108,20 @@ class APITest(BaseTest):
|
||||
|
||||
return self.get("/api/tasks/" + str(_id))
|
||||
|
||||
def check_task(self, task):
|
||||
self.check_equal(task.status_code, 200)
|
||||
if task.json()['State'] != TASK_SUCCEEDED:
|
||||
resp2 = self.get("/api/tasks/" + str(task.json()['ID']) + "/output")
|
||||
raise Exception(f"task failed: {resp2.text}")
|
||||
|
||||
def check_task_fail(self, task, expected_output=None):
|
||||
self.check_equal(task.status_code, 200)
|
||||
if task.json()['State'] == TASK_SUCCEEDED:
|
||||
raise Exception("task expected to fail")
|
||||
if expected_output:
|
||||
resp = self.get("/api/tasks/" + str(task.json()['ID']) + "/output")
|
||||
self.check_equal(resp.text, expected_output)
|
||||
|
||||
def put(self, uri, *args, **kwargs):
|
||||
if "json" in kwargs:
|
||||
kwargs["data"] = json.dumps(kwargs.pop("json"))
|
||||
@@ -142,6 +185,8 @@ class APITest(BaseTest):
|
||||
cls.aptly_server.terminate()
|
||||
cls.aptly_server.wait()
|
||||
cls.aptly_server = None
|
||||
if APITest.aptly_out is not None:
|
||||
APITest.aptly_out.close()
|
||||
|
||||
def random_name(self):
|
||||
return ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(15))
|
||||
|
||||
@@ -128,6 +128,7 @@ class BaseTest(object):
|
||||
requiresGPG2 = False
|
||||
requiresDot = False
|
||||
sortOutput = False
|
||||
debugOutput = False
|
||||
|
||||
aptlyDir = ".aptly"
|
||||
aptlyConfigFile = ".aptly.conf"
|
||||
@@ -177,6 +178,10 @@ class BaseTest(object):
|
||||
try:
|
||||
self.run()
|
||||
self.check()
|
||||
except Exception as exc:
|
||||
if self.debugOutput:
|
||||
print(f"API log:\n{self.debug_output()}")
|
||||
raise exc
|
||||
finally:
|
||||
self.teardown()
|
||||
|
||||
|
||||
@@ -153,10 +153,8 @@ def run(include_long_tests=False, capture_results=False, tests=None, filters=Non
|
||||
|
||||
for (test, t, typ, val, tb, testModule) in fails:
|
||||
doc = t.__doc__ or ''
|
||||
print("%s:%s %s" % (test, t.__class__.__name__,
|
||||
testModule.__name__ + ": " + doc.strip()))
|
||||
traceback.print_exception(typ, val, tb)
|
||||
print("=" * 60)
|
||||
print(" - %s:%s %s" % (test, t.__class__.__name__,
|
||||
testModule.__name__ + ": " + doc.strip()))
|
||||
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
@@ -7,11 +7,16 @@ from api_lib import APITest
|
||||
|
||||
|
||||
def check_gpgkey_exists(gpg_key, keyring):
|
||||
subprocess.check_call([
|
||||
p = subprocess.Popen([
|
||||
"gpg", "--no-default-keyring",
|
||||
"--keyring", keyring,
|
||||
"--fingerprint", gpg_key,
|
||||
])
|
||||
"--fingerprint", gpg_key],
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
)
|
||||
p.communicate()
|
||||
if p.returncode != 0:
|
||||
raise Exception("gpg key does not exists")
|
||||
|
||||
|
||||
class GPGAPITestAddKey(APITest):
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from api_lib import TASK_SUCCEEDED, APITest
|
||||
from api_lib import APITest
|
||||
|
||||
|
||||
class MirrorsAPITestCreateShow(APITest):
|
||||
@@ -58,11 +58,8 @@ class MirrorsAPITestCreateUpdate(APITest):
|
||||
|
||||
mirror_desc["Name"] = self.random_name()
|
||||
resp = self.put_task("/api/mirrors/" + mirror_name, json=mirror_desc)
|
||||
self.check_equal(resp.status_code, 200)
|
||||
self.check_task(resp)
|
||||
_id = resp.json()['ID']
|
||||
if resp.json()["State"] != TASK_SUCCEEDED:
|
||||
resp = self.get("/api/tasks/" + str(_id) + "/output")
|
||||
raise Exception("task failed: " + str(resp.json()))
|
||||
|
||||
resp = self.get("/api/tasks/" + str(_id) + "/detail")
|
||||
self.check_equal(resp.status_code, 200)
|
||||
@@ -95,7 +92,7 @@ class MirrorsAPITestCreateDelete(APITest):
|
||||
self.check_equal(resp.status_code, 201)
|
||||
|
||||
resp = self.delete_task("/api/mirrors/" + mirror_name)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(resp)
|
||||
|
||||
|
||||
class MirrorsAPITestCreateList(APITest):
|
||||
@@ -154,8 +151,4 @@ class MirrorsAPITestSkipArchitectureCheck(APITest):
|
||||
mirror_desc = {'Name': mirror_name,
|
||||
'IgnoreSignatures': True}
|
||||
resp = self.put_task("/api/mirrors/" + mirror_name, json=mirror_desc)
|
||||
self.check_equal(resp.status_code, 200)
|
||||
_id = resp.json()['ID']
|
||||
if resp.json()["State"] != TASK_SUCCEEDED:
|
||||
resp = self.get("/api/tasks/" + str(_id) + "/output")
|
||||
raise Exception("task failed: " + str(resp.json()))
|
||||
self.check_task(resp)
|
||||
|
||||
@@ -2,7 +2,7 @@ import urllib.error
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
from api_lib import TASK_SUCCEEDED, APITest
|
||||
from api_lib import APITest
|
||||
|
||||
|
||||
class PackagesAPITestShow(APITest):
|
||||
@@ -19,7 +19,7 @@ class PackagesAPITestShow(APITest):
|
||||
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz").status_code, 200)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(resp)
|
||||
|
||||
# get information about package
|
||||
pyspi_json = {
|
||||
|
||||
@@ -27,11 +27,12 @@ class PublishAPITestRepo(APITest):
|
||||
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
|
||||
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
# publishing under prefix, default distribution
|
||||
prefix = self.random_name()
|
||||
resp = self.post_task(
|
||||
task = self.post_task(
|
||||
"/api/publish/" + prefix,
|
||||
json={
|
||||
"SourceKind": "local",
|
||||
@@ -39,6 +40,7 @@ class PublishAPITestRepo(APITest):
|
||||
"Signing": DefaultSigningOptions,
|
||||
}
|
||||
)
|
||||
self.check_task(task)
|
||||
repo_expected = {
|
||||
'AcquireByHash': False,
|
||||
'Architectures': ['i386', 'source'],
|
||||
@@ -56,8 +58,6 @@ class PublishAPITestRepo(APITest):
|
||||
'Storage': '',
|
||||
'Suite': ''}
|
||||
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
|
||||
all_repos = self.get("/api/publish")
|
||||
self.check_equal(all_repos.status_code, 200)
|
||||
self.check_in(repo_expected, all_repos.json())
|
||||
@@ -74,7 +74,7 @@ class PublishAPITestRepo(APITest):
|
||||
|
||||
# publishing under root, custom distribution, architectures
|
||||
distribution = self.random_name()
|
||||
resp = self.post_task(
|
||||
task = self.post_task(
|
||||
"/api/publish/:.",
|
||||
json={
|
||||
"SourceKind": "local",
|
||||
@@ -84,7 +84,7 @@ class PublishAPITestRepo(APITest):
|
||||
"Architectures": ["i386", "amd64"],
|
||||
}
|
||||
)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
repo2_expected = {
|
||||
'AcquireByHash': False,
|
||||
'Architectures': ['amd64', 'i386'],
|
||||
@@ -138,12 +138,14 @@ class PublishSnapshotAPITest(APITest):
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
|
||||
self.check_task(task)
|
||||
|
||||
prefix = self.random_name()
|
||||
resp = self.post_task(
|
||||
task = self.post_task(
|
||||
"/api/publish/" + prefix,
|
||||
json={
|
||||
"AcquireByHash": True,
|
||||
@@ -157,9 +159,9 @@ class PublishSnapshotAPITest(APITest):
|
||||
"Label": "fun",
|
||||
}
|
||||
)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
|
||||
_id = resp.json()['ID']
|
||||
_id = task.json()['ID']
|
||||
resp = self.get("/api/tasks/" + str(_id) + "/detail")
|
||||
self.check_equal(resp.json()['RemainingNumberOfPackages'], 0)
|
||||
self.check_equal(resp.json()['TotalNumberOfPackages'], 1)
|
||||
@@ -213,10 +215,11 @@ class PublishUpdateAPITestRepo(APITest):
|
||||
"pyspi_0.6.1-1.3.dsc",
|
||||
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
|
||||
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
prefix = self.random_name()
|
||||
resp = self.post_task(
|
||||
task = self.post_task(
|
||||
"/api/publish/" + prefix,
|
||||
json={
|
||||
"Architectures": ["i386", "source"],
|
||||
@@ -225,8 +228,7 @@ class PublishUpdateAPITestRepo(APITest):
|
||||
"Signing": DefaultSigningOptions,
|
||||
}
|
||||
)
|
||||
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_not_exists(
|
||||
"public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
|
||||
@@ -236,20 +238,22 @@ class PublishUpdateAPITestRepo(APITest):
|
||||
d = self.random_name()
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
|
||||
self.check_task(task)
|
||||
|
||||
# Update and switch AcquireByHash on.
|
||||
resp = self.put_task(
|
||||
task = self.put_task(
|
||||
"/api/publish/" + prefix + "/wheezy",
|
||||
json={
|
||||
"AcquireByHash": True,
|
||||
"Signing": DefaultSigningOptions,
|
||||
}
|
||||
)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
repo_expected = {
|
||||
'AcquireByHash': True,
|
||||
'Architectures': ['i386', 'source'],
|
||||
@@ -279,7 +283,8 @@ class PublishUpdateAPITestRepo(APITest):
|
||||
self.check_not_exists(
|
||||
"public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
|
||||
|
||||
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy").json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/publish/" + prefix + "/wheezy")
|
||||
self.check_task(task)
|
||||
self.check_not_exists("public/" + prefix + "dists/")
|
||||
|
||||
|
||||
@@ -300,10 +305,11 @@ class PublishConcurrentUpdateAPITestRepo(APITest):
|
||||
"pyspi_0.6.1-1.3.dsc",
|
||||
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
|
||||
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
prefix = self.random_name()
|
||||
resp = self.post_task(
|
||||
task = self.post_task(
|
||||
"/api/publish/" + prefix,
|
||||
json={
|
||||
"Architectures": ["i386", "source"],
|
||||
@@ -312,8 +318,7 @@ class PublishConcurrentUpdateAPITestRepo(APITest):
|
||||
"Signing": DefaultSigningOptions,
|
||||
}
|
||||
)
|
||||
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_not_exists(
|
||||
"public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
|
||||
@@ -323,10 +328,12 @@ class PublishConcurrentUpdateAPITestRepo(APITest):
|
||||
d = self.random_name()
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
|
||||
self.check_task(task)
|
||||
|
||||
def _do_update(result, index):
|
||||
resp = self.put_task(
|
||||
@@ -379,7 +386,8 @@ class PublishConcurrentUpdateAPITestRepo(APITest):
|
||||
self.check_not_exists(
|
||||
"public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
|
||||
|
||||
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy").json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/publish/" + prefix + "/wheezy")
|
||||
self.check_task(task)
|
||||
self.check_not_exists("public/" + prefix + "dists/")
|
||||
|
||||
|
||||
@@ -400,18 +408,18 @@ class PublishUpdateSkipCleanupAPITestRepo(APITest):
|
||||
"pyspi_0.6.1-1.3.dsc",
|
||||
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
|
||||
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
prefix = self.random_name()
|
||||
resp = self.post_task("/api/publish/" + prefix,
|
||||
task = self.post_task("/api/publish/" + prefix,
|
||||
json={
|
||||
"Architectures": ["i386", "source"],
|
||||
"SourceKind": "local",
|
||||
"Sources": [{"Name": repo_name}],
|
||||
"Signing": DefaultSigningOptions,
|
||||
})
|
||||
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_not_exists(
|
||||
"public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
|
||||
@@ -420,7 +428,7 @@ class PublishUpdateSkipCleanupAPITestRepo(APITest):
|
||||
|
||||
# Publish two repos, so that deleting one while skipping cleanup will
|
||||
# not delete the whole prefix.
|
||||
resp = self.post_task("/api/publish/" + prefix,
|
||||
task = self.post_task("/api/publish/" + prefix,
|
||||
json={
|
||||
"Architectures": ["i386", "source"],
|
||||
"Distribution": "otherdist",
|
||||
@@ -428,23 +436,24 @@ class PublishUpdateSkipCleanupAPITestRepo(APITest):
|
||||
"Sources": [{"Name": repo_name}],
|
||||
"Signing": DefaultSigningOptions,
|
||||
})
|
||||
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
|
||||
d = self.random_name()
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.put_task("/api/publish/" + prefix + "/wheezy",
|
||||
task = self.put_task("/api/publish/" + prefix + "/wheezy",
|
||||
json={
|
||||
"Signing": DefaultSigningOptions,
|
||||
"SkipCleanup": True,
|
||||
})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
repo_expected = {
|
||||
'AcquireByHash': False,
|
||||
'Architectures': ['i386', 'source'],
|
||||
@@ -471,7 +480,8 @@ class PublishUpdateSkipCleanupAPITestRepo(APITest):
|
||||
self.check_exists("public/" + prefix +
|
||||
"/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
|
||||
|
||||
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy", params={"SkipCleanup": "1"}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/publish/" + prefix + "/wheezy", params={"SkipCleanup": "1"})
|
||||
self.check_task(task)
|
||||
self.check_exists("public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
|
||||
self.check_exists("public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
|
||||
|
||||
@@ -493,13 +503,15 @@ class PublishSwitchAPITestRepo(APITest):
|
||||
"pyspi_0.6.1-1.3.dsc",
|
||||
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
|
||||
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
snapshot1_name = self.random_name()
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot1_name}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot1_name})
|
||||
self.check_task(task)
|
||||
|
||||
prefix = self.random_name()
|
||||
resp = self.post_task(
|
||||
task = self.post_task(
|
||||
"/api/publish/" + prefix,
|
||||
json={
|
||||
"Architectures": ["i386", "source"],
|
||||
@@ -507,8 +519,8 @@ class PublishSwitchAPITestRepo(APITest):
|
||||
"Sources": [{"Name": snapshot1_name}],
|
||||
"Signing": DefaultSigningOptions,
|
||||
})
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
repo_expected = {
|
||||
'AcquireByHash': False,
|
||||
'Architectures': ['i386', 'source'],
|
||||
@@ -537,22 +549,25 @@ class PublishSwitchAPITestRepo(APITest):
|
||||
d = self.random_name()
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
|
||||
self.check_task(task)
|
||||
|
||||
snapshot2_name = self.random_name()
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot2_name}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot2_name})
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.put_task(
|
||||
task = self.put_task(
|
||||
"/api/publish/" + prefix + "/wheezy",
|
||||
json={
|
||||
"Snapshots": [{"Component": "main", "Name": snapshot2_name}],
|
||||
"Signing": DefaultSigningOptions,
|
||||
"SkipContents": True,
|
||||
})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
repo_expected = {
|
||||
'AcquireByHash': False,
|
||||
'Architectures': ['i386', 'source'],
|
||||
@@ -579,7 +594,8 @@ class PublishSwitchAPITestRepo(APITest):
|
||||
self.check_not_exists(
|
||||
"public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
|
||||
|
||||
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy").json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/publish/" + prefix + "/wheezy")
|
||||
self.check_task(task)
|
||||
self.check_not_exists("public/" + prefix + "dists/")
|
||||
|
||||
|
||||
@@ -600,13 +616,15 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
|
||||
"pyspi_0.6.1-1.3.dsc",
|
||||
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
|
||||
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
snapshot1_name = self.random_name()
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot1_name}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot1_name})
|
||||
self.check_task(task)
|
||||
|
||||
prefix = self.random_name()
|
||||
resp = self.post_task("/api/publish/" + prefix,
|
||||
task = self.post_task("/api/publish/" + prefix,
|
||||
json={
|
||||
"Architectures": ["i386", "source"],
|
||||
"SourceKind": "snapshot",
|
||||
@@ -614,7 +632,7 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
|
||||
"Signing": DefaultSigningOptions,
|
||||
})
|
||||
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
repo_expected = {
|
||||
'AcquireByHash': False,
|
||||
'Architectures': ['i386', 'source'],
|
||||
@@ -642,7 +660,7 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
|
||||
|
||||
# Publish two snapshots, so that deleting one while skipping cleanup will
|
||||
# not delete the whole prefix.
|
||||
resp = self.post_task("/api/publish/" + prefix,
|
||||
task = self.post_task("/api/publish/" + prefix,
|
||||
json={
|
||||
"Architectures": ["i386", "source"],
|
||||
"Distribution": "otherdist",
|
||||
@@ -651,7 +669,7 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
|
||||
"Signing": DefaultSigningOptions,
|
||||
})
|
||||
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
repo_expected = {
|
||||
'AcquireByHash': False,
|
||||
'Architectures': ['i386', 'source'],
|
||||
@@ -675,22 +693,25 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
|
||||
d = self.random_name()
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
|
||||
self.check_task(task)
|
||||
|
||||
snapshot2_name = self.random_name()
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot2_name}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot2_name})
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.put_task("/api/publish/" + prefix + "/wheezy",
|
||||
task = self.put_task("/api/publish/" + prefix + "/wheezy",
|
||||
json={
|
||||
"Snapshots": [{"Component": "main", "Name": snapshot2_name}],
|
||||
"Signing": DefaultSigningOptions,
|
||||
"SkipCleanup": True,
|
||||
"SkipContents": True,
|
||||
})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
repo_expected = {
|
||||
'AcquireByHash': False,
|
||||
'Architectures': ['i386', 'source'],
|
||||
@@ -715,7 +736,8 @@ class PublishSwitchAPISkipCleanupTestRepo(APITest):
|
||||
self.check_exists("public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
|
||||
self.check_exists("public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
|
||||
|
||||
self.check_equal(self.delete_task("/api/publish/" + prefix + "/wheezy", params={"SkipCleanup": "1"}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/publish/" + prefix + "/wheezy", params={"SkipCleanup": "1"})
|
||||
self.check_task(task)
|
||||
self.check_exists("public/" + prefix + "/pool/main/b/boost-defaults/libboost-program-options-dev_1.49.0.1_i386.deb")
|
||||
self.check_exists("public/" + prefix + "/pool/main/p/pyspi/pyspi-0.6.1-1.3.stripped.dsc")
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from api_lib import TASK_FAILED, TASK_SUCCEEDED, APITest
|
||||
from api_lib import APITest
|
||||
|
||||
from .publish import DefaultSigningOptions
|
||||
|
||||
@@ -41,7 +41,8 @@ class ReposAPITestCreateIndexDelete(APITest):
|
||||
names = [repo["Name"] for repo in repos]
|
||||
assert repo_name in names
|
||||
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name).json()['State'], TASK_SUCCEEDED)
|
||||
resp = self.delete_task("/api/repos/" + repo_name)
|
||||
self.check_task(resp)
|
||||
self.check_equal(self.delete("/api/repos/" + repo_name).status_code, 404)
|
||||
|
||||
self.check_equal(self.get("/api/repos/" + repo_name).status_code, 404)
|
||||
@@ -61,25 +62,32 @@ class ReposAPITestCreateIndexDelete(APITest):
|
||||
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz").status_code, 200)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(resp)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/snapshots", json={"Name": repo_name}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/snapshots", json={"Name": repo_name})
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.post_task("/api/publish",
|
||||
json={
|
||||
"SourceKind": "local",
|
||||
"Sources": [{"Name": repo_name}],
|
||||
"Signing": DefaultSigningOptions,
|
||||
}).json()['State'], TASK_SUCCEEDED)
|
||||
resp = self.post_task("/api/publish",
|
||||
json={
|
||||
"SourceKind": "local",
|
||||
"Sources": [{"Name": repo_name}],
|
||||
"Signing": DefaultSigningOptions,
|
||||
})
|
||||
self.check_task(resp)
|
||||
|
||||
# repo is not deletable while it is published
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name).json()['State'], TASK_FAILED)
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name, params={"force": "1"}).json()['State'], TASK_FAILED)
|
||||
task = self.delete_task("/api/repos/" + repo_name)
|
||||
self.check_task_fail(task)
|
||||
task = self.delete_task("/api/repos/" + repo_name, params={"force": "1"})
|
||||
self.check_task_fail(task)
|
||||
|
||||
# drop published
|
||||
self.check_equal(self.delete_task("/api/publish//" + distribution).json()['State'], TASK_SUCCEEDED)
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name).json()['State'], TASK_FAILED)
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name, params={"force": "1"}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/publish//" + distribution)
|
||||
self.check_task(task)
|
||||
task = self.delete_task("/api/repos/" + repo_name)
|
||||
self.check_task_fail(task)
|
||||
task = self.delete_task("/api/repos/" + repo_name, params={"force": "1"})
|
||||
self.check_task(task)
|
||||
self.check_equal(self.get("/api/repos/" + repo_name).status_code, 404)
|
||||
|
||||
|
||||
@@ -97,7 +105,7 @@ class ReposAPITestAdd(APITest):
|
||||
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz").status_code, 200)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(resp)
|
||||
|
||||
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
||||
self.check_equal(resp.status_code, 200)
|
||||
@@ -125,7 +133,8 @@ class ReposAPITestAddNotFullRemove(APITest):
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz", "aptly.pub").status_code, 200)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
self.check_equal(self.get("/api/repos/" + repo_name + "/packages").json(), ['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
|
||||
|
||||
self.check_exists("upload/" + d + "/aptly.pub")
|
||||
@@ -145,7 +154,8 @@ class ReposAPITestAddNoRemove(APITest):
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"pyspi_0.6.1-1.3.dsc", "pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz").status_code, 200)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d, params={"noRemove": 1}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d, params={"noRemove": 1})
|
||||
self.check_task(task)
|
||||
self.check_equal(self.get("/api/repos/" + repo_name + "/packages").json(), ['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
|
||||
|
||||
self.check_exists("upload/" + d + "/pyspi_0.6.1-1.3.dsc")
|
||||
@@ -165,7 +175,7 @@ class ReposAPITestAddFile(APITest):
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d + "/libboost-program-options-dev_1.49.0.1_i386.deb")
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(resp)
|
||||
|
||||
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
||||
self.check_equal(resp.status_code, 200)
|
||||
@@ -197,7 +207,7 @@ class ReposAPITestInclude(APITest):
|
||||
self.check_equal(resp.status_code, 200)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repo_name + "/include/" + d, params={"ignoreSignature": 1})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(resp)
|
||||
|
||||
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
||||
self.check_equal(resp.status_code, 200)
|
||||
@@ -225,7 +235,8 @@ class ReposAPITestShowQuery(APITest):
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb", "pyspi_0.6.1-1.3.dsc",
|
||||
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
|
||||
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages", params={"q": "pyspi"}).json()),
|
||||
['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e', 'Psource pyspi 0.6.1-1.4 f8f1daa806004e89'])
|
||||
@@ -258,13 +269,15 @@ class ReposAPITestAddMultiple(APITest):
|
||||
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
|
||||
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d + "/pyspi_0.6.1-1.3.dsc",
|
||||
params={"noRemove": 1}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d + "/pyspi_0.6.1-1.3.dsc",
|
||||
params={"noRemove": 1})
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
|
||||
['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d + "/pyspi-0.6.1-1.3.stripped.dsc").json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d + "/pyspi-0.6.1-1.3.stripped.dsc")
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
|
||||
['Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e', 'Psource pyspi 0.6.1-1.4 f8f1daa806004e89'])
|
||||
@@ -286,34 +299,39 @@ class ReposAPITestPackagesAddDelete(APITest):
|
||||
"pyspi_0.6.1-1.3.diff.gz", "pyspi_0.6.1.orig.tar.gz",
|
||||
"pyspi-0.6.1-1.3.stripped.dsc").status_code, 200)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
|
||||
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
|
||||
'Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e',
|
||||
'Psource pyspi 0.6.1-1.4 f8f1daa806004e89'])
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
|
||||
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
|
||||
'Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e',
|
||||
'Psource pyspi 0.6.1-1.4 f8f1daa806004e89'])
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89',
|
||||
'Psource no-such-package 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_FAILED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89',
|
||||
'Psource no-such-package 0.6.1-1.4 f8f1daa806004e89']})
|
||||
self.check_task_fail(task)
|
||||
|
||||
self.check_equal(self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
|
||||
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
|
||||
'Psource pyspi 0.6.1-1.3 3a8b37cbd9a3559e'])
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89']})
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(sorted(self.get("/api/repos/" + repo_name + "/packages").json()),
|
||||
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
|
||||
@@ -324,9 +342,10 @@ class ReposAPITestPackagesAddDelete(APITest):
|
||||
|
||||
self.check_equal(self.post("/api/repos", json={"Name": repo_name2, "Comment": "fun repo"}).status_code, 201)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name2 + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89',
|
||||
'Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378']}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name2 + "/packages/",
|
||||
json={"PackageRefs": ['Psource pyspi 0.6.1-1.4 f8f1daa806004e89',
|
||||
'Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378']})
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(sorted(self.get("/api/repos/" + repo_name2 + "/packages").json()),
|
||||
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378',
|
||||
@@ -349,7 +368,7 @@ class ReposAPITestShowMaxVersion(APITest):
|
||||
).status_code, 200)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(resp)
|
||||
|
||||
resp = self.get("/api/tasks/" + str(resp.json()['ID']) + "/output")
|
||||
self.check_equal(resp.status_code, 200)
|
||||
@@ -377,7 +396,7 @@ class ReposAPITestCopyPackage(APITest):
|
||||
d = self.random_name()
|
||||
self.check_equal(self.upload(f"/api/files/{d}", f"{pkg_name}.deb").status_code, 200)
|
||||
resp = self.post_task(f"/api/repos/{repo1_name}/file/{d}")
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(resp)
|
||||
|
||||
# Creating target repo
|
||||
repo2_name = self.random_name()
|
||||
@@ -385,8 +404,11 @@ class ReposAPITestCopyPackage(APITest):
|
||||
|
||||
# Copy the package
|
||||
resp = self.post_task(f"/api/repos/{repo2_name}/copy/{repo1_name}/{pkg_name}")
|
||||
self.check_equal(resp.status_code, 200)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(resp)
|
||||
|
||||
# Test non-existing package
|
||||
resp = self.post_task(f"/api/repos/{repo2_name}/copy/{repo1_name}/la<la>la")
|
||||
self.check_task_fail(resp)
|
||||
|
||||
self.check_equal(self.get(f"/api/repos/{repo2_name}/packages").json(),
|
||||
['Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378'])
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from api_lib import TASK_FAILED, TASK_SUCCEEDED, APITest
|
||||
from api_lib import TASK_FAILED, APITest
|
||||
|
||||
from .publish import DefaultSigningOptions
|
||||
|
||||
@@ -13,8 +13,8 @@ class SnapshotsAPITestCreateShowEmpty(APITest):
|
||||
'Name': snapshot_name}
|
||||
|
||||
# create empty snapshot
|
||||
resp = self.post_task("/api/snapshots", json=snapshot_desc)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/snapshots", json=snapshot_desc)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_subset(snapshot_desc, self.get("/api/snapshots/" + snapshot_name).json())
|
||||
self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 200)
|
||||
@@ -47,8 +47,8 @@ class SnapshotsAPITestCreateFromRefs(APITest):
|
||||
|
||||
# create empty snapshot
|
||||
empty_snapshot_name = self.random_name()
|
||||
resp = self.post_task("/api/snapshots", json={"Name": empty_snapshot_name})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/snapshots", json={"Name": empty_snapshot_name})
|
||||
self.check_task(task)
|
||||
self.check_equal(
|
||||
self.get("/api/snapshots/" + empty_snapshot_name).json()['Description'], "Created as empty"
|
||||
)
|
||||
@@ -59,14 +59,15 @@ class SnapshotsAPITestCreateFromRefs(APITest):
|
||||
d = self.random_name()
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
# create snapshot with empty snapshot as source and package
|
||||
snapshot = snapshot_desc.copy()
|
||||
snapshot['PackageRefs'] = ["Pi386 libboost-program-options-dev 1.49.0.1 918d2f433384e378"]
|
||||
snapshot['SourceSnapshots'] = [empty_snapshot_name]
|
||||
resp = self.post_task("/api/snapshots", json=snapshot)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/snapshots", json=snapshot)
|
||||
self.check_task(task)
|
||||
snapshot.pop('SourceSnapshots')
|
||||
snapshot.pop('PackageRefs')
|
||||
resp = self.get("/api/snapshots/" + snapshot_name)
|
||||
@@ -100,8 +101,8 @@ class SnapshotsAPITestCreateFromRepo(APITest):
|
||||
snapshot_name = self.random_name()
|
||||
self.check_equal(self.post("/api/repos", json={"Name": repo_name}).status_code, 201)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
|
||||
self.check_task(task)
|
||||
self.check_equal([],
|
||||
self.get("/api/snapshots/" + snapshot_name + "/packages", params={"format": "details"}).json())
|
||||
|
||||
@@ -110,10 +111,11 @@ class SnapshotsAPITestCreateFromRepo(APITest):
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
|
||||
self.check_task(task)
|
||||
self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 200)
|
||||
|
||||
self.check_subset({'Architecture': 'i386',
|
||||
@@ -143,13 +145,13 @@ class SnapshotsAPITestCreateUpdate(APITest):
|
||||
snapshot_desc = {'Description': 'fun snapshot',
|
||||
'Name': snapshot_name}
|
||||
|
||||
resp = self.post_task("/api/snapshots", json=snapshot_desc)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/snapshots", json=snapshot_desc)
|
||||
self.check_task(task)
|
||||
|
||||
new_snapshot_name = self.random_name()
|
||||
resp = self.put_task("/api/snapshots/" + snapshot_name, json={'Name': new_snapshot_name,
|
||||
task = self.put_task("/api/snapshots/" + snapshot_name, json={'Name': new_snapshot_name,
|
||||
'Description': 'New description'})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.get("/api/snapshots/" + new_snapshot_name)
|
||||
self.check_equal(resp.status_code, 200)
|
||||
@@ -176,16 +178,18 @@ class SnapshotsAPITestCreateDelete(APITest):
|
||||
'Name': snapshot_name}
|
||||
|
||||
# deleting unreferenced snapshot
|
||||
resp = self.post_task("/api/snapshots", json=snapshot_desc)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/snapshots", json=snapshot_desc)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.delete_task("/api/snapshots/" + snapshot_name).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/snapshots/" + snapshot_name)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.get("/api/snapshots/" + snapshot_name).status_code, 404)
|
||||
|
||||
# deleting referenced snapshot
|
||||
snap1, snap2 = self.random_name(), self.random_name()
|
||||
self.check_equal(self.post_task("/api/snapshots", json={"Name": snap1}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/snapshots", json={"Name": snap1})
|
||||
self.check_task(task)
|
||||
self.check_equal(
|
||||
self.post_task(
|
||||
"/api/snapshots", json={"Name": snap2, "SourceSnapshots": [snap1]}
|
||||
@@ -194,11 +198,12 @@ class SnapshotsAPITestCreateDelete(APITest):
|
||||
|
||||
self.check_equal(self.delete_task("/api/snapshots/" + snap1).json()['State'], TASK_FAILED)
|
||||
self.check_equal(self.get("/api/snapshots/" + snap1).status_code, 200)
|
||||
self.check_equal(self.delete_task("/api/snapshots/" + snap1, params={"force": "1"}).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.delete_task("/api/snapshots/" + snap1, params={"force": "1"})
|
||||
self.check_task(task)
|
||||
self.check_equal(self.get("/api/snapshots/" + snap1).status_code, 404)
|
||||
|
||||
# deleting published snapshot
|
||||
resp = self.post_task(
|
||||
task = self.post_task(
|
||||
"/api/publish",
|
||||
json={
|
||||
"SourceKind": "snapshot",
|
||||
@@ -208,7 +213,7 @@ class SnapshotsAPITestCreateDelete(APITest):
|
||||
"Signing": DefaultSigningOptions,
|
||||
}
|
||||
)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
|
||||
self.check_equal(self.delete_task("/api/snapshots/" + snap2).json()['State'], TASK_FAILED)
|
||||
self.check_equal(self.delete_task("/api/snapshots/" + snap2, params={"force": "1"}).json()['State'], TASK_FAILED)
|
||||
@@ -228,10 +233,11 @@ class SnapshotsAPITestSearch(APITest):
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repo_name + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repo_name + '/snapshots', json={'Name': snapshot_name})
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.get("/api/snapshots/" + snapshot_name + "/packages",
|
||||
params={"q": "libboost-program-options-dev", "format": "details"})
|
||||
@@ -262,13 +268,14 @@ class SnapshotsAPITestDiff(APITest):
|
||||
self.check_equal(self.upload("/api/files/" + d,
|
||||
"libboost-program-options-dev_1.49.0.1_i386.deb").status_code, 200)
|
||||
|
||||
self.check_equal(self.post_task("/api/repos/" + repos[-1] + "/file/" + d).json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repos[-1] + "/file/" + d)
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.post_task("/api/repos/" + repos[-1] + '/snapshots', json={'Name': snapshots[0]})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/repos/" + repos[-1] + '/snapshots', json={'Name': snapshots[0]})
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.post_task("/api/snapshots", json={'Name': snapshots[1]})
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/snapshots", json={'Name': snapshots[1]})
|
||||
self.check_task(task)
|
||||
|
||||
resp = self.get("/api/snapshots/" + snapshots[0] + "/diff/" + snapshots[1])
|
||||
self.check_equal(resp.status_code, 200)
|
||||
@@ -302,19 +309,19 @@ class SnapshotsAPITestMerge(APITest):
|
||||
|
||||
# create source snapshots
|
||||
for source in sources:
|
||||
resp = self.post_task("/api/snapshots", json=source)
|
||||
self.check_equal(resp.json()["State"], TASK_SUCCEEDED)
|
||||
task = self.post_task("/api/snapshots", json=source)
|
||||
self.check_task(task)
|
||||
|
||||
# create merge snapshot
|
||||
merged_name = self.random_name()
|
||||
resp = self.post_task(
|
||||
task = self.post_task(
|
||||
"/api/snapshots/merge",
|
||||
json={
|
||||
"Destination": merged_name,
|
||||
"Sources": [source["Name"] for source in sources],
|
||||
},
|
||||
)
|
||||
self.check_equal(resp.json()["State"], TASK_SUCCEEDED)
|
||||
self.check_task(task)
|
||||
|
||||
# check merge snapshot
|
||||
resp = self.get(f"/api/snapshots/{merged_name}")
|
||||
@@ -329,9 +336,8 @@ class SnapshotsAPITestMerge(APITest):
|
||||
)
|
||||
|
||||
# remove merge snapshot
|
||||
self.check_equal(
|
||||
self.delete_task(f"/api/snapshots/{merged_name}").json()["State"], TASK_SUCCEEDED
|
||||
)
|
||||
task = self.delete_task(f"/api/snapshots/{merged_name}")
|
||||
self.check_task(task)
|
||||
|
||||
# create merge snapshot without sources
|
||||
merged_name = self.random_name()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from api_lib import TASK_SUCCEEDED, APITest
|
||||
from api_lib import APITest
|
||||
|
||||
from .publish import DefaultSigningOptions
|
||||
|
||||
@@ -49,9 +49,8 @@ class TaskAPITestParallelTasks(APITest):
|
||||
|
||||
def _wait_for_task(self, task_id):
|
||||
uri = "/api/tasks/%d/wait" % int(task_id)
|
||||
resp = self.get(uri)
|
||||
self.check_equal(resp.status_code, 200)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.get(uri)
|
||||
self.check_task(task)
|
||||
|
||||
def _wait_for_all_tasks(self):
|
||||
resp = self.get("/api/tasks-wait")
|
||||
@@ -103,6 +102,5 @@ class TaskAPITestParallelTasks(APITest):
|
||||
self._wait_for_all_tasks()
|
||||
|
||||
for publish_task_id in publish_task_ids:
|
||||
resp = self.get("/api/tasks/%d" % publish_task_id)
|
||||
self.check_equal(resp.status_code, 200)
|
||||
self.check_equal(resp.json()['State'], TASK_SUCCEEDED)
|
||||
task = self.get("/api/tasks/%d" % publish_task_id)
|
||||
self.check_task(task)
|
||||
|
||||
@@ -6,19 +6,28 @@ import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
from lib import BaseTest
|
||||
from api_lib import AptlyStream
|
||||
|
||||
|
||||
class UnixSocketAPITest(BaseTest):
|
||||
aptly_server = None
|
||||
socket_path = "/tmp/_aptly_test.sock"
|
||||
base_url = ("unix://%s" % socket_path)
|
||||
aptly_out = None
|
||||
debugOutput = True
|
||||
|
||||
def prepare(self):
|
||||
if self.aptly_server is None:
|
||||
self.aptly_server = self._start_process("aptly api serve -no-lock -listen=%s" % (self.base_url),)
|
||||
UnixSocketAPITest.aptly_out = AptlyStream()
|
||||
self.aptly_server = self._start_process("aptly api serve -no-lock -listen=%s" % (self.base_url), stdout=UnixSocketAPITest.aptly_out, stderr=UnixSocketAPITest.aptly_out)
|
||||
time.sleep(1)
|
||||
else:
|
||||
UnixSocketAPITest.aptly_out.clear()
|
||||
super(UnixSocketAPITest, self).prepare()
|
||||
|
||||
def debug_output(self):
|
||||
return UnixSocketAPITest.aptly_out.get_contents()
|
||||
|
||||
def shutdown(self):
|
||||
if self.aptly_server is not None:
|
||||
self.aptly_server.terminate()
|
||||
|
||||
Reference in New Issue
Block a user