backend/bms_app/upload/views.py (38 lines of code) (raw):
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
from flask import request
from bms_app import settings
from bms_app.services.gcs import list_blobs, upload_stream_to_gcs
from bms_app.upload import bp
from bms_app.upload.services import get_software_library
class StreamWrapper:
"""Wrap gunicorn.http.body.Body to provide .tell() method.
gunicorn.http.body.Body does not provide .tell()
that is required by from google.resumable_media.requests.ResumableUpload
add custom .tell() method to make ResumableUpload work.
"""
def __init__(self, stream):
self.stream = stream
self._pos = 0 # keep current position
def read(self, *args, **kwargs):
data = self.stream.read(*args, **kwargs)
self._pos += len(data)
return data
def tell(self):
return self._pos
@bp.route('/binaries/<path:file_name>', methods=['POST'])
def upload_oracle_binary(file_name):
gcs_key = os.path.join(
settings.GCS_ORACLE_BINARY_PREFIX,
file_name
)
stream = StreamWrapper(request.stream)
upload_stream_to_gcs(
stream,
settings.GCS_BUCKET,
gcs_key
)
return {}, 201
@bp.route('/binaries', methods=['GET'])
def list_oracle_binaries():
binaries = list_blobs(
settings.GCS_BUCKET,
settings.GCS_ORACLE_BINARY_PREFIX
)
file_names = [os.path.basename(f['name']) for f in binaries]
items = get_software_library(file_names)
return {'data': items}, 201