| |
@@ -60,8 +60,8 @@
|
| |
# Full path will be:
|
| |
# /pub/alt/stage/$VERSION-$DATE/$IMAGE_TYPE/x86_64/[Images|os]/
|
| |
# http://dl.fedoraproject.org/pub/alt/atomic/stable/
|
| |
- ATOMIC_TESTING_BASEDIR = "/pub/alt/atomic/testing/"
|
| |
- ATOMIC_STABLE_DESTINATION = "/pub/alt/atomic/stable/"
|
| |
+ ATOMIC_LINKDEST = "/pub/alt/atomic/testing/"
|
| |
+ ATOMIC_STABLE_BASEDIR = "/pub/alt/atomic/stable/"
|
| |
|
| |
# the modname gets used to construct the fully qualified topic, like
|
| |
# 'org.fedoraproject.prod.releng.blahblahblah'
|
| |
@@ -116,9 +116,13 @@
|
| |
|
| |
Takes an autocloud fedmsg message and returns the image name and final url.
|
| |
"""
|
| |
- dest_dir = ATOMIC_STABLE_DESTINATION + 'CloudImages/x86_64/images/'
|
| |
+ dest_dir = os.path.join(
|
| |
+ ATOMIC_STABLE_BASEDIR,
|
| |
+ msg[u'msg'][u'compose_id'],
|
| |
+ 'CloudImages/x86_64/images/'
|
| |
+ )
|
| |
image_name = msg[u'msg'][u'compose_url'].split('/')[-1]
|
| |
- image_url = dest_dir + image_name
|
| |
+ image_url = os.path.join(dest_dir, image_name)
|
| |
return image_name, image_url
|
| |
|
| |
|
| |
@@ -390,6 +394,9 @@
|
| |
Respective signed CHECKSUM files can be found here:
|
| |
{}
|
| |
|
| |
+ For direct download, the "latest" target is always available here:
|
| |
+ https://download.fedoraproject.org/pub/alt/atomic/stable/latest/
|
| |
+
|
| |
Thank you,
|
| |
Fedora Release Engineering
|
| |
""".format(
|
| |
@@ -409,12 +416,11 @@
|
| |
except smtplib.SMTPException, e:
|
| |
print "ERROR: Unable to send email:\n{}\n".format(e)
|
| |
|
| |
-
|
| |
def stage_atomic_release(
|
| |
compose_id,
|
| |
compose_basedir=COMPOSE_BASEDIR,
|
| |
- testing_basedir=ATOMIC_TESTING_BASEDIR,
|
| |
- dest_dir=ATOMIC_STABLE_DESTINATION):
|
| |
+ dest_base_dir=ATOMIC_STABLE_BASEDIR,
|
| |
+ link_dest=ATOMIC_LINKDEST):
|
| |
"""
|
| |
stage_atomic_release
|
| |
|
| |
@@ -424,6 +430,7 @@
|
| |
"""
|
| |
|
| |
source_loc = os.path.join(compose_basedir, compose_id, "compose")
|
| |
+ dest_dir = os.path.join(dest_base_dir, compose_id)
|
| |
|
| |
# FIXME - need sudo until pungi perms are fixed
|
| |
rsync_cmd = [
|
| |
@@ -431,7 +438,7 @@
|
| |
'rsync -avhHP --delete-after',
|
| |
'--link-dest={}'.format(
|
| |
os.path.join(
|
| |
- testing_basedir,
|
| |
+ link_dest,
|
| |
compose_id.split('-')[-1]
|
| |
)
|
| |
),
|
| |
@@ -447,7 +454,6 @@
|
| |
)
|
| |
exit(3)
|
| |
|
| |
-
|
| |
def sign_checksum_files(
|
| |
key,
|
| |
artifact_path,
|
| |
@@ -567,31 +573,48 @@
|
| |
pass
|
| |
|
| |
|
| |
- def prune_old_testing_composes(
|
| |
- prune_limit=ATOMIC_COMPOSE_PERSIST_LIMIT,
|
| |
- prune_base_dir=ATOMIC_TESTING_BASEDIR):
|
| |
+ def prune_old_composes(prune_base_dir, prune_limit):
|
| |
"""
|
| |
- prune_old_testing_composes
|
| |
+ prune_old_composes
|
| |
|
| |
Clean up old testing composes from /pub/alt/
|
| |
+
|
| |
+ :param prune_base_dir: str, path to base diretory needing pruning
|
| |
+ :param prune_limit: int, the number of composes that should be kept,
|
| |
+ pruning all others.
|
| |
"""
|
| |
|
| |
prune_candidate_dirs = os.listdir(prune_base_dir)
|
| |
|
| |
- for testing_dir in prune_candidate_dirs[prune_limit:]:
|
| |
- try:
|
| |
- shutil.rmtree(
|
| |
- os.path.join(prune_base_dir, testing_dir)
|
| |
+ # Sort then reverse so we can slice the list from [0:prune_limit]
|
| |
+ prune_candidate_dirs.sort()
|
| |
+ prune_candidate_dirs.reverse()
|
| |
+
|
| |
+ for candidate_dir in prune_candidate_dirs[0:prune_limit]:
|
| |
+ #try:
|
| |
+ # shutil.rmtree(
|
| |
+ # os.path.join(prune_base_dir, candidate_dir)
|
| |
+ # )
|
| |
+ #except OSError, e:
|
| |
+ # log.error(
|
| |
+ # "Error trying to remove directory: {}\n{}".format(
|
| |
+ # candidate_dir,
|
| |
+ # e
|
| |
+ # )
|
| |
+ # )
|
| |
+
|
| |
+ #FIXME - need to do this with sudo until pungi perms are fixed
|
| |
+ prune_cmd = "sudo rm -fr {}".format(
|
| |
+ os.path.join(
|
| |
+ prune_base_dir,
|
| |
+ candidate_dir
|
| |
)
|
| |
- except OSError, e:
|
| |
+ )
|
| |
+ if subprocess.call(prune_cmd.split()):
|
| |
log.error(
|
| |
- "Error trying to remove directory: {}\n{}".format(
|
| |
- testing_dir,
|
| |
- e
|
| |
- )
|
| |
+ "prune_old_composes: command failed: {}".format(prune_cmd)
|
| |
)
|
| |
|
| |
-
|
| |
if __name__ == '__main__':
|
| |
|
| |
# get args from command line
|
| |
@@ -641,7 +664,7 @@
|
| |
log.info("Extracting compose_id from tested autocloud data")
|
| |
compose_id = tested_autocloud_info['atomic_qcow2']['compose_id']
|
| |
|
| |
- log.info("Signing image metadata")
|
| |
+ log.info("Signing image metadata - compose")
|
| |
sign_checksum_files(
|
| |
pargs.key,
|
| |
os.path.join(COMPOSE_BASEDIR, compose_id),
|
| |
@@ -659,7 +682,8 @@
|
| |
log.info("Sending Two Week Atomic announcement email")
|
| |
# Find all the Atomic images and CHECKSUM files to include in the email
|
| |
email_filelist = []
|
| |
- for full_dir_path, _, short_names in os.walk(ATOMIC_STABLE_DESTINATION):
|
| |
+ for full_dir_path, _, short_names in \
|
| |
+ os.walk(os.join(ATOMIC_STABLE_BASEDIR, compose_id)):
|
| |
for sname in fnmatch.filter(short_names, '*Atomic*'):
|
| |
email_filelist.append(
|
| |
os.path.join(
|
| |
@@ -673,7 +697,7 @@
|
| |
send_atomic_announce_email(set(email_filelist))
|
| |
|
| |
log.info("Pruning old Atomic test composes")
|
| |
- prune_old_testing_composes()
|
| |
+ prune_old_composes(ATOMIC_STABLE_BASEDIR, 2)
|
| |
|
| |
log.info("Two Week Atomic Release Complete!")
|
| |
|
| |
Signed-off-by: Adam Miller maxamillion@fedoraproject.org