diff options
Diffstat (limited to 'bitbake/lib/bb/ui/buildinfohelper.py')
-rw-r--r-- | bitbake/lib/bb/ui/buildinfohelper.py | 118 |
1 files changed, 76 insertions, 42 deletions
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py index 8cd9371b06..b093b37a5d 100644 --- a/bitbake/lib/bb/ui/buildinfohelper.py +++ b/bitbake/lib/bb/ui/buildinfohelper.py | |||
@@ -150,55 +150,48 @@ class ORMWrapper(object): | |||
150 | # pylint: disable=bad-continuation | 150 | # pylint: disable=bad-continuation |
151 | # we do not follow the python conventions for continuation indentation due to long lines here | 151 | # we do not follow the python conventions for continuation indentation due to long lines here |
152 | 152 | ||
153 | def create_build_object(self, build_info, brbe, project_id): | 153 | def create_build_object(self, build_info, brbe): |
154 | assert 'machine' in build_info | 154 | assert 'machine' in build_info |
155 | assert 'distro' in build_info | 155 | assert 'distro' in build_info |
156 | assert 'distro_version' in build_info | 156 | assert 'distro_version' in build_info |
157 | assert 'started_on' in build_info | 157 | assert 'started_on' in build_info |
158 | assert 'cooker_log_path' in build_info | 158 | assert 'cooker_log_path' in build_info |
159 | assert 'build_name' in build_info | ||
160 | assert 'bitbake_version' in build_info | 159 | assert 'bitbake_version' in build_info |
161 | 160 | ||
162 | prj = None | 161 | prj = None |
163 | buildrequest = None | 162 | buildrequest = None |
164 | if brbe is not None: # this build was triggered by a request from a user | 163 | if brbe is not None: |
164 | # Toaster-triggered build | ||
165 | logger.debug(1, "buildinfohelper: brbe is %s" % brbe) | 165 | logger.debug(1, "buildinfohelper: brbe is %s" % brbe) |
166 | br, _ = brbe.split(":") | 166 | br, _ = brbe.split(":") |
167 | buildrequest = BuildRequest.objects.get(pk = br) | 167 | buildrequest = BuildRequest.objects.get(pk=br) |
168 | prj = buildrequest.project | 168 | prj = buildrequest.project |
169 | 169 | else: | |
170 | elif project_id is not None: # this build was triggered by an external system for a specific project | 170 | # CLI build |
171 | logger.debug(1, "buildinfohelper: project is %s" % prj) | ||
172 | prj = Project.objects.get(pk = project_id) | ||
173 | |||
174 | else: # this build was triggered by a legacy system, or command line interactive mode | ||
175 | prj = Project.objects.get_or_create_default_project() | 171 | prj = Project.objects.get_or_create_default_project() |
176 | logger.debug(1, "buildinfohelper: project is not specified, defaulting to %s" % prj) | 172 | logger.debug(1, "buildinfohelper: project is not specified, defaulting to %s" % prj) |
177 | 173 | ||
178 | |||
179 | if buildrequest is not None: | 174 | if buildrequest is not None: |
180 | build = buildrequest.build | 175 | build = buildrequest.build |
181 | logger.info("Updating existing build, with %s", build_info) | 176 | logger.info("Updating existing build, with %s", build_info) |
182 | build.project = prj | 177 | build.project = prj |
183 | build.machine=build_info['machine'] | 178 | build.machine = build_info['machine'] |
184 | build.distro=build_info['distro'] | 179 | build.distro = build_info['distro'] |
185 | build.distro_version=build_info['distro_version'] | 180 | build.distro_version = build_info['distro_version'] |
186 | build.cooker_log_path=build_info['cooker_log_path'] | 181 | build.cooker_log_path = build_info['cooker_log_path'] |
187 | build.build_name=build_info['build_name'] | 182 | build.bitbake_version = build_info['bitbake_version'] |
188 | build.bitbake_version=build_info['bitbake_version'] | ||
189 | build.save() | 183 | build.save() |
190 | 184 | ||
191 | else: | 185 | else: |
192 | build = Build.objects.create( | 186 | build = Build.objects.create( |
193 | project = prj, | 187 | project=prj, |
194 | machine=build_info['machine'], | 188 | machine=build_info['machine'], |
195 | distro=build_info['distro'], | 189 | distro=build_info['distro'], |
196 | distro_version=build_info['distro_version'], | 190 | distro_version=build_info['distro_version'], |
197 | started_on=build_info['started_on'], | 191 | started_on=build_info['started_on'], |
198 | completed_on=build_info['started_on'], | 192 | completed_on=build_info['started_on'], |
199 | cooker_log_path=build_info['cooker_log_path'], | 193 | cooker_log_path=build_info['cooker_log_path'], |
200 | build_name=build_info['build_name'], | 194 | bitbake_version=build_info['bitbake_version']) |
201 | bitbake_version=build_info['bitbake_version']) | ||
202 | 195 | ||
203 | logger.debug(1, "buildinfohelper: build is created %s" % build) | 196 | logger.debug(1, "buildinfohelper: build is created %s" % build) |
204 | 197 | ||
@@ -208,6 +201,10 @@ class ORMWrapper(object): | |||
208 | 201 | ||
209 | return build | 202 | return build |
210 | 203 | ||
204 | def update_build_name(self, build, build_name): | ||
205 | build.build_name = build_name | ||
206 | build.save() | ||
207 | |||
211 | @staticmethod | 208 | @staticmethod |
212 | def get_or_create_targets(target_info): | 209 | def get_or_create_targets(target_info): |
213 | """ | 210 | """ |
@@ -924,9 +921,7 @@ class BuildInfoHelper(object): | |||
924 | build_info['started_on'] = timezone.now() | 921 | build_info['started_on'] = timezone.now() |
925 | build_info['completed_on'] = timezone.now() | 922 | build_info['completed_on'] = timezone.now() |
926 | build_info['cooker_log_path'] = build_log_path | 923 | build_info['cooker_log_path'] = build_log_path |
927 | build_info['build_name'] = self.server.runCommand(["getVariable", "BUILDNAME"])[0] | ||
928 | build_info['bitbake_version'] = self.server.runCommand(["getVariable", "BB_VERSION"])[0] | 924 | build_info['bitbake_version'] = self.server.runCommand(["getVariable", "BB_VERSION"])[0] |
929 | build_info['project'] = self.project = self.server.runCommand(["getVariable", "TOASTER_PROJECT"])[0] | ||
930 | return build_info | 925 | return build_info |
931 | 926 | ||
932 | def _get_task_information(self, event, recipe): | 927 | def _get_task_information(self, event, recipe): |
@@ -1032,17 +1027,28 @@ class BuildInfoHelper(object): | |||
1032 | except NotExisting as nee: | 1027 | except NotExisting as nee: |
1033 | logger.warning("buildinfohelper: cannot identify layer exception:%s ", nee) | 1028 | logger.warning("buildinfohelper: cannot identify layer exception:%s ", nee) |
1034 | 1029 | ||
1035 | 1030 | def store_started_build(self, build_log_path): | |
1036 | def store_started_build(self, event, build_log_path): | ||
1037 | assert '_pkgs' in vars(event) | ||
1038 | build_information = self._get_build_information(build_log_path) | 1031 | build_information = self._get_build_information(build_log_path) |
1032 | self.internal_state['build'] = \ | ||
1033 | self.orm_wrapper.create_build_object(build_information, self.brbe) | ||
1039 | 1034 | ||
1040 | # Update brbe and project as they can be changed for every build | 1035 | def save_build_name_and_targets(self, event): |
1041 | self.project = build_information['project'] | 1036 | # NB the BUILDNAME variable isn't set until BuildInit (or |
1037 | # BuildStarted for older bitbakes) | ||
1038 | build_name = self.server.runCommand(["getVariable", "BUILDNAME"])[0] | ||
1039 | self.orm_wrapper.update_build_name(self.internal_state['build'], | ||
1040 | build_name) | ||
1042 | 1041 | ||
1043 | build_obj = self.orm_wrapper.create_build_object(build_information, self.brbe, self.project) | 1042 | # create target information |
1043 | assert '_pkgs' in vars(event) | ||
1044 | target_information = {} | ||
1045 | target_information['targets'] = event._pkgs | ||
1046 | target_information['build'] = self.internal_state['build'] | ||
1044 | 1047 | ||
1045 | self.internal_state['build'] = build_obj | 1048 | self.internal_state['targets'] = self.orm_wrapper.get_or_create_targets(target_information) |
1049 | |||
1050 | def save_build_layers_and_variables(self): | ||
1051 | build_obj = self.internal_state['build'] | ||
1046 | 1052 | ||
1047 | # save layer version information for this build | 1053 | # save layer version information for this build |
1048 | if not 'lvs' in self.internal_state: | 1054 | if not 'lvs' in self.internal_state: |
@@ -1053,13 +1059,6 @@ class BuildInfoHelper(object): | |||
1053 | 1059 | ||
1054 | del self.internal_state['lvs'] | 1060 | del self.internal_state['lvs'] |
1055 | 1061 | ||
1056 | # create target information | ||
1057 | target_information = {} | ||
1058 | target_information['targets'] = event._pkgs | ||
1059 | target_information['build'] = build_obj | ||
1060 | |||
1061 | self.internal_state['targets'] = self.orm_wrapper.get_or_create_targets(target_information) | ||
1062 | |||
1063 | # Save build configuration | 1062 | # Save build configuration |
1064 | data = self.server.runCommand(["getAllKeysWithFlags", ["doc", "func"]])[0] | 1063 | data = self.server.runCommand(["getAllKeysWithFlags", ["doc", "func"]])[0] |
1065 | 1064 | ||
@@ -1090,6 +1089,41 @@ class BuildInfoHelper(object): | |||
1090 | 1089 | ||
1091 | return self.brbe | 1090 | return self.brbe |
1092 | 1091 | ||
1092 | def set_recipes_to_parse(self, num_recipes): | ||
1093 | """ | ||
1094 | Set the number of recipes which need to be parsed for this build. | ||
1095 | This is set the first time ParseStarted is received by toasterui. | ||
1096 | """ | ||
1097 | if self.internal_state['build']: | ||
1098 | self.internal_state['build'].recipes_to_parse = num_recipes | ||
1099 | self.internal_state['build'].save() | ||
1100 | |||
1101 | def set_recipes_parsed(self, num_recipes): | ||
1102 | """ | ||
1103 | Set the number of recipes parsed so far for this build; this is updated | ||
1104 | each time a ParseProgress or ParseCompleted event is received by | ||
1105 | toasterui. | ||
1106 | """ | ||
1107 | if self.internal_state['build']: | ||
1108 | if num_recipes <= self.internal_state['build'].recipes_to_parse: | ||
1109 | self.internal_state['build'].recipes_parsed = num_recipes | ||
1110 | self.internal_state['build'].save() | ||
1111 | |||
1112 | def update_target_image_file(self, event): | ||
1113 | evdata = BuildInfoHelper._get_data_from_event(event) | ||
1114 | |||
1115 | for t in self.internal_state['targets']: | ||
1116 | if t.is_image == True: | ||
1117 | output_files = list(evdata.keys()) | ||
1118 | for output in output_files: | ||
1119 | if t.target in output and 'rootfs' in output and not output.endswith(".manifest"): | ||
1120 | self.orm_wrapper.save_target_image_file_information(t, output, evdata[output]) | ||
1121 | |||
1122 | def update_artifact_image_file(self, event): | ||
1123 | evdata = BuildInfoHelper._get_data_from_event(event) | ||
1124 | for artifact_path in evdata.keys(): | ||
1125 | self.orm_wrapper.save_artifact_information(self.internal_state['build'], artifact_path, evdata[artifact_path]) | ||
1126 | |||
1093 | def update_build_information(self, event, errors, warnings, taskfailures): | 1127 | def update_build_information(self, event, errors, warnings, taskfailures): |
1094 | if 'build' in self.internal_state: | 1128 | if 'build' in self.internal_state: |
1095 | self.orm_wrapper.update_build_object(self.internal_state['build'], errors, warnings, taskfailures) | 1129 | self.orm_wrapper.update_build_object(self.internal_state['build'], errors, warnings, taskfailures) |