Skip to content

Commit 371962b

Browse files
committed
Refactoring, address comments, more unit tests, metadata_api updates
1 parent 0d12b0c commit 371962b

File tree

6 files changed

+622
-317
lines changed

6 files changed

+622
-317
lines changed

lib/pbench/server/api/__init__.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
import os
88
import sys
99

10-
from flask import Flask, request
10+
from flask import Flask
1111
from flask_restful import Api
1212
from flask_cors import CORS
1313

1414
from pbench.server import PbenchServerConfig
1515
from pbench.common.exceptions import BadConfig, ConfigFileNotSpecified
1616
from pbench.server.api.resources.upload_api import Upload, HostInfo
17-
from pbench.server.api.resources.graphql_api import GraphQL, UserMetadata, QueryMetadata
17+
from pbench.server.api.resources.graphql_api import GraphQL
18+
from pbench.server.api.resources.metadata_api import UserMetadata, QueryMetadata
1819
from pbench.common.logger import get_pbench_logger
1920
from pbench.server.api.resources.query_apis.elasticsearch_api import Elasticsearch
2021
from pbench.server.api.resources.query_apis.query_controllers import QueryControllers
@@ -86,10 +87,14 @@ def register_endpoints(api, app, config):
8687
)
8788

8889
api.add_resource(
89-
UserMetadata, f"{base_uri}/metadata", resource_class_args=(config, logger, token_auth),
90+
UserMetadata,
91+
f"{base_uri}/metadata",
92+
resource_class_args=(config, logger, token_auth),
9093
)
9194
api.add_resource(
92-
QueryMetadata, f"{base_uri}/metadata/<string:id>", resource_class_args=(config, logger),
95+
QueryMetadata,
96+
f"{base_uri}/metadata/<string:id>",
97+
resource_class_args=(config, logger),
9398
)
9499

95100

lib/pbench/server/api/resources/graphql_api.py

