Merge "Debian Patching: Delete older ostree deployments"
This commit is contained in:
commit
dd6bc2242c
|
@ -220,7 +220,7 @@ def fetch_pending_deployment():
|
|||
:return: The deployment ID of the pending deployment
|
||||
"""
|
||||
|
||||
cmd = "ostree admin status |grep pending |awk '{printf $2}'"
|
||||
cmd = "ostree admin status | grep pending |awk '{printf $2}'"
|
||||
|
||||
try:
|
||||
output = subprocess.run(cmd, shell=True, check=True, capture_output=True)
|
||||
|
@ -260,3 +260,60 @@ def mount_new_deployment(deployment_dir):
|
|||
% (e.stderr.decode("utf-8"))
|
||||
LOG.info(info_msg)
|
||||
raise OSTreeCommandFail(msg)
|
||||
|
||||
|
||||
def delete_older_deployments():
|
||||
"""
|
||||
Delete all older deployments after a reboot to save space
|
||||
"""
|
||||
# Sample command and output that is parsed to get the list of
|
||||
# deployment IDs
|
||||
#
|
||||
# Command: ostree admin status | grep debian
|
||||
#
|
||||
# Output:
|
||||
#
|
||||
# * debian 3334dc80691a38c0ba6c519ec4b4b449f8420e98ac4d8bded3436ade56bb229d.2
|
||||
# debian 3334dc80691a38c0ba6c519ec4b4b449f8420e98ac4d8bded3436ade56bb229d.1 (rollback)
|
||||
# debian 3334dc80691a38c0ba6c519ec4b4b449f8420e98ac4d8bded3436ade56bb229d.0
|
||||
|
||||
cmd = "ostree admin status | grep debian"
|
||||
|
||||
try:
|
||||
output = subprocess.run(cmd, shell=True, check=True, capture_output=True)
|
||||
except subprocess.CalledProcessError as e:
|
||||
msg = "Failed to fetch ostree admin status."
|
||||
info_msg = "OSTree Admin Status Error: return code: %s , Output: %s" \
|
||||
% (e.returncode, e.stderr.decode("utf-8"))
|
||||
LOG.info(info_msg)
|
||||
raise OSTreeCommandFail(msg)
|
||||
|
||||
# Store the output of the above command in a string
|
||||
output_string = output.stdout.decode('utf-8')
|
||||
|
||||
# Parse the string to get the latest commit for the ostree
|
||||
split_output_string = output_string.split()
|
||||
deployment_id_list = []
|
||||
for index, deployment_id in enumerate(split_output_string):
|
||||
if deployment_id == "debian":
|
||||
deployment_id_list.append(split_output_string[index + 1])
|
||||
|
||||
# After a reboot, the deployment ID at the 0th index of the list
|
||||
# is always the active deployment and the deployment ID at the
|
||||
# 1st index of the list is always the fallback deployment.
|
||||
# We want to delete all deployments except the two mentioned above.
|
||||
# This means we will undeploy all deployments starting from the
|
||||
# 2nd index of deployment_id_list
|
||||
|
||||
for index in reversed(range(2, len(deployment_id_list))):
|
||||
try:
|
||||
cmd = "ostree admin undeploy %s" % index
|
||||
output = subprocess.run(cmd, shell=True, check=True, capture_output=True)
|
||||
info_log = "Deleted ostree deployment %s" % deployment_id_list[index]
|
||||
LOG.info(info_log)
|
||||
except subprocess.CalledProcessError as e:
|
||||
msg = "Failed to undeploy ostree deployment %s." % deployment_id_list[index]
|
||||
info_msg = "OSTree Undeploy Error: return code: %s , Output: %s" \
|
||||
% (e.returncode, e.stderr.decode("utf-8"))
|
||||
LOG.info(info_msg)
|
||||
raise OSTreeCommandFail(msg)
|
||||
|
|
|
@ -31,6 +31,8 @@ from tsconfig.tsconfig import subfunctions
|
|||
from tsconfig.tsconfig import SW_VERSION
|
||||
|
||||
pidfile_path = "/var/run/patch_agent.pid"
|
||||
agent_running_after_reboot_flag = \
|
||||
"/var/run/patch_agent_running_after_reboot"
|
||||
node_is_patched_file = "/var/run/node_is_patched"
|
||||
node_is_patched_rr_file = "/var/run/node_is_patched_rr"
|
||||
patch_installing_file = "/var/run/patch_installing"
|
||||
|
@ -376,7 +378,10 @@ class PatchAgent(PatchService):
|
|||
|
||||
return True
|
||||
|
||||
def handle_install(self, verbose_to_stdout=False, disallow_insvc_patch=False):
|
||||
def handle_install(self,
|
||||
verbose_to_stdout=False,
|
||||
disallow_insvc_patch=False,
|
||||
delete_older_deployments=False):
|
||||
#
|
||||
# The disallow_insvc_patch parameter is set when we're installing
|
||||
# the patch during init. At that time, we don't want to deal with
|
||||
|
@ -385,6 +390,9 @@ class PatchAgent(PatchService):
|
|||
# any scripts, the RR flag will be set, which will result in the node
|
||||
# being rebooted immediately upon completion of the installation.
|
||||
#
|
||||
# The delete_older_deployments is set when the system has
|
||||
# been rebooted.
|
||||
#
|
||||
|
||||
LOG.info("Handling install")
|
||||
|
||||
|
@ -407,6 +415,9 @@ class PatchAgent(PatchService):
|
|||
self.state = constants.PATCH_AGENT_STATE_INSTALLING
|
||||
setflag(patch_installing_file)
|
||||
|
||||
if delete_older_deployments:
|
||||
ostree_utils.delete_older_deployments()
|
||||
|
||||
try:
|
||||
# Create insvc patch directories
|
||||
if not os.path.exists(insvc_patch_scripts):
|
||||
|
@ -680,6 +691,11 @@ def main():
|
|||
|
||||
pa = PatchAgent()
|
||||
pa.query()
|
||||
if os.path.exists(agent_running_after_reboot_flag):
|
||||
delete_older_deployments_flag = False
|
||||
else:
|
||||
setflag(agent_running_after_reboot_flag)
|
||||
delete_older_deployments_flag = True
|
||||
|
||||
if len(sys.argv) <= 1:
|
||||
pa.run()
|
||||
|
@ -691,7 +707,9 @@ def main():
|
|||
LOG.info("Failed install_uuid check via http_port=%s. Trying with default port 80", http_port_real)
|
||||
http_port_real = 80
|
||||
|
||||
pa.handle_install(verbose_to_stdout=True, disallow_insvc_patch=True)
|
||||
pa.handle_install(verbose_to_stdout=True,
|
||||
disallow_insvc_patch=True,
|
||||
delete_older_deployments=delete_older_deployments_flag)
|
||||
elif sys.argv[1] == "--status":
|
||||
rc = 0
|
||||
if pa.changes:
|
||||
|
|
Loading…
Reference in New Issue