1
0
mirror of https://github.com/projectatomic/atomic.git synced 2026-02-06 21:45:24 +01:00
Files
atomic/Atomic/delete.py
Dan Walsh 84cc530db2 Move subparser code to submodules.
cli setup should happen in the submodules, for submodules that exist.
Also fix alphabetic order of command verbs.

Closes: #564
Approved by: giuseppe
2016-08-30 10:52:48 +00:00

85 lines
2.9 KiB
Python

from . import Atomic
from . import util
from docker.errors import NotFound
from docker.errors import APIError
import sys
class Delete(Atomic):
def __init__(self):
super(Delete, self).__init__()
def delete_image(self):
"""
Mark given image(s) for deletion from registry
:return: 0 if all images marked for deletion, otherwise 2 on any failure
"""
if not self.args.force_delete:
confirm = util.input("Do you wish to delete {}? (y/N) ".format(self.args.delete_targets))
confirm = confirm.strip().lower()
if not confirm in ['y', 'yes']:
util.write_err("User aborted delete operation for {}".format(self.args.delete_targets))
sys.exit(2)
if self.args.remote_delete:
results = self._delete_remote(self.args.delete_targets)
else:
results = self._delete_local(self.args.delete_targets)
return results
def prune_images(self):
"""
Remove dangling images from registry
:return: 0 if all images deleted or no dangling images found
"""
self.syscontainers.prune_ostree_images()
results = self.d.images(filters={"dangling":True}, quiet=True)
if len(results) == 0:
return 0
for img in results:
self.d.remove_image(img, force=True)
util.write_out("Removed dangling Image {}".format(img))
return 0
def _delete_remote(self, targets):
results = 0
for target in targets:
# _convert_to_skopeo requires registry v1 support while delete requires v2 support
# args, img = self.syscontainers._convert_to_skopeo(target)
args = []
if "http:" in target:
args.append("--insecure")
for i in ["oci:", "http:", "https:"]:
img = target.replace(i, "docker:")
if not img.startswith("docker:"):
img = "docker://" + img
try:
util.skopeo_delete(img, args)
util.write_out("Image {} marked for deletion".format(img))
except ValueError as e:
util.write_err("Failed to mark Image {} for deletion: {}".format(img, e))
results = 2
return results
def _delete_local(self, targets):
results = 0
for target in targets:
if self.syscontainers.has_system_container_image(target):
self.syscontainers.delete_image(target)
else:
try:
self.d.remove_image(target)
except NotFound as e:
util.write_err("Failed to delete Image {}: {}".format(target, e))
results = 2
except APIError as e:
util.write_err("Failed operation for delete Image {}: {}".format(target, e))
results = 2
return results