endpoints/bookstore-grpc-transcoding/bookstore_server.py (85 lines of code) (raw):
# Copyright 2016 Google Inc.
#
# 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.
"""The Python gRPC Bookstore Server Example."""
import argparse
from concurrent import futures
import time
from google.protobuf import struct_pb2
import grpc
import bookstore
import bookstore_pb2
import bookstore_pb2_grpc
import status
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class BookstoreServicer(bookstore_pb2_grpc.BookstoreServicer):
"""Implements the bookstore API server."""
def __init__(self, store):
self._store = store
def ListShelves(self, unused_request, context):
with status.context(context):
response = bookstore_pb2.ListShelvesResponse()
response.shelves.extend(self._store.list_shelf())
return response
def CreateShelf(self, request, context):
with status.context(context):
shelf, _ = self._store.create_shelf(request.shelf)
return shelf
def GetShelf(self, request, context):
with status.context(context):
return self._store.get_shelf(request.shelf)
def DeleteShelf(self, request, context):
with status.context(context):
self._store.delete_shelf(request.shelf)
return struct_pb2.Value()
def ListBooks(self, request, context):
with status.context(context):
response = bookstore_pb2.ListBooksResponse()
response.books.extend(self._store.list_books(request.shelf))
return response
def CreateBook(self, request, context):
with status.context(context):
return self._store.create_book(request.shelf, request.book)
def GetBook(self, request, context):
with status.context(context):
return self._store.get_book(request.shelf, request.book)
def DeleteBook(self, request, context):
with status.context(context):
self._store.delete_book(request.shelf, request.book)
return struct_pb2.Value()
def create_sample_bookstore():
"""Creates a Bookstore with some initial sample data."""
store = bookstore.Bookstore()
shelf = bookstore_pb2.Shelf()
shelf.theme = "Fiction"
_, fiction = store.create_shelf(shelf)
book = bookstore_pb2.Book()
book.title = "REAMDE"
book.author = "Neal Stephenson"
store.create_book(fiction, book)
shelf = bookstore_pb2.Shelf()
shelf.theme = "Fantasy"
_, fantasy = store.create_shelf(shelf)
book = bookstore_pb2.Book()
book.title = "A Game of Thrones"
book.author = "George R.R. Martin"
store.create_book(fantasy, book)
return store
def serve(port, shutdown_grace_duration):
"""Configures and runs the bookstore API server."""
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
store = create_sample_bookstore()
bookstore_pb2_grpc.add_BookstoreServicer_to_server(BookstoreServicer(store), server)
server.add_insecure_port(f"[::]:{port}")
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(shutdown_grace_duration)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument("--port", type=int, default=8000, help="The port to listen on")
parser.add_argument(
"--shutdown_grace_duration",
type=int,
default=5,
help="The shutdown grace duration, in seconds",
)
args = parser.parse_args()
serve(args.port, args.shutdown_grace_duration)