Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
152 changes: 73 additions & 79 deletions usr/local/bin/rename-old-images.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
from subprocess import Popen, PIPE
from configparser import SafeConfigParser
import time
import smtplib

env = os.environ.copy()

Expand All @@ -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")
Expand All @@ -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)
Expand All @@ -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"]
Expand All @@ -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
Expand All @@ -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)