Add install-arvados-jobs-image script. No issue #
[arvados-dev.git] / jenkins / install-arvados-jobs-image
1 #!/usr/bin/env python
2
3 from __future__ import print_function
4
5 import argparse
6 import arvados
7 import logging
8 import subprocess
9
10
11 def uuid_prefix(arv):
12     return arv.users().current().execute()['uuid'][:5]
13
14
15 def findormake_project(arv, prefix, project_name):
16     system_user_uuid = prefix+'-tpzed-000000000000000'
17     groups = arv.groups().list(
18         filters=[
19             ['group_class', '=', 'project'],
20             ['name', '=', project_name],
21             ['owner_uuid', '=', system_user_uuid],
22         ],
23         select=['uuid']).execute()['items']
24     if groups:
25         uuid = groups[0]['uuid']
26         logger.debug('found project %s', uuid)
27         return uuid
28     uuid = arv.groups().create(body={
29         group_class: 'project',
30         name: project_name,
31         owner_uuid: system_user_uuid,
32     }).execute()['uuid']
33     logger.info('created project %s: %s', uuid, project_name)
34     return uuid
35
36
37 def findormake_project_perm(arv, prefix, project_uuid):
38     all_users_group_uuid = prefix+'-j7d0g-fffffffffffffff'
39     if arv.links().list(
40             filters=[
41                 ['tail_uuid', '=', all_users_group_uuid],
42                 ['head_uuid', '=', project_uuid],
43                 ['link_class', '=', 'permission'],
44                 ['name', '=', 'can_read'],
45             ],
46             select=['uuid']).execute()['items']:
47         logger.debug('found permission link %s', uuid)
48         return
49     uuid = arv.links().create(body={
50         'tail_uuid': all_users_group_uuid,
51         'head_uuid': project_uuid,
52         'link_class': 'permission',
53         'name': 'can_read',
54     }).execute()['uuid']
55     logger.info('created permission link %s: %s -> %s',
56                 uuid, all_users_group_uuid, project_uuid)
57     return uuid
58
59
60 def findorpull_image(want_repo, want_tag, project_uuid):
61     for line in subprocess.check_output(['arv-keepdocker']).splitlines():
62         try:
63             repo, tag, image_id, collection, created = line.split(None, 4)
64         except ValueError:
65             continue
66         if repo == want_repo and tag == want_tag:
67             logger.debug('found image tag %s collection %s created %s',
68                         tag, collection, created)
69             return collection
70     logger.info('pulling repo %s tag %s', want_repo, want_tag)
71     subprocess.check_call([
72         'arv-keepdocker',
73         '--pull', '--project-uuid='+project_uuid,
74         want_repo, want_tag])
75
76
77 def tag_latest(repo, tag, project_uuid):
78     logger.debug('tagging %s:%s as %s:latest', repo, tag, repo)
79     subprocess.check_call([
80         'docker', 'tag', '-f', repo+':'+tag, repo+':latest'])
81     logger.debug('arv-keepdocker %s:latest', repo, tag, repo)
82     subprocess.check_call([
83         'arv-keepdocker',
84         '--project-uuid='+project_uuid,
85         repo, 'latest'])
86
87
88 logging.basicConfig()
89 logger = logging.getLogger(__name__)
90 logger.setLevel(logging.INFO)
91
92 parser = argparse.ArgumentParser(
93     description='Pull a specific version of the arvados/jobs image to Keep, and tag it as :latest')
94 parser.add_argument(
95     '--git-commit', type=str, required=True,
96     help='git commit hash of desired version')
97 parser.add_argument(
98     '--verbose', '-v', action='count', default=0,
99     help='print more debug messages')
100 args = parser.parse_args()
101 logger.setLevel(logging.INFO - 10 * args.verbose)
102
103 arv = arvados.api('v1')
104 prefix = uuid_prefix(arv)
105 project_uuid = findormake_project(arv, prefix, 'Arvados Standard Docker Images')
106 findormake_project_perm(arv, prefix, project_uuid)
107 findorpull_image('arvados/jobs', args.git_commit, project_uuid)
108 tag_latest('arvados/jobs', args.git_commit, project_uuid)