From e23c750bfbd38ea1aa1ae8f971f6061ff890eeec Mon Sep 17 00:00:00 2001 From: yackob03 Date: Mon, 13 Jan 2014 16:32:51 -0500 Subject: [PATCH] Harvest commands from the Docker json information and add to the database. --- data/database.py | 1 + data/model.py | 3 ++- endpoints/registry.py | 4 +++- initdb.py | 18 ++++++++++++------ test/data/test.db | Bin 113664 -> 116736 bytes tools/backfill_commands.py | 20 ++++++++++++++++++++ 6 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 tools/backfill_commands.py diff --git a/data/database.py b/data/database.py index 2a46c8204..49e1d607e 100644 --- a/data/database.py +++ b/data/database.py @@ -167,6 +167,7 @@ class Image(BaseModel): checksum = CharField(null=True) created = DateTimeField(null=True) comment = TextField(null=True) + command = TextField(null=True) repository = ForeignKeyField(Repository) image_size = BigIntegerField(null=True) diff --git a/data/model.py b/data/model.py index a755fe8d9..a13100865 100644 --- a/data/model.py +++ b/data/model.py @@ -727,7 +727,7 @@ def set_image_size(docker_image_id, namespace_name, repository_name, image_size) def set_image_metadata(docker_image_id, namespace_name, repository_name, - created_date_str, comment, parent=None): + created_date_str, comment, command, parent=None): joined = Image.select().join(Repository) image_list = list(joined.where(Repository.name == repository_name, Repository.namespace == namespace_name, @@ -739,6 +739,7 @@ def set_image_metadata(docker_image_id, namespace_name, repository_name, fetched = image_list[0] fetched.created = dateutil.parser.parse(created_date_str) fetched.comment = comment + fetched.command = command if parent: fetched.ancestors = '%s%s/' % (parent.ancestors, parent.id) diff --git a/endpoints/registry.py b/endpoints/registry.py index 86a954d7c..f1b6ae223 100644 --- a/endpoints/registry.py +++ b/endpoints/registry.py @@ -334,8 +334,10 @@ def put_image_json(namespace, repository, image_id): else: parent_obj = None + command_list = data.get('container_config', {}).get('Cmd', None) + command = json.dumps(command_list) if command_list else None model.set_image_metadata(image_id, namespace, repository, - data.get('created'), data.get('comment'), + data.get('created'), data.get('comment'), command, parent_obj) store.put_content(mark_path, 'true') store.put_content(json_path, request.data) diff --git a/initdb.py b/initdb.py index 9acc5265b..88468c022 100644 --- a/initdb.py +++ b/initdb.py @@ -1,12 +1,9 @@ import logging -import string -import shutil -import os +import json import hashlib import random from datetime import datetime, timedelta -from flask import url_for from peewee import SqliteDatabase, create_model_tables, drop_model_tables from data.database import * @@ -19,6 +16,12 @@ store = app.config['STORAGE'] SAMPLE_DIFFS = ['test/data/sample/diffs/diffs%s.json' % i for i in range(1, 10)] +SAMPLE_CMDS = [['/bin/bash'], + ["/bin/sh", "-c", + "echo \"PasswordAuthentication no\" >> /etc/ssh/sshd_config"], + ["/bin/sh", "-c", + "sed -i 's/#\\(force_color_prompt\\)/\\1/' /etc/skel/.bashrc"], + None] REFERENCE_DATE = datetime(2013, 6, 23) TEST_STRIPE_ID = 'cus_2tmnh3PkXQS8NG' @@ -52,11 +55,14 @@ def __create_subtree(repo, structure, parent): model.set_image_checksum(docker_image_id, repo, checksum) creation_time = REFERENCE_DATE + timedelta(days=image_num) + command_list = SAMPLE_CMDS[image_num % len(SAMPLE_CMDS)] + command = json.dumps(command_list) if command_list else None new_image = model.set_image_metadata(docker_image_id, repo.namespace, repo.name, str(creation_time), - 'no comment', parent) + 'no comment', command, parent) - model.set_image_size(docker_image_id, repo.namespace, repo.name, random.randrange(1, 1024 * 1024 * 1024)) + model.set_image_size(docker_image_id, repo.namespace, repo.name, + random.randrange(1, 1024 * 1024 * 1024)) # Populate the diff file diff_path = store.image_file_diffs_path(repo.namespace, repo.name, diff --git a/test/data/test.db b/test/data/test.db index 61e75b383ad6d002d2962f5427d5b789fdea7f96..e8d38d652f9b2b309f450c91b2b63f519e1b6c82 100644 GIT binary patch delta 7862 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 delta 4640 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