Skip to content

Commit

Permalink
understand 1.11 layering syntax
Browse files Browse the repository at this point in the history
resolves #82 #74
  • Loading branch information
TomasTomecek committed Jun 11, 2016
1 parent f445f8f commit 82b224e
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 11 deletions.
36 changes: 34 additions & 2 deletions sen/docker_backend.py
Expand Up @@ -277,6 +277,33 @@ def parent_image(self):
else:
return self.docker_backend.scratch_image

@property
def layers(self):
"""
similar as parent images, except that it uses /history API endpoint
:return:
"""
# sample output:
# {
# "Created": 1457116802,
# "Id": "sha256:507cb13a216097710f0d234668bf64a4c92949c573ba15eba13d05aad392fe04",
# "Size": 204692029,
# "Tags": [
# "docker.io/fedora:latest"
# ],
# "Comment": "",
# "CreatedBy": "/bin/sh -c #(nop) ADD file:bcb5e5c... in /"
# }
response = self.d.history(self.image_id)
layers = []
for l in response:
layer_id = l["Id"]
if layer_id == "<missing>":
layers.append(DockerImage(l, self.docker_backend))
else:
layers.append(self.docker_backend.get_image_by_id(layer_id))
return layers

@property
def children(self):
return self.docker_backend.get_images_for_parent(self)
Expand Down Expand Up @@ -311,6 +338,10 @@ def command(self):

@property
def container_command(self):
# history item
created_by = graceful_chain_get(self.data, "CreatedBy")
if created_by:
return created_by
inspect = self.inspect(cached=True).response
cmd = graceful_chain_get(inspect, "ContainerConfig", "Cmd")
if cmd:
Expand All @@ -324,15 +355,16 @@ def size(self):
:return: int
"""
return self.data["VirtualSize"]
return self.data.get("VirtualSize", 0)

@property
def names(self):
if self._names is None:
self._names = []
if self.data is None:
return self._names
for t in self.data["RepoTags"]:
# RepoTags = image, Tags = output from `history` command, Tags can be None
for t in self.data.get("RepoTags", self.data.get("Tags")) or []:
image_name = ImageNameStruct.parse(t)
if image_name.to_str():
self._names.append(image_name)
Expand Down
3 changes: 3 additions & 0 deletions sen/tui/buffer.py
Expand Up @@ -119,6 +119,9 @@ def __init__(self, docker_image, ui):
"""
if isinstance(docker_image, RootImage):
raise NotifyError("Image \"scratch\" doesn't provide any more information.")
if docker_image.image_id == "<missing>":
raise NotifyError("This image (layer) is not available due to changes in docker-1.10 "
"image representation.")
self.display_name = docker_image.short_name
self.widget = ImageInfoWidget(ui, docker_image)
super().__init__()
Expand Down
1 change: 1 addition & 0 deletions sen/tui/ui.py
Expand Up @@ -317,6 +317,7 @@ def keypress(self, size, key):
selected_widget = getattr(self.current_buffer, "widget", None)
if selected_widget:
focused_docker_object = getattr(self.current_buffer.widget, "focused_docker_object", None)
logger.debug("focused docker object is %s", focused_docker_object)
try:
self.run_command_by_key(
key,
Expand Down
29 changes: 20 additions & 9 deletions sen/tui/widgets/info.py
Expand Up @@ -9,6 +9,7 @@
import urwid
import urwidtrees

from sen.docker_backend import RootImage
from sen.tui.widgets.list.base import WidgetBase
from urwid.decoration import BoxAdapter

Expand Down Expand Up @@ -89,16 +90,26 @@ def _layers(self):
self.walker.append(RowWidget([SelectableText("Layers", maps=get_map("main_list_white"))]))

i = self.docker_image
parent = i.parent_image
layers = self.docker_image.layers
index = 0
self.walker.append(RowWidget([LayerWidget(self.ui, self.docker_image, index=index)]))
while True:
index += 1
parent = i.parent_image
if parent:
self.walker.append(RowWidget([LayerWidget(self.ui, parent, index=index)]))
i = parent
else:
break

if isinstance(parent, RootImage) and len(layers) > 0: # pulled image, docker 1.10+
for image in layers:
self.walker.append(
RowWidget([LayerWidget(self.ui, image, index=index)])
)
index += 1
else:
self.walker.append(RowWidget([LayerWidget(self.ui, self.docker_image, index=index)]))
while True:
index += 1
parent = i.parent_image
if parent:
self.walker.append(RowWidget([LayerWidget(self.ui, parent, index=index)]))
i = parent
else:
break

def _labels(self):
if not self.docker_image.labels:
Expand Down
2 changes: 2 additions & 0 deletions sen/tui/widgets/tree.py
Expand Up @@ -17,6 +17,8 @@ def __init__(self, ui, docker_image):


class TreeBackend(urwidtrees.Tree):
# FIXME: rewrite to use SimpleTree instead (for sake of docker-1.10 changes: how does one
# index an image with id <missing>
def __init__(self, docker_backend, ui):
super().__init__()
self.ui = ui
Expand Down

0 comments on commit 82b224e

Please sign in to comment.