Lines changed: 1 addition & 250 deletions
Original file line numberDiff line numberDiff line change
@@ -1,255 +1,6 @@
11
import requests
2-
import datetime
3-
import json
42
from flask_restful import Resource, abort
5-
from flask import request, make_response, jsonify
6-
from pbench.server.database.models.metadata import MetadataModel
7-
from pbench.server.database.database import Database
8-
from pbench.server.api.auth import Auth
9-
10-
11-
class UserMetadata(Resource):
12-
"""
13-
Abstracted pbench API for handling user metadata by using graphql schema
14-
"""
15-
16-
def __init__(self, config, logger, auth):
17-
self.server_config = config
18-
self.logger = logger
19-
self.auth = auth
20-
21-
@Auth.token_auth.login_required(f=Auth().verify_auth())
22-
def post(self):
23-
"""
24-
Post request for creating metadata instance for a user.
25-
This requires a JWT auth token in the header field
26-
27-
This requires a JSON data with required user metadata fields
28-
{
29-
"config": "config",
30-
"description": "description",
31-
}
32-
33-
Required headers include
34-
Authorization: JWT token (user received upon login)
35-
36-
:return: JSON Payload
37-
response_object = {
38-
"status": "success"
39-
"data" {
40-
"id": "metadata_id",
41-
"config": "Config string"
42-
"description": "Description string"
43-
}
44-
}
45-
"""
46-
post_data = request.get_json()
47-
if not post_data:
48-
self.logger.warning("Invalid json object: %s", request.url)
49-
abort(400, message="Invalid json object in request")
50-
51-
config = post_data.get("config")
52-
if not config:
53-
self.logger.warning("Config not provided during metadata creation")
54-
abort(400, message="Please provide a config string")
55-
56-
description = post_data.get("description")
57-
if not description:
58-
self.logger.warning("Description not provided during metadata creation")
59-
abort(400, message="Please provide a description string")
60-
current_user_id = self.auth.token_auth.current_user().id
61-
62-
try:
63-
# Create a new metadata session
64-
metadata_session = MetadataModel(
65-
created=str(datetime.datetime.now()),
66-
config=config,
67-
description=description,
68-
user_id=current_user_id
69-
)
70-
# insert the metadata session for a user
71-
Database.db_session.add(metadata_session)
72-
Database.db_session.commit()
73-
self.logger.info("New user metadata session created")
74-
except Exception:
75-
self.logger.exception("Exception occurred during Metadata creation")
76-
abort(500, message="INTERNAL ERROR")
77-
else:
78-
response_object = {
79-
"status": "success",
80-
"data": {
81-
"id": metadata_session.id,
82-
"config": metadata_session.config,
83-
"description": metadata_session.description,
84-
},
85-
}
86-
return make_response(jsonify(response_object), 201)
87-
88-
@Auth.token_auth.login_required(f=Auth().verify_auth())
89-
def get(self):
90-
"""
91-
Get request for querying all the metadata sessions for a user.
92-
This requires a JWT auth token in the header field
93-
94-
Required headers include
95-
Authorization: JWT token (user received upon login)
96-
97-
:return: JSON Payload
98-
response_object = {
99-
"status": "success"
100-
"data": {
101-
"sessions": [
102-
{"id": "metadata_id",
103-
"config": "Config string"
104-
"description": "Description string"},
105-
{}]
106-
}
107-
}
108-
"""
109-
current_user_id = self.auth.token_auth.current_user().id
110-
try:
111-
# Fetch the metadata session
112-
sessions = (
113-
Database.db_session.query(MetadataModel)
114-
.filter_by(user_id=current_user_id)
115-
.all()
116-
)
117-
118-
req_keys = ["id", "config", "description", "created"]
119-
data = json.dumps([{key: session.as_dict()[key] for key in req_keys} for session in sessions])
120-
except Exception:
121-
self.logger.exception("Exception occurred during querying Metadata model")
122-
abort(500, message="INTERNAL ERROR")
123-
124-
response_object = {
125-
"status": "success",
126-
"data": {
127-
"sessions": data
128-
},
129-
}
130-
return make_response(jsonify(response_object), 200)
131-
132-
133-
class QueryMetadata(Resource):
134-
"""
135-
Abstracted pbench API for querying a single user metadata session
136-
"""
137-
138-
def __init__(self, config, logger):
139-
self.server_config = config
140-
self.logger = logger
141-
142-
@Auth.token_auth.login_required(f=Auth().verify_auth())
143-
def get(self, id=None):
144-
"""
145-
Get request for querying a metadata session for a user given a metadata id.
146-
This requires a JWT auth token in the header field
147-
148-
This requires a JSON data with required user metadata fields to update
149-
{
150-
"description": "description",
151-
}
152-
153-
The url requires a metadata session id such as /user/metadata/<string:id>
154-
155-
Required headers include
156-
Authorization: JWT token (user received upon login)
157-
158-
:return: JSON Payload
159-
response_object = {
160-
"status": "success"
161-
"data" {
162-
"id": "metadata_id",
163-
"config": "Config string"
164-
"description": "Description string"
165-
}
166-
}
167-
"""
168-
if not id:
169-
self.logger.warning("Meatadata id not provided during metadata query")
170-
abort(400, message="Please provide a metadata id to query")
171-
172-
try:
173-
# Fetch the metadata session
174-
session = (
175-
Database.db_session.query(MetadataModel)
176-
.filter_by(id=id)
177-
.first()
178-
)
179-
except Exception:
180-
self.logger.exception("Exception occurred during querying Metadata model")
181-
abort(500, message="INTERNAL ERROR")
182-
else:
183-
response_object = {
184-
"status": "success",
185-
"data": {
186-
"id": session.id,
187-
"config": session.config,
188-
"description": session.description,
189-
},
190-
}
191-
return make_response(jsonify(response_object), 200)
192-
193-
@Auth.token_auth.login_required(f=Auth().verify_auth())
194-
def put(self, id=None):
195-
"""
196-
Put request for updating a metadata session for a user given a metadata id.
197-
This requires a JWT auth token in the header field
198-
199-
The url requires a metadata session id such as /user/metadata/<string:id>
200-
201-
Required headers include
202-
Authorization: JWT token (user received upon login)
203-
204-
:return: JSON Payload
205-
response_object = {
206-
"status": "success"
207-
"data" {
208-
"id": "metadata_id",
209-
"config": "Config string"
210-
"description": "Description string"
211-
}
212-
}
213-
"""
214-
if not id:
215-
self.logger.warning("Meatadata id not provided during metadata query")
216-
abort(400, message="Please provide a metadata id to query")
217-
218-
post_data = request.get_json()
219-
if not post_data:
220-
self.logger.warning("Invalid json object: %s", request.url)
221-
abort(400, message="Invalid json object in request")
222-
223-
description = post_data.get("description")
224-
if not description:
225-
self.logger.warning("Description not provided during metadata update")
226-
abort(400, message="Please provide a description string")
227-
228-
try:
229-
# Fetch the metadata session
230-
session = (
231-
Database.db_session.query(MetadataModel)
232-
.filter_by(id=id)
233-
.first()
234-
)
235-
session.description = description
236-
# Update the metadata session for a user
237-
Database.db_session.add(session)
238-
Database.db_session.commit()
239-
self.logger.info("User metadata session updated")
240-
except Exception:
241-
self.logger.exception("Exception occurred during querying Metadata model")
242-
abort(500, message="INTERNAL ERROR")
243-
else:
244-
response_object = {
245-
"status": "success",
246-
"data": {
247-
"id": session.id,
248-
"config": session.config,
249-
"description": session.description,
250-
},
251-
}
252-
return make_response(jsonify(response_object), 200)
3+
from flask import request, make_response
2534

2545

2556
class GraphQL(Resource):

0 commit comments

Comments
 (0)