diff --git a/usr/local/bin/__pycache__/rename_images.cpython-312.pyc b/usr/local/bin/__pycache__/rename_images.cpython-312.pyc new file mode 100644 index 0000000..c1deb81 Binary files /dev/null and b/usr/local/bin/__pycache__/rename_images.cpython-312.pyc differ diff --git a/usr/local/bin/rename-old-images.py b/usr/local/bin/rename-old-images.py index 4709017..48dda88 100644 --- a/usr/local/bin/rename-old-images.py +++ b/usr/local/bin/rename-old-images.py @@ -8,7 +8,6 @@ from subprocess import Popen, PIPE from configparser import SafeConfigParser import time -import smtplib env = os.environ.copy() @@ -20,8 +19,6 @@ parser = SafeConfigParser() parser.read('/etc/packer-utils/config.ini') auth_file = parser.get('rabbit2packer', 'PACKER_ADMIN_AUTH_FILE') -success_address = parser.get('global', 'SUCCESS_ADDRESS') -failure_address = parser.get('global', 'FAILURE_ADDRESS') slackhook = parser.get('global', 'SLACK_SUCCESS_HOOK') conn = openstack.connect("packer") @@ -32,36 +29,6 @@ def cl(c): p = Popen(c, shell=True, stdout=PIPE, env=env) return str(p.communicate()[0]) -def SendMail(Subject , Body, Recipient): -# body_str_encoded_to_byte = Body.encode() -# print("mail -s \"" + Subject + "\" "+ Recipient + " < " + body_str_encoded_to_byte) -# return_stat = cl("mail -s \"" + Subject + "\" " + Recipient + " < "+body_str_encoded_to_byte) - return_stat = cl("mail -s \"" + Subject + "\" " + Recipient + " < "+Body) -# print(return_stat) - -# Commenting out as not picking up host mail config -#def SendMail(Subject, Body, Recipient: str): -# FROM = "packquilon@example.com" -# TO = [Recipient] -# -# message = f"""\ -# From: {FROM} -# To: {TO} -# Subject: {Subject} -# -# {Body} -# """ -# -# # Send via mailx -# try: -# server = smtplib.SMTP('localhost') -# except OSError: -# print("Mail server not configured on this machine") -# return -# server.set_debuglevel(3) -# server.sendmail(FROM, TO, message) -# server.quit() - DATE = datetime.now().strftime("%d-%m-%Y-%H-%M-%S") print(DATE) @@ -75,22 +42,18 @@ def SendMail(Subject , Body, Recipient): testtemplate["VMTasks.boot_runcommand_delete"][0]["args"]["image"]["name"] = next_image_name -with open("/etc/packer-utils/tests/" + next_image_name + ".json", "w") as testFile: +with open(f"/etc/packer-utils/tests/{next_image_name}.json", "w") as testFile: json.dump(testtemplate, testFile) -mailfilepath = "/tmp/" + next_image_name + "-" + DATE + ".mail" - -test = cl("INSTANCENAME=Prod; rally db create ;rally deployment create --name $INSTANCENAME --filename /opt/rally/existing.json ;rally deployment check $INSTANCENAME ; /opt/rally/bin/rally deployment use Prod ; /opt/rally/bin/rally task start /etc/packer-utils/tests/" + next_image_name + ".json | grep \"rally task report\" | grep \"json\" | sed 's/output.json/\/tmp\/" + next_image_name + "-" + DATE + "\.json/g'") +test = cl(f"INSTANCENAME=Prod; rally db create ;rally deployment create --name $INSTANCENAME --filename /opt/rally/existing.json ;rally deployment check $INSTANCENAME ; /opt/rally/bin/rally deployment use Prod ; /opt/rally/bin/rally task start /etc/packer-utils/tests/{next_image_name}.json | grep \"rally task report\" | grep \"json\" | sed 's/output.json/\/tmp\/{next_image_name}-{DATE}\.json/g'") print(test) reportcmd = test.split("\\n\\t")[3].replace("\\n", "").replace("'", "").replace('"','') print(reportcmd) print("GENERATING NEW REPORT", flush=True) -#rint(test + " /tmp/"+next_image_name+"-"+DATE+".json") -#cl(test + " /tmp/"+next_image_name+"-"+DATE+".json") cl(reportcmd) -with open("/tmp/" + next_image_name + "-" + DATE + ".json") as testresultjson: +with open(f"/tmp/{next_image_name}-{DATE}.json") as testresultjson: testresult = json.load(testresultjson) testPassed = testresult["tasks"][0]["pass_sla"] @@ -111,10 +74,12 @@ def SendMail(Subject , Body, Recipient): existing_visibility = "private" previous_image = None - if next_image.name in all_image_names: + # Check if current_image_name exists + if current_image_name in all_image_names: previous_image = conn.image.find_image(current_image_name, ignore_missing=False) existing_visibility = previous_image.visibility print(existing_visibility) + properties = dict() if previous_image: properties = previous_image.properties @@ -123,54 +88,83 @@ def SendMail(Subject , Body, Recipient): else: print("Previous version not found") + # Update new image with properties from previous image conn.image.update_image(next_image.id, visibility=existing_visibility, **properties) + # Handle shared image members if existing_visibility == "shared" and previous_image: existing_members = conn.image.members(previous_image) for existing_member in existing_members: print(existing_member) - existing_member_string=existing_member["member_id"] - print("Existing Member = " + existing_member_string) + existing_member_string = existing_member["member_id"] + print(f"Existing Member = {existing_member_string}") new_member = conn.image.add_member(next_image, member_id=existing_member_string) conn.image.update_member(new_member, next_image, status="accepted") - print("Current image: " + previous_image.name) - print("Next image: " + next_image.name) + + # Warehouse the current/previous image if previous_image: - conn.image.deactivate_image(previous_image) - print("Rename " + previous_image.name + " to " + "warehoused-" + previous_image.name + "-" + DATE) - conn.image.update_image(previous_image.id, name="warehoused-" + previous_image.name + "-" + DATE, is_hidden=True) - print("Rename " + next_image.name + " to " + current_image_name) - conn.image.update_image(next_image.id, name=current_image_name) - - # print(images) - - # print(members) - - for image_name in all_image_names: - if current_image_name.lower() in image_name.lower(): - print("sed -i 's/" + previous_image.id + "/" + next_image.id + "/g' /etc/packer-utils/build/*.json") - cl("sed -i 's/" + previous_image.id + "/" + next_image.id + "/g' /etc/packer-utils/build/*.json") - print("sed -i 's/" + previous_image.id + "/" + next_image.id + "/g' /etc/packer-utils/source-images.json") - cl("sed -i 's/" + previous_image.id + "/" + next_image.id + "/g' /etc/packer-utils/source-images.json") - - with open(mailfilepath, "w") as mailfile: - mailfile.write( - "Build of " + image_name + " succeeded on " + DATE + ". New image ID is \`" + next_image.id + "\`") - body="Build of " + image_name + " succeeded on " + DATE + ". New image ID is \`" + next_image.id + "\`" -# SendMail(current_image_name + " - Build Succeeded", mailfilepath, success_address) - + warehoused_name = f"warehoused-{previous_image.name}-{DATE}" + print(f"Current image: {previous_image.name}") + print(f"Next image: {next_image.name}") + print(f"Warehousing: {previous_image.name} -> {warehoused_name}") + + # Rename the current image to warehoused name var + conn.image.update_image( + previous_image.id, + name=warehoused_name, + ) + print(f"✓ Successfully warehoused {previous_image.name}") + + # Rename new image to production name + print(f"Promoting: {next_image.name} -> {current_image_name}") + conn.image.update_image(next_image.id, name=current_image_name) + print(f"✓ Successfully promoted to {current_image_name}") + + # Update config files with new image ID + if previous_image: + for image_name in all_image_names: + if current_image_name.lower() in image_name.lower(): + print(f"sed -i 's/{previous_image.id}/{next_image.id}/g' /etc/packer-utils/build/*.json") + cl(f"sed -i 's/{previous_image.id}/{next_image.id}/g' /etc/packer-utils/build/*.json") + print(f"sed -i 's/{previous_image.id}/{next_image.id}/g' /etc/packer-utils/source-images.json") + cl(f"sed -i 's/{previous_image.id}/{next_image.id}/g' /etc/packer-utils/source-images.json") + + # Send success notification to Slack slackheaders = {'Content-Type': 'application/json'} - slackdata = { - 'text': "Build of " + current_image_name + " succeeded on " + DATE + ". New image ID is \`" + next_image.id + "\`"} - slackdebug = requests.post(slackhook, headers=slackheaders, data=json.dumps(slackdata)) + slack_message = { + 'text': f"✅ Image promotion successful!", + 'attachments': [{ + 'color': 'good', + 'fields': [ + {'title': 'Image Name', 'value': current_image_name, 'short': True}, + {'title': 'New Image ID', 'value': next_image.id, 'short': True}, + {'title': 'Previous Image ID', 'value': previous_image.id if previous_image else 'N/A', 'short': True}, + {'title': 'Warehoused', 'value': f"warehoused-{previous_image.name}-{DATE}" if previous_image else 'N/A', 'short': False}, + {'title': 'Timestamp', 'value': DATE, 'short': True} + ] + }] + } + slackdebug = requests.post(slackhook, headers=slackheaders, data=json.dumps(slack_message)) print(slackdebug) - else: - with open(mailfilepath, "w") as mailfile: - mailfile.write(f"Build of {next_image_name} failed on {DATE} due to rally test failing") - body=f"Build of {next_image_name} failed on {DATE} due to rally test failing" -# SendMail("Build Failed", body, failure_address) - visibility = " --private " - - conn.image.update_image(next_image.id, visibility=visibility, name="Broken-" + current_image_name + DATE) + # Send failure notification to Slack + slackheaders = {'Content-Type': 'application/json'} + slack_message = { + 'text': f"❌ Build Failed", + 'attachments': [{ + 'color': 'danger', + 'fields': [ + {'title': 'Image Name', 'value': next_image_name, 'short': True}, + {'title': 'Reason', 'value': 'Rally test failed', 'short': True}, + {'title': 'Timestamp', 'value': DATE, 'short': True} + ] + }] + } + requests.post(slackhook, headers=slackheaders, data=json.dumps(slack_message)) + + # Mark failed image as broken + visibility = "private" + broken_name = f"Broken-{current_image_name}-{DATE}" + print(f"Marking failed image as: {broken_name}") + conn.image.update_image(next_image.id, visibility=visibility, name=broken_name) \ No newline at end of file