mirror of
https://git.yoctoproject.org/poky
synced 2026-05-31 12:49:46 +00:00
bitbake: toaster: xhr_customrecipe_packages add GET info for package response
Add response for GET to the xhr_customrecipe_packages ReST API /xhr_customrecipe/<recipe_id>/packages/<package_id> Thie response includes the id, name, version and dependency information for the package. (Bitbake rev: c45791fc85d26c43b0a3b0a459111d2ff5583540) Signed-off-by: Michael Wood <michael.g.wood@intel.com> Signed-off-by: brian avery <avery.brian@gmail.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
committed by
Richard Purdie
parent
a9668eeb74
commit
b213907afe
@@ -2501,11 +2501,12 @@ if True:
|
|||||||
"""
|
"""
|
||||||
ReST API to add/remove packages to/from custom recipe.
|
ReST API to add/remove packages to/from custom recipe.
|
||||||
|
|
||||||
Entry point: /xhr_customrecipe/<recipe_id>/packages/
|
Entry point: /xhr_customrecipe/<recipe_id>/packages/<package_id>
|
||||||
|
|
||||||
Methods:
|
Methods:
|
||||||
PUT - Add package to the recipe
|
PUT - Add package to the recipe
|
||||||
DELETE - Delete package from the recipe
|
DELETE - Delete package from the recipe
|
||||||
|
GET - Get package information
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
{"error": "ok"}
|
{"error": "ok"}
|
||||||
@@ -2518,53 +2519,108 @@ if True:
|
|||||||
return {"error": "Custom recipe with id=%s "
|
return {"error": "Custom recipe with id=%s "
|
||||||
"not found" % recipe_id}
|
"not found" % recipe_id}
|
||||||
|
|
||||||
if request.method == 'GET' and not package_id:
|
if package_id:
|
||||||
packages = recipe.package_set.values("id", "name", "version")
|
try:
|
||||||
|
package = CustomImagePackage.objects.get(id=package_id)
|
||||||
|
except Package.DoesNotExist:
|
||||||
|
return {"error": "Package with id=%s "
|
||||||
|
"not found" % package_id}
|
||||||
|
|
||||||
return {"error": "ok",
|
if request.method == 'GET':
|
||||||
"packages" : list(packages),
|
if not package_id:
|
||||||
"total" : len(packages)
|
packages = recipe.get_all_packages().values("id",
|
||||||
}
|
"name",
|
||||||
|
"version")
|
||||||
|
|
||||||
try:
|
return {"error": "ok",
|
||||||
package = Package.objects.get(id=package_id)
|
"packages" : list(packages),
|
||||||
except Package.DoesNotExist:
|
"total" : len(packages)
|
||||||
return {"error": "Package with id=%s "
|
}
|
||||||
"not found" % package_id}
|
else:
|
||||||
|
all_current_packages = recipe.get_all_packages()
|
||||||
|
|
||||||
|
# TODO currently we ignore packgegroups as we don't have a
|
||||||
|
# way to deal with them yet.
|
||||||
|
|
||||||
|
# Dependencies for package which aren't satisfied by the
|
||||||
|
# current packages in the custom image recipe
|
||||||
|
deps = package.package_dependencies_source.annotate(
|
||||||
|
name=F('depends_on__name'),
|
||||||
|
pk=F('depends_on__pk'),
|
||||||
|
size=F('depends_on__size'),
|
||||||
|
).values("name", "pk", "size").filter(
|
||||||
|
~Q(pk__in=all_current_packages) &
|
||||||
|
Q(dep_type=Package_Dependency.TYPE_TRDEPENDS)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Reverse dependencies which are needed by packages that are
|
||||||
|
# in the image
|
||||||
|
reverse_deps = package.package_dependencies_target.annotate(
|
||||||
|
name=F('package__name'),
|
||||||
|
pk=F('package__pk'),
|
||||||
|
size=F('package__size'),
|
||||||
|
).values("name", "pk", "size").exclude(
|
||||||
|
~Q(pk__in=all_current_packages)
|
||||||
|
)
|
||||||
|
|
||||||
|
total_size_deps = 0
|
||||||
|
total_size_reverse_deps = 0
|
||||||
|
|
||||||
|
for dep in deps:
|
||||||
|
dep['size_formatted'] = \
|
||||||
|
filtered_filesizeformat(dep['size'])
|
||||||
|
total_size_deps += dep['size']
|
||||||
|
|
||||||
|
for dep in reverse_deps:
|
||||||
|
dep['size_formatted'] = \
|
||||||
|
filtered_filesizeformat(dep['size'])
|
||||||
|
total_size_reverse_deps += dep['size']
|
||||||
|
|
||||||
|
|
||||||
|
return {"error": "ok",
|
||||||
|
"id": package.pk,
|
||||||
|
"name": package.name,
|
||||||
|
"version": package.version,
|
||||||
|
"unsatisfied_dependencies": list(deps),
|
||||||
|
"unsatisfied_dependencies_size": total_size_deps,
|
||||||
|
"unsatisfied_dependencies_size_formatted":
|
||||||
|
filtered_filesizeformat(total_size_deps),
|
||||||
|
"reverse_dependencies": list(reverse_deps),
|
||||||
|
"reverse_dependencies_size": total_size_reverse_deps,
|
||||||
|
"reverse_dependencies_size_formatted":
|
||||||
|
filtered_filesizeformat(total_size_reverse_deps)}
|
||||||
|
|
||||||
|
included_packages = recipe.includes_set.values_list('pk', flat=True)
|
||||||
|
|
||||||
if request.method == 'PUT':
|
if request.method == 'PUT':
|
||||||
# As these requests are asynchronous we need to make sure we don't
|
# If we're adding back a package which used to be included in this
|
||||||
# already have the package in the image recipe
|
# image all we need to do is remove it from the excludes
|
||||||
if recipe.package_set.filter(Q(name=package.name) &
|
if package.pk in included_packages:
|
||||||
Q(version=package.version)).count() > 0:
|
try:
|
||||||
return {"error" : "Package %s already in recipe" %
|
recipe.excludes_set.remove(package)
|
||||||
package.name }
|
return {"error": "ok"}
|
||||||
|
except Package.DoesNotExist:
|
||||||
|
return {"error":
|
||||||
|
"Package %s not found in excludes but was in "
|
||||||
|
"included list" % package.name}
|
||||||
|
|
||||||
# Make a copy of this package
|
else:
|
||||||
dependencies = _get_package_dependencies(package.pk)
|
recipe.appends_set.add(package)
|
||||||
|
|
||||||
package = _copy_packge_to_recipe(recipe, package)
|
return {"error": "ok"}
|
||||||
recipe.package_set.add(package)
|
|
||||||
|
|
||||||
# Filter out dependencies already in the custom image
|
|
||||||
all_in_image = recipe.package_set.all().values_list('name',
|
|
||||||
flat=True)
|
|
||||||
def in_image(pkg):
|
|
||||||
return pkg['name'] not in all_in_image
|
|
||||||
|
|
||||||
dependencies = filter(in_image, dependencies['runtime_deps'])
|
|
||||||
return {"error": "ok",
|
|
||||||
"dependencies_needed" : dependencies,
|
|
||||||
}
|
|
||||||
|
|
||||||
elif request.method == 'DELETE':
|
elif request.method == 'DELETE':
|
||||||
if package in recipe.package_set.all():
|
try:
|
||||||
# note that we are infact deleting the copy of the package
|
# If we're deleting a package which is included we need to
|
||||||
package.delete()
|
# Add it to the excludes list.
|
||||||
|
if package.pk in included_packages:
|
||||||
|
recipe.excludes_set.add(package)
|
||||||
|
else:
|
||||||
|
recipe.appends_set.remove(package)
|
||||||
return {"error": "ok"}
|
return {"error": "ok"}
|
||||||
else:
|
except CustomImageRecipe.DoesNotExist:
|
||||||
return {"error": "Package '%s' is not in the recipe '%s'" % \
|
return {"error": "Tried to remove package that wasn't present"}
|
||||||
(package.name, recipe.name)}
|
|
||||||
else:
|
else:
|
||||||
return {"error": "Method %s is not supported" % request.method}
|
return {"error": "Method %s is not supported" % request.method}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user