Fix: use uuid for kill
[deliverable/lttng-ivc.git] / lttng_ivc / launch.py
CommitLineData
de9b991b
JR
1import pytest
2import os
3import yaml
4import logging
fe7b987e 5import hashlib
de9b991b
JR
6
7from git import Repo
8
fe7b987e 9import settings as Settings
de9b991b
JR
10
11def is_ref_branch(repo, ref):
12 try:
13 repo.remote().refs[ref]
14 is_branch = True
15 except:
16 is_branch = False
17
18 return is_branch
19
20
21def is_ref_tag(repo, ref):
22 try:
23 repo.tags[ref]
24 is_tag = True
25 except:
26 is_tag = False
27
28 return is_tag
29
30
31def is_ref_commit(repo, ref):
32 try:
33 Repo.rev_parse(repo, ref)
34 is_commit = True
35 except:
36 is_commit = False
37
38 return is_commit
39
40
41def logging_setup():
42 logger_format = '%(asctime)s %(name)-12s %(levelname)-8s %(message)s'
43 logging.basicConfig(level=logging.DEBUG,
44 format=logger_format,
45 datefmt='%m-%d %H:%M',
46 filename='./debug.log',
47 filemode='w')
48 # define a Handler which writes INFO messages or higher to the sys.stderr
49 console = logging.StreamHandler()
50 console.setLevel(logging.DEBUG)
51 # set a format which is simpler for console use
52 formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
53 # tell the handler to use this format
54 console.setFormatter(formatter)
55 # add the handler to the root logger
56 logging.getLogger('').addHandler(console)
57
58
59logging_setup()
60
61# Remote setup
62logger_git = logging.getLogger('setup.git')
63
64# Fetch local base repository
fe7b987e 65with open(Settings.configuration_file, 'r') as stream:
de9b991b
JR
66 config = yaml.load(stream)
67
fe7b987e
JR
68# Validate that all default dependancy are present.
69# TODO: move to function
70projects_markers = set()
71for project, markers in config.items():
72 if markers is None:
73 continue
74 for marker in markers:
75 projects_markers.add(marker['marker'])
76
77for project, markers in config.items():
78 if markers is None:
79 continue
80 for marker in markers:
81 if 'precook_deps' in marker:
82 for dep in marker['precook_deps']:
83 if dep not in projects_markers:
84 raise Exception("{} is not defined".format(dep))
85
86
de9b991b
JR
87# Retrieve all possibles remotes and clean url for path
88remotes = {}
89for project, markers in config.items():
90 if markers is None:
91 continue
92 for marker in markers:
93 url = marker['url']
fe7b987e
JR
94 url2path = hashlib.sha1(url.encode('utf8')).hexdigest()
95 path = os.path.abspath(Settings.git_remote_folder + '/' + url2path)
de9b991b
JR
96 remotes[url] = path
97
98logger_git.info('Remotes to be fetched {}'.format(remotes))
99
fe7b987e
JR
100if not os.path.isdir(Settings.git_remote_folder):
101 os.makedirs(Settings.git_remote_folder)
de9b991b
JR
102
103# Fetch the remote
104for url, path in remotes.items():
105 if os.path.exists(path):
106 if not os.path.isdir(path):
107 logger_git.error('Remote path {} exists and is not a folder'.format(path))
108 exit()
109 repo = Repo(path)
110 else:
111 repo = Repo.clone_from(url, path)
112
113 # TODO: might be necessary to actually update the base branch, to validate
114 repo.remote().fetch()
115
116# Create marker definition for test runners
117runnable_markers = {}
118for project, markers in config.items():
119 if markers is None:
120 continue
121 for marker in markers:
122 name = marker['marker']
123 ref = marker['ref']
124 url = marker['url']
fe7b987e
JR
125 if 'precook_deps' in marker:
126 deps = marker['precook_deps']
127 else:
128 deps = []
129
de9b991b
JR
130 path = remotes[url]
131 repo = Repo(path)
132
133 git_object = None
134 if is_ref_branch(repo, ref):
135 git_object = Repo.rev_parse(repo, repo.remote().refs[ref].name)
136 elif is_ref_tag(repo, ref):
137 git_object = repo.tags[ref].commit
138 elif is_ref_commit(repo, ref):
139 git_object = repo.commit(ref)
140
141 if git_object is None:
142 logger_git.error('Invalid git reference for marker "{}"'.format(name))
143 exit(1)
144
145 logger_git.info('Marker:{: <30} Sha1 {: <20}'.format(name, git_object.hexsha))
146
147 if name in runnable_markers:
148 logger_git.error('Duplicate for entry for marker "{}"'.format(name))
149 exit(1)
150
151 runnable_markers[name] = {
152 'project': project,
153 'sha1': git_object.hexsha,
154 'url': url,
fe7b987e
JR
155 'path': path,
156 'deps': deps
de9b991b
JR
157 }
158
fe7b987e 159with open(Settings.run_configuration_file, 'w') as run_configuration:
de9b991b 160 yaml.dump(runnable_markers, run_configuration, default_flow_style=False)
This page took 0.030115 seconds and 5 git commands to generate.