docker: docker.py adding age check command

This is useful for querying if an image is too old.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
Alex Bennée 2018-06-12 21:28:45 +01:00
parent cff5477330
commit 7b882245f4

View File

@ -32,6 +32,7 @@ except ImportError:
from io import StringIO from io import StringIO
from shutil import copy, rmtree from shutil import copy, rmtree
from pwd import getpwuid from pwd import getpwuid
from datetime import datetime,timedelta
FILTERED_ENV_NAMES = ['ftp_proxy', 'http_proxy', 'https_proxy'] FILTERED_ENV_NAMES = ['ftp_proxy', 'http_proxy', 'https_proxy']
@ -190,6 +191,9 @@ class Docker(object):
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
return None return None
def get_image_creation_time(self, info):
return json.loads(info)[0]["Created"]
def get_image_dockerfile_checksum(self, tag): def get_image_dockerfile_checksum(self, tag):
resp = self.inspect_tag(tag) resp = self.inspect_tag(tag)
labels = json.loads(resp)[0]["Config"].get("Labels", {}) labels = json.loads(resp)[0]["Config"].get("Labels", {})
@ -461,11 +465,14 @@ class CheckCommand(SubCommand):
def args(self, parser): def args(self, parser):
parser.add_argument("tag", parser.add_argument("tag",
help="Image Tag") help="Image Tag")
parser.add_argument("dockerfile", parser.add_argument("dockerfile", default=None,
help="Dockerfile name") help="Dockerfile name", nargs='?')
parser.add_argument("--checktype", choices=["checksum", "age"],
default="checksum", help="check type")
parser.add_argument("--olderthan", default=60, type=int,
help="number of minutes")
def run(self, args, argv): def run(self, args, argv):
dockerfile = open(args.dockerfile, "rb").read()
tag = args.tag tag = args.tag
dkr = Docker() dkr = Docker()
@ -474,6 +481,13 @@ class CheckCommand(SubCommand):
print("Image does not exist") print("Image does not exist")
return 1 return 1
if args.checktype == "checksum":
if not args.dockerfile:
print("Need a dockerfile for tag:%s" % (tag))
return 1
dockerfile = open(args.dockerfile, "rb").read()
if dkr.image_matches_dockerfile(tag, dockerfile): if dkr.image_matches_dockerfile(tag, dockerfile):
if not args.quiet: if not args.quiet:
print("Image is up to date") print("Image is up to date")
@ -481,6 +495,18 @@ class CheckCommand(SubCommand):
else: else:
print("Image needs updating") print("Image needs updating")
return 1 return 1
elif args.checktype == "age":
timestr = dkr.get_image_creation_time(info).split(".")[0]
created = datetime.strptime(timestr, "%Y-%m-%dT%H:%M:%S")
past = datetime.now() - timedelta(minutes=args.olderthan)
if created < past:
print ("Image created @ %s more than %d minutes old" %
(timestr, args.olderthan))
return 1
else:
if not args.quiet:
print ("Image less than %d minutes old" % (args.olderthan))
return 0
def main(): def main():