Skip to content

Update backend API from Atlas Data API to Azure functions #14

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

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gem5.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"dataSource": "gem5-vision",
"database": "gem5-vision",
"collection": "resources",
"url": "https://data.mongodb-api.com/app/data-ejhjf/endpoint/data/v1",
"url": "http://localhost:7071/api/resources",
"authUrl": "https://realm.mongodb.com/api/client/v2.0/app/data-ejhjf/auth/providers/api-key/login",
"apiKey": "OIi5bAP7xxIGK782t8ZoiD2BkBGEzMdX3upChf9zdCxHSnMoiTnjI22Yw5kOSgy9",
"isMongo": true
Expand Down
73 changes: 30 additions & 43 deletions pages/api/mongodb/getFilters.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,60 +3,47 @@ import getToken from "./getToken";
/**
* @function getFilters
* @async
* @description This asynchronous function fetches distinct categories, architectures, and gem5 versions from a specified data source using MongoDB aggregation pipeline.
* @description This asynchronous function fetches distinct categories, architectures, and gem5 versions from MongoDB database
* It takes in an access token, URL, data source, database, and collection as input parameters, and returns an object containing the
* distinct categories, architectures, and gem5 versions sorted in ascending or descending order.
* @param {string} accessToken - The access token for authentication.
* @param {string} url - The URL of the data source.
* @param {string} dataSource - The name of the data source.
* @param {string} database - The name of the database.
* @param {string} collection - The name of the collection.
* @returns {Object} - An object containing the distinct categories, architectures, and gem5 versions sorted in ascending or descending order.
*/
async function getFilters(accessToken, url, dataSource, database, collection) {
async function getFilters(accessToken, url) {
// get all distinct categories from resources
const res = await fetch(`${url}/action/aggregate`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Access-Control-Request-Headers': '*',
"Authorization": "Bearer " + accessToken,
},
body: JSON.stringify({
"dataSource": dataSource,
"database": database,
"collection": collection,
"pipeline": [
{
"$unwind": "$gem5_versions"
},
{
"$group": {
"_id": null,
"category": { "$addToSet": "$category" },
"architecture": { "$addToSet": "$architecture" },
"gem5_versions": { "$addToSet": "$gem5_versions" }
}
}
]
})
}).catch(err => console.log(err));
let filters = await res.json();
if (res.status != 200 || filters['documents'].length == 0) {
try {
const res = await fetch(`${url}/filters`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
// 'x-functions-key': accessToken, // Using API token as x-functions-key for Azure Functions
},
});

// Check if status is not 200
if (res.status !== 200) {
console.log("Error: " + res.status);
return {
"category": [],
"architecture": [],
"gem5_versions": []
};
}

// Parse the response
const filters = await res.json();

// Return the filters directly since the API already formats them correctly
return filters;
} catch (err) {
console.log("Error fetching filters:", err);
return {
"category": [],
"architecture": [],
"gem5_versions": []
}
};
}
filters['documents'][0]['architecture'] = filters['documents'][0]['architecture'].filter(architecture => architecture != null);
delete filters['documents'][0]['_id'];

filters['documents'][0]['gem5_versions'] = filters['documents'][0]['gem5_versions']
filters['documents'][0]['category'].sort();
filters['documents'][0]['architecture'].sort();
filters['documents'][0]['gem5_versions'].sort().reverse();
return filters['documents'][0];
}

/**
Expand All @@ -69,6 +56,6 @@ export default async function getFiltersMongoDB(database) {
let privateResources = process.env.SOURCES;
let privateResource = privateResources[database];
let privateAccessToken = await getToken(database);
let privateFilters = await getFilters(privateAccessToken, privateResource.url, privateResource.dataSource, privateResource.database, privateResource.collection);
let privateFilters = await getFilters(privateAccessToken, privateResource.url);
return privateFilters;
}
74 changes: 17 additions & 57 deletions pages/api/mongodb/getResourceByID.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,77 +16,37 @@ import getToken from "./getToken";
* If not provided, the latest version will be retrieved.
* @returns {Object} - The retrieved resource object, including its metadata and associated workloads.
*/
async function getResourceByID(token, url, dataSource, database, collection, id, version = null) {
const res = await fetch(`${url}/action/find`, {
method: 'POST',
async function getResourceByID(token, url, id, version = null) {

let params = new URLSearchParams();
params.append("id", id)
if (version == null) {
params.append("resource_version", version)
}
const res = await fetch(`${url}/find-resource-by-id?${params.toString()}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
// 'api-key': 'pKkhRJGJaQ3NdJyDt69u4GPGQTDUIhHlx4a3lrKUNx2hxuc8uba8NrP3IVRvlzlo',
'Access-Control-Request-Headers': '*',
// 'origin': 'https://gem5vision.github.io',
"Authorization": "Bearer " + token,
},
body: JSON.stringify({
"dataSource": dataSource,
"database": database,
"collection": collection,
"filter": version ? {
"id": id,
"resource_version": version
} : {
"id": id
}
})
}).catch(err => console.log(err));
let resource = await res.json();
if (res.status != 200 || resource['documents'] === null || resource['documents'].length === 0) {
if (res.status != 200 || resource === null || resource.length === 0) {
return { error: 'Resource not found' }
}

resource = resource['documents'].sort((a, b) => -compareVersions(a.resource_version, b.resource_version))[0];
resource = resource.sort((a, b) => -compareVersions(a.resource_version, b.resource_version))[0];

const dependendWorkloads = await fetch(`${url}/action/aggregate`, {
method: 'POST',
const dependendWorkloads = await fetch(`${url}/get-dependent-workloads?${params.toString()}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Access-Control-Request-Headers': '*',
'Authorization': 'Bearer ' + token,
},
body: JSON.stringify({
"dataSource": dataSource,
"database": database,
"collection": collection,
"pipeline": [
{
"$match": {
"category": "workload"
}
},
{
"$addFields": {
"resources": {
"$objectToArray": "$resources"
}
}
},
{
"$unwind": "$resources"
},
{
"$match": {
"resources.v": id
}
},
{
"$group": {
"_id": "$id",
}
}
]
})
}
}).catch(err => console.log(err));
let workloads = await dependendWorkloads.json();
resource.workloads_mapping = Object.values(workloads['documents']).map(workload => workload['_id']);
console.log(workloads)
resource.workloads_mapping = Object.values(workloads).map(workload => workload['_id']);

return resource;
}
Expand All @@ -101,7 +61,7 @@ async function getResourceByID(token, url, dataSource, database, collection, id,
export default async function getResourceByIDMongoDB(id, database = null, version = null) {
const token = await getToken(database);
let privateResources = process.env.SOURCES[database];
const resource = await getResourceByID(token, privateResources.url, privateResources.dataSource, privateResources.database, privateResources.collection, id, version);
const resource = await getResourceByID(token, privateResources.url,id, version);
resource['database'] = database;
return resource;
}
Loading
Loading