-
Notifications
You must be signed in to change notification settings - Fork 1
Add list-all-resources endpoint #7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: add-list-resources-endpoint
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,96 @@ | ||
| # Copyright (c) 2025 The Regents of the University of California | ||
| # SPDX-License-Identifier: BSD-3-Clause | ||
|
|
||
| import json | ||
| import logging | ||
|
|
||
| import azure.functions as func | ||
|
|
||
| from shared.database import RESOURCE_FIELDS | ||
| from shared.utils import ( | ||
| create_error_response, | ||
| get_latest_versions, | ||
| sanitize_version, | ||
| ) | ||
|
|
||
|
|
||
| def register_function(app, collection): | ||
| """Register the function with the app.""" | ||
|
|
||
| @app.function_name(name="list_all_resources") | ||
| @app.route( | ||
| route="resources/list-all-resources", | ||
| auth_level=func.AuthLevel.ANONYMOUS, | ||
| ) | ||
| def list_all_resources(req: func.HttpRequest) -> func.HttpResponse: | ||
| """ | ||
| Get all resources where a gem5 version in the resource is a prefix | ||
| of the specified version parameter. | ||
|
|
||
| Route: /resources/list-all-resources | ||
|
|
||
| Query Parameters: | ||
| - gem5-version: Required, the gem5 version to match against | ||
| (e.g., "25.0.0.1" will match resources with "25.0") | ||
| - latest-version: Optional, if set to "true", returns only the latest | ||
| compatible version of each resource instead of all | ||
| compatible versions. Default is false (return all). | ||
| """ | ||
| logging.info( | ||
| "Processing request to list all resources by gem5 version" | ||
| ) | ||
| try: | ||
| gem5_version = req.params.get("gem5-version") | ||
| latest_version_only = ( | ||
| req.params.get("latest-version", "false").lower() == "true" | ||
| ) | ||
|
|
||
| if not gem5_version: | ||
| return create_error_response( | ||
| 400, "'gem5-version' parameter is required" | ||
| ) | ||
|
|
||
| gem5_version = sanitize_version(gem5_version) | ||
|
|
||
| if not gem5_version: | ||
| return create_error_response( | ||
| 400, "Invalid 'gem5-version' parameter format" | ||
| ) | ||
|
|
||
| # Build a list of all possible prefixes from the version | ||
| # Starting from major.minor since gem5 versions always have at | ||
| # least one dot (e.g., "25.0", "23.1") | ||
| # e.g., "25.0.0.1" -> ["25.0", "25.0.0", "25.0.0.1"] | ||
| version_parts = gem5_version.split(".") | ||
| prefixes = [] | ||
| for i in range(2, len(version_parts) + 1): | ||
| prefixes.append(".".join(version_parts[:i])) | ||
|
Comment on lines
+60
to
+67
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we have any real reason to search for compatibility with minor and hotfix values? It kind of makes things more complex. Are there any resources that express compatibility beyond the gem5 major versions? This is more me trying to understand. I assume we do this same procedure elsewhere and it'd be too annoying to change at this stage. Just to check my assumptions on how this works: What would it mean for a resource of a particular version to have a stated compatibility of say, 'v24.0.1', with a gem5 version of 'v24.0.2'? I take it this gem5 resource would be seen as incompatible? Also, am I correct in assuming when a resource has one stated compatibility at the granularity of the a major release, and another stated compatibility at the granularity of am minor/hotfix release of that same major (.e.g., ['v24.1' 'v24.1.1'], or ['v24.0', 'v24.0.0.1']), then the major/hotfix compatibility is effectively redundant as the major version compatibility assumes compatibility with all releases within that major release (e.g., ['v24.1' 'v24.1.1'] is equal to ['v24.1'] in practice).
Collaborator
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We dont currently use the functionality but the For your second question, if a particular version to have a stated compatibility of say, 'v24.0.1', then the resource would be incompatible with gem5 version of 'v24.0.2', this would potentially be helpful in case we need to update checkpoint in hot fixes, etc. Yes, if a resource has one stated compatibility at the granularity of the a major release, and another stated compatibility at the granularity of am minor/hotfix release of that same major (.e.g., ['v24.1' 'v24.1.1'], or ['v24.0', 'v24.0.0.1']), then the major/hotfix compatibility is effectively redundant as the major version compatibility assumes compatibility with all releases within that major release (e.g., ['v24.1' 'v24.1.1'] is equal to ['v24.1'] in practice). |
||
|
|
||
| # If only one part provided (e.g., "25"), return error | ||
| if not prefixes: | ||
| return create_error_response( | ||
| 400, | ||
| "Invalid 'gem5-version' parameter: must have at least " | ||
| "major version format (e.g., '23.0', '25.1')", | ||
| ) | ||
|
|
||
| # Query for resources where any gem5_version matches one of | ||
| # the prefixes | ||
| query = {"gem5_versions": {"$in": prefixes}} | ||
|
|
||
| resources = list(collection.find(query, RESOURCE_FIELDS)) | ||
|
|
||
| # If latest-version is set, return only the latest version of | ||
| # each resource | ||
| if latest_version_only: | ||
| resources = get_latest_versions(resources) | ||
|
|
||
| return func.HttpResponse( | ||
| body=json.dumps(resources), | ||
| status_code=200, | ||
| headers={"Content-Type": "application/json"}, | ||
| ) | ||
|
|
||
| except Exception as e: | ||
| logging.error(f"Error listing resources by gem5 version: {str(e)}") | ||
| return create_error_response(500, "Internal server error") | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does it? Is that what we want? Shouldn't this return the more current compatible version of each resource. E.g., if Resource A version 1 and Resource A version 2 both state compatibility with the specified gem5 version then this function would return Resource A version 2 only. Version 1 has been replaced with something, presumably, better. I can't see a case you'd need an older version over the most current.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, currently we return all versions.
I feel it is better to return every version and then post process to the latest one.
I like the idea of adding an optional parameter that will return only the latest compatible version.
By default, we return all compatible version.