all_images()   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 7
rs 9.4285
1
#!/usr/bin/env python
2
from collections import defaultdict
3
import subprocess
4
import os
5
6
KEEP_LAST_VERSIONS = int(os.environ.get('KEEP_LAST_VERSIONS', 4))
7
8
9
def find_obsolete_images(images):
10
    for image_name, versions in images.items():
11
        if len(versions) > KEEP_LAST_VERSIONS:
12
            obsolete_versions = sorted(versions, reverse=True)[4:]
13
            for version in obsolete_versions:
14
                yield '{}:v{}'.format(image_name, version)
15
16
17
def parse_images(lines):
18
    images = defaultdict(list)
19
20
    for line in lines:
21
        try:
22
            image_name, version = line.split(' ')
23
            version_num = int(version.replace('v', ''))
24
            images[image_name].append(version_num)
25
        except ValueError:
26
            pass
27
28
    return images
29
30
31
def remove_image(image_name):
32
    try:
33
        subprocess.check_call(['docker', 'rmi', image_name])
34
    except subprocess.CalledProcessError as e:
35
        print(e.output)
36
37
38
def all_images():
39
    output = subprocess \
40
        .check_output(['./docker_image_versions.sh'], shell=True) \
41
        .decode('utf-8')
42
43
    lines = output.split('\n')
44
    return parse_images(lines)
45
46
47
if __name__ == '__main__':
48
    images = all_images()
49
    for image_name in find_obsolete_images(images):
50
        remove_image(image_name)
51