mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-04-13 22:30:52 +01:00
framework/getters: fix http getter APK resolution
Fully matching an APK resource requires the file to be present locally, so that its metadata can be queries. HTTP getter was matching against a remote path so the match was failing. The matching now happens in two stages == first partial path-only matches are established. Secondly, all partial matches are downloaded and final match occurs against downloaded files.
This commit is contained in:
parent
5f7c64b089
commit
1daec4f2c5
@ -71,6 +71,14 @@ def get_generic_resource(resource, files):
|
|||||||
return matches[0]
|
return matches[0]
|
||||||
|
|
||||||
|
|
||||||
|
def get_path_matches(resource, files):
|
||||||
|
matches = []
|
||||||
|
for f in files:
|
||||||
|
if resource.match_path(f):
|
||||||
|
matches.append(f)
|
||||||
|
return matches
|
||||||
|
|
||||||
|
|
||||||
def get_from_location(basepath, resource):
|
def get_from_location(basepath, resource):
|
||||||
if resource.kind == 'file':
|
if resource.kind == 'file':
|
||||||
path = os.path.join(basepath, resource.path)
|
path = os.path.join(basepath, resource.path)
|
||||||
@ -204,10 +212,15 @@ class Http(ResourceGetter):
|
|||||||
return # TODO: add support for unowned resources
|
return # TODO: add support for unowned resources
|
||||||
if not self.index:
|
if not self.index:
|
||||||
self.index = self.fetch_index()
|
self.index = self.fetch_index()
|
||||||
asset = self.resolve_resource(resource)
|
if resource.kind == 'apk':
|
||||||
if not asset:
|
# APKs must always be downloaded to run ApkInfo for version
|
||||||
return
|
# information.
|
||||||
return self.download_asset(asset, resource.owner.name)
|
return self.resolve_apk(resource)
|
||||||
|
else:
|
||||||
|
asset = self.resolve_resource(resource)
|
||||||
|
if not asset:
|
||||||
|
return
|
||||||
|
return self.download_asset(asset, resource.owner.name)
|
||||||
|
|
||||||
def fetch_index(self):
|
def fetch_index(self):
|
||||||
if not self.url:
|
if not self.url:
|
||||||
@ -251,6 +264,20 @@ class Http(ResourceGetter):
|
|||||||
auth = None
|
auth = None
|
||||||
return requests.get(url, auth=auth, stream=stream)
|
return requests.get(url, auth=auth, stream=stream)
|
||||||
|
|
||||||
|
def resolve_apk(self, resource):
|
||||||
|
assets = self.index.get(resource.owner.name, {})
|
||||||
|
if not assets:
|
||||||
|
return None
|
||||||
|
asset_map = {a['path']: a for a in assets}
|
||||||
|
paths = get_path_matches(resource, asset_map.keys())
|
||||||
|
local_paths = []
|
||||||
|
for path in paths:
|
||||||
|
local_paths.append(self.download_asset(asset_map[path],
|
||||||
|
resource.owner.name))
|
||||||
|
for path in local_paths:
|
||||||
|
if resource.match(path):
|
||||||
|
return path
|
||||||
|
|
||||||
def resolve_resource(self, resource):
|
def resolve_resource(self, resource):
|
||||||
# pylint: disable=too-many-branches,too-many-locals
|
# pylint: disable=too-many-branches,too-many-locals
|
||||||
assets = self.index.get(resource.owner.name, {})
|
assets = self.index.get(resource.owner.name, {})
|
||||||
@ -258,13 +285,7 @@ class Http(ResourceGetter):
|
|||||||
return {}
|
return {}
|
||||||
|
|
||||||
asset_map = {a['path']: a for a in assets}
|
asset_map = {a['path']: a for a in assets}
|
||||||
if resource.kind in ['apk', 'jar', 'revent']:
|
if resource.kind in ['jar', 'revent']:
|
||||||
if resource.kind == 'apk' and resource.version:
|
|
||||||
# TODO: modify the index format to attach version info to the
|
|
||||||
# APK entries.
|
|
||||||
msg = 'Versions of APKs cannot be fetched over HTTP at this time'
|
|
||||||
self.logger.warning(msg)
|
|
||||||
return {}
|
|
||||||
path = get_generic_resource(resource, asset_map.keys())
|
path = get_generic_resource(resource, asset_map.keys())
|
||||||
if path:
|
if path:
|
||||||
return asset_map[path]
|
return asset_map[path]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user