diff options
| author | Michael Wood <michael.g.wood@intel.com> | 2016-07-21 14:43:29 +0100 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-07-26 08:10:36 +0100 |
| commit | 8b3146007f98ba6618662cc47ed1c1491ef8945a (patch) | |
| tree | 40a31813eab822a7a50eb6e62546559d61ab87cc | |
| parent | bb260e94a63d6d498c9c76b862bc836a90678495 (diff) | |
| download | poky-8b3146007f98ba6618662cc47ed1c1491ef8945a.tar.gz | |
bitbake: toaster: lsupdates Add progress information and clean up logging
Adds basic progress % information and provides better description of
what is happening.
(Bitbake rev: 6393dbf97d450d2521c0bc9429da0987bb7720ec)
Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: Elliot Smith <elliot.smith@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
| -rw-r--r-- | bitbake/lib/toaster/orm/management/commands/lsupdates.py | 81 |
1 files changed, 58 insertions, 23 deletions
diff --git a/bitbake/lib/toaster/orm/management/commands/lsupdates.py b/bitbake/lib/toaster/orm/management/commands/lsupdates.py index 89ee53e3dd..138b686eb5 100644 --- a/bitbake/lib/toaster/orm/management/commands/lsupdates.py +++ b/bitbake/lib/toaster/orm/management/commands/lsupdates.py | |||
| @@ -25,6 +25,8 @@ from orm.models import LayerSource, Layer, Release, Layer_Version | |||
| 25 | from orm.models import LayerVersionDependency, Machine, Recipe | 25 | from orm.models import LayerVersionDependency, Machine, Recipe |
| 26 | 26 | ||
| 27 | import os | 27 | import os |
| 28 | import sys | ||
| 29 | |||
| 28 | import json | 30 | import json |
| 29 | import logging | 31 | import logging |
| 30 | logger = logging.getLogger("toaster") | 32 | logger = logging.getLogger("toaster") |
| @@ -36,6 +38,18 @@ class Command(NoArgsCommand): | |||
| 36 | args = "" | 38 | args = "" |
| 37 | help = "Updates locally cached information from a layerindex server" | 39 | help = "Updates locally cached information from a layerindex server" |
| 38 | 40 | ||
| 41 | def mini_progress(self, what, i, total): | ||
| 42 | i = i + 1 | ||
| 43 | pec = (float(i)/float(total))*100 | ||
| 44 | |||
| 45 | sys.stdout.write("\rUpdating %s %d%%" % | ||
| 46 | (what, | ||
| 47 | pec)) | ||
| 48 | sys.stdout.flush() | ||
| 49 | if int(pec) is 100: | ||
| 50 | sys.stdout.write("\n") | ||
| 51 | sys.stdout.flush() | ||
| 52 | |||
| 39 | def update(self): | 53 | def update(self): |
| 40 | """ | 54 | """ |
| 41 | Fetches layer, recipe and machine information from a layerindex | 55 | Fetches layer, recipe and machine information from a layerindex |
| @@ -85,7 +99,8 @@ class Command(NoArgsCommand): | |||
| 85 | if len(whitelist_branch_names) == 0: | 99 | if len(whitelist_branch_names) == 0: |
| 86 | raise Exception("Failed to make list of branches to fetch") | 100 | raise Exception("Failed to make list of branches to fetch") |
| 87 | 101 | ||
| 88 | logger.debug("Fetching branches") | 102 | logger.info("Fetching metadata releases for %s", |
| 103 | " ".join(whitelist_branch_names)) | ||
| 89 | 104 | ||
| 90 | # keep a track of the id mappings so that layer_versions can be created | 105 | # keep a track of the id mappings so that layer_versions can be created |
| 91 | # for these layers later on | 106 | # for these layers later on |
| @@ -96,10 +111,10 @@ class Command(NoArgsCommand): | |||
| 96 | # "?filter=name:%s" | 111 | # "?filter=name:%s" |
| 97 | # % "OR".join(whitelist_branch_names)) | 112 | # % "OR".join(whitelist_branch_names)) |
| 98 | 113 | ||
| 99 | # update layers | ||
| 100 | layers_info = _get_json_response(apilinks['layerItems']) | 114 | layers_info = _get_json_response(apilinks['layerItems']) |
| 101 | 115 | ||
| 102 | for li in layers_info: | 116 | total = len(layers_info) |
| 117 | for i, li in enumerate(layers_info): | ||
| 103 | # Special case for the openembedded-core layer | 118 | # Special case for the openembedded-core layer |
| 104 | if li['name'] == oe_core_layer: | 119 | if li['name'] == oe_core_layer: |
| 105 | try: | 120 | try: |
| @@ -113,25 +128,34 @@ class Command(NoArgsCommand): | |||
| 113 | oe_core_l.description = li['description'] | 128 | oe_core_l.description = li['description'] |
| 114 | oe_core_l.save() | 129 | oe_core_l.save() |
| 115 | li_layer_id_to_toaster_layer_id[li['id']] = oe_core_l.pk | 130 | li_layer_id_to_toaster_layer_id[li['id']] = oe_core_l.pk |
| 131 | self.mini_progress("layers", i, total) | ||
| 116 | continue | 132 | continue |
| 117 | 133 | ||
| 118 | except Layer.DoesNotExist: | 134 | except Layer.DoesNotExist: |
| 119 | pass | 135 | pass |
| 120 | 136 | ||
| 121 | l, created = Layer.objects.get_or_create(name=li['name']) | 137 | try: |
| 122 | l.up_date = li['updated'] | 138 | l, created = Layer.objects.get_or_create(name=li['name'], |
| 123 | l.vcs_url = li['vcs_url'] | 139 | vcs_url=li['vcs_url']) |
| 124 | l.vcs_web_url = li['vcs_web_url'] | 140 | l.up_date = li['updated'] |
| 125 | l.vcs_web_tree_base_url = li['vcs_web_tree_base_url'] | 141 | l.vcs_url = li['vcs_url'] |
| 126 | l.vcs_web_file_base_url = li['vcs_web_file_base_url'] | 142 | l.vcs_web_url = li['vcs_web_url'] |
| 127 | l.summary = li['summary'] | 143 | l.vcs_web_tree_base_url = li['vcs_web_tree_base_url'] |
| 128 | l.description = li['description'] | 144 | l.vcs_web_file_base_url = li['vcs_web_file_base_url'] |
| 129 | l.save() | 145 | l.summary = li['summary'] |
| 146 | l.description = li['description'] | ||
| 147 | l.save() | ||
| 148 | except Layer.MultipleObjectsReturned: | ||
| 149 | logger.info("Skipped %s as we found multiple layers and " | ||
| 150 | "don't know which to update" % | ||
| 151 | li['name']) | ||
| 130 | 152 | ||
| 131 | li_layer_id_to_toaster_layer_id[li['id']] = l.pk | 153 | li_layer_id_to_toaster_layer_id[li['id']] = l.pk |
| 132 | 154 | ||
| 133 | # update layerbranches/layer_versions | 155 | self.mini_progress("layers", i, total) |
| 134 | logger.debug("Fetching layer information") | 156 | |
| 157 | # update layer_versions | ||
| 158 | logger.info("Fetching layer versions") | ||
| 135 | layerbranches_info = _get_json_response( | 159 | layerbranches_info = _get_json_response( |
| 136 | apilinks['layerBranches'] + "?filter=branch__name:%s" % | 160 | apilinks['layerBranches'] + "?filter=branch__name:%s" % |
| 137 | "OR".join(whitelist_branch_names)) | 161 | "OR".join(whitelist_branch_names)) |
| @@ -140,7 +164,8 @@ class Command(NoArgsCommand): | |||
| 140 | # layer_version toaster object id | 164 | # layer_version toaster object id |
| 141 | li_layer_branch_id_to_toaster_lv_id = {} | 165 | li_layer_branch_id_to_toaster_lv_id = {} |
| 142 | 166 | ||
| 143 | for lbi in layerbranches_info: | 167 | total = len(layerbranches_info) |
| 168 | for i, lbi in enumerate(layerbranches_info): | ||
| 144 | 169 | ||
| 145 | try: | 170 | try: |
| 146 | lv, created = Layer_Version.objects.get_or_create( | 171 | lv, created = Layer_Version.objects.get_or_create( |
| @@ -149,8 +174,9 @@ class Command(NoArgsCommand): | |||
| 149 | pk=li_layer_id_to_toaster_layer_id[lbi['layer']]) | 174 | pk=li_layer_id_to_toaster_layer_id[lbi['layer']]) |
| 150 | ) | 175 | ) |
| 151 | except KeyError: | 176 | except KeyError: |
| 152 | print("No such layerindex layer referenced by layerbranch %d" % | 177 | logger.warning( |
| 153 | lbi['layer']) | 178 | "No such layerindex layer referenced by layerbranch %d" % |
| 179 | lbi['layer']) | ||
| 154 | continue | 180 | continue |
| 155 | 181 | ||
| 156 | lv.up_date = lbi['updated'] | 182 | lv.up_date = lbi['updated'] |
| @@ -160,7 +186,9 @@ class Command(NoArgsCommand): | |||
| 160 | 186 | ||
| 161 | li_layer_branch_id_to_toaster_lv_id[lbi['id']] =\ | 187 | li_layer_branch_id_to_toaster_lv_id[lbi['id']] =\ |
| 162 | lv.pk | 188 | lv.pk |
| 189 | self.mini_progress("layer versions", i, total) | ||
| 163 | 190 | ||
| 191 | logger.info("Fetching layer version dependencies") | ||
| 164 | # update layer dependencies | 192 | # update layer dependencies |
| 165 | layerdependencies_info = _get_json_response( | 193 | layerdependencies_info = _get_json_response( |
| 166 | apilinks['layerDependencies'] + | 194 | apilinks['layerDependencies'] + |
| @@ -190,19 +218,22 @@ class Command(NoArgsCommand): | |||
| 190 | "up_id:%s lv:%s" % | 218 | "up_id:%s lv:%s" % |
| 191 | (self, ldi['dependency'], lv)) | 219 | (self, ldi['dependency'], lv)) |
| 192 | 220 | ||
| 193 | for lv in dependlist: | 221 | total = len(dependlist) |
| 222 | for i, lv in enumerate(dependlist): | ||
| 194 | LayerVersionDependency.objects.filter(layer_version=lv).delete() | 223 | LayerVersionDependency.objects.filter(layer_version=lv).delete() |
| 195 | for lvd in dependlist[lv]: | 224 | for lvd in dependlist[lv]: |
| 196 | LayerVersionDependency.objects.get_or_create(layer_version=lv, | 225 | LayerVersionDependency.objects.get_or_create(layer_version=lv, |
| 197 | depends_on=lvd) | 226 | depends_on=lvd) |
| 227 | self.mini_progress("Layer version dependencies", i, total) | ||
| 198 | 228 | ||
| 199 | # update machines | 229 | # update machines |
| 200 | logger.debug("Fetching machine information") | 230 | logger.info("Fetching machine information") |
| 201 | machines_info = _get_json_response( | 231 | machines_info = _get_json_response( |
| 202 | apilinks['machines'] + "?filter=layerbranch__branch__name:%s" % | 232 | apilinks['machines'] + "?filter=layerbranch__branch__name:%s" % |
| 203 | "OR".join(whitelist_branch_names)) | 233 | "OR".join(whitelist_branch_names)) |
| 204 | 234 | ||
| 205 | for mi in machines_info: | 235 | total = len(machines_info) |
| 236 | for i, mi in enumerate(machines_info): | ||
| 206 | mo, created = Machine.objects.get_or_create( | 237 | mo, created = Machine.objects.get_or_create( |
| 207 | name=mi['name'], | 238 | name=mi['name'], |
| 208 | layer_version=Layer_Version.objects.get( | 239 | layer_version=Layer_Version.objects.get( |
| @@ -211,14 +242,16 @@ class Command(NoArgsCommand): | |||
| 211 | mo.name = mi['name'] | 242 | mo.name = mi['name'] |
| 212 | mo.description = mi['description'] | 243 | mo.description = mi['description'] |
| 213 | mo.save() | 244 | mo.save() |
| 245 | self.mini_progress("machines", i, total) | ||
| 214 | 246 | ||
| 215 | # update recipes; paginate by layer version / layer branch | 247 | # update recipes; paginate by layer version / layer branch |
| 216 | logger.debug("Fetching target information") | 248 | logger.info("Fetching recipe information") |
| 217 | recipes_info = _get_json_response( | 249 | recipes_info = _get_json_response( |
| 218 | apilinks['recipes'] + "?filter=layerbranch__branch__name:%s" % | 250 | apilinks['recipes'] + "?filter=layerbranch__branch__name:%s" % |
| 219 | "OR".join(whitelist_branch_names)) | 251 | "OR".join(whitelist_branch_names)) |
| 220 | 252 | ||
| 221 | for ri in recipes_info: | 253 | total = len(recipes_info) |
| 254 | for i, ri in enumerate(recipes_info): | ||
| 222 | try: | 255 | try: |
| 223 | lv_id = li_layer_branch_id_to_toaster_lv_id[ri['layerbranch']] | 256 | lv_id = li_layer_branch_id_to_toaster_lv_id[ri['layerbranch']] |
| 224 | lv = Layer_Version.objects.get(pk=lv_id) | 257 | lv = Layer_Version.objects.get(pk=lv_id) |
| @@ -245,7 +278,9 @@ class Command(NoArgsCommand): | |||
| 245 | ro.is_image = "-image-" in ri['pn'] | 278 | ro.is_image = "-image-" in ri['pn'] |
| 246 | ro.save() | 279 | ro.save() |
| 247 | except Exception as e: | 280 | except Exception as e: |
| 248 | logger.debug("Failed saving recipe %s", e) | 281 | logger.warning("Failed saving recipe %s", e) |
| 282 | |||
| 283 | self.mini_progress("recipes", i, total) | ||
| 249 | 284 | ||
| 250 | def handle_noargs(self, **options): | 285 | def handle_noargs(self, **options): |
| 251 | self.update() | 286 | self.update() |
