1
0
mirror of https://github.com/projectatomic/atomic.git synced 2026-02-06 03:45:28 +01:00
Files
atomic/Atomic/backends/_ostree.py
Ruixin Bao 6a3bb3fb46 syscontainer: let uninstall fail when name specified
Based on discussion https://github.com/projectatomic/atomic/issues/1199#issuecomment-369153184,
we want to disallow user to specify --name option for uninstalling system containers.

Instead, we should encourage user to delete container using atomic
containers delete or atomic uninstall NAME.

Closes: https://github.com/projectatomic/atomic/issues/1199

Closes: #1202
Approved by: giuseppe
2018-03-02 08:45:26 +00:00

180 lines
6.3 KiB
Python

import os
from Atomic.backends.backend import Backend
from Atomic.objects.image import Image
from Atomic.objects.container import Container
from Atomic.syscontainers import SystemContainers
from Atomic.objects.layer import Layer
from json import loads as json_loads
from Atomic.util import Decompose
class OSTreeBackend(Backend):
def __init__(self):
self.input = None
self.syscontainers = SystemContainers()
class Args:
def __init__(self):
self.system = os.getuid() == 0
self.user = not self.system
self.setvalues = {}
self.remote = False
self.syscontainers.set_args(Args())
@property
def backend(self):
return "ostree"
def available(self):
return self.syscontainers.available
def _make_container(self, info):
container_id = info['Id']
runtime = self.syscontainers.get_container_runtime_info(container_id)
container = Container(container_id, backend=self)
container.name = container_id
container.command = info['Command']
container.id = container_id
container.runtime = info['Runtime']
container.image_name = info['Image']
container.image = info['ImageID']
container.created = info['Created']
container.status = container.state = runtime['status']
container.input_name = container_id
container.original_structure = info
container.deep = True
container.running = False if container.status == 'inactive' else True
return container
def _make_image(self, image, info, remote=False):
img_obj = Image(image, backend=self, remote=remote)
if remote:
return img_obj
name = info['Id']
img_obj.input_name = image
img_obj.name = image
img_obj.config = info
img_obj.backend = self
img_obj.id = name
img_obj.registry, img_obj.repo, img_obj.image, img_obj.tag, _ = Decompose(image).all
img_obj.repotags = info['RepoTags']
img_obj.created = info['Created']
img_obj.size = info.get('VirtualSize', None)
img_obj.virtual_size = info.get('VirtualSize', None)
img_obj.original_structure = info
img_obj.deep = True
img_obj.labels = info.get('Labels', None)
img_obj.version = img_obj.get_label("Version")
img_obj.release = img_obj.get_label("Release")
ostree_manifest = self.syscontainers.get_manifest(image)
if ostree_manifest:
ostree_manifest = json_loads(ostree_manifest)
img_obj.digest = None if ostree_manifest is None else ostree_manifest.get('Digest') or ostree_manifest.get('digest')
img_obj.os = img_obj.get_label("Os")
img_obj.arch = img_obj.get_label("Arch")
img_obj.graph_driver = None
return img_obj
def has_image(self, img):
if self.syscontainers.has_image(img):
return self.inspect_image(img)
return None
def has_container(self, container):
if self.syscontainers.get_checkout(container):
return self.inspect_container(container)
return None
def inspect_image(self, image):
try:
return self._make_image(image, self.syscontainers.inspect_system_image(image))
except ValueError:
return None
def inspect_container(self, container):
containers = self.syscontainers.get_containers(containers=[container])
if len(containers) == 0:
return None
return self._make_container(containers[0])
def start_container(self, name):
return self.syscontainers.start_service(name)
def stop_container(self, con_obj, **kwargs):
return self.syscontainers.stop_service(con_obj.id)
def get_images(self, get_all=False):
return [self._make_image(x['Id'], x) for x in self.syscontainers.get_system_images(get_all=get_all)]
def get_containers(self):
return [self._make_container(x) for x in self.syscontainers.get_containers()]
def pull_image(self, image, remote_image_obj=None, **kwargs):
return self.syscontainers.pull_image(image, **kwargs)
def delete_image(self, image, force=False):
return self.syscontainers.delete_image(image)
def version(self, image):
return self.get_layers(image)
def update(self, name, **kwargs):
force = kwargs.get('force', False)
if force:
raise ValueError("--force is not supported by ostree images")
return self.syscontainers.pull_image(name)
def install(self, image, name, **kwargs):
return self.syscontainers.install(image, name)
def uninstall(self, iobject, name=None, **kwargs):
if name is not None:
raise ValueError("System containers do not support --name. Please use atomic uninstall NAME")
return self.syscontainers.uninstall(iobject.name)
def prune(self):
return self.syscontainers.prune_ostree_images()
def validate_layer(self, layer):
return self.syscontainers.validate_layer(layer)
def _get_layer(self, image):
return Layer(self.inspect_image(image))
def get_layers(self, image):
layers = []
layer = self._get_layer(image)
layers.append(layer)
while layer.parent:
layer = self._get_layer(layer.parent)
layers.append(layer)
return layers
@staticmethod
def get_dangling_images(force_update=True): # pylint: disable=unused-argument
return []
def make_remote_image(self, image):
img_obj = self._make_remote_image(image)
img_obj.populate_remote_inspect_info()
return img_obj
def _make_remote_image(self, image):
return self._make_image(image, None, remote=True)
def delete_container(self, container, force=False):
return self.syscontainers.uninstall(container)
def run(self, iobject, **kwargs):
args = kwargs.get('args')
name = args.image
if args.name is not None:
raise ValueError("--name is not supported by this backend")
if len(args.command) == 0:
return self.syscontainers.start_service(name)
self.syscontainers.set_args(args)
return self.syscontainers.container_exec(name, args.detach, args.command)
def tag_image(self, src, dest):
return self.syscontainers.tag_image(src, dest)