diff options
Diffstat (limited to 'apigateway/apigateway')
26 files changed, 622 insertions, 0 deletions
diff --git a/apigateway/apigateway/__init__.py b/apigateway/apigateway/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/__init__.py diff --git a/apigateway/apigateway/api/__init__.py b/apigateway/apigateway/api/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/api/__init__.py diff --git a/apigateway/apigateway/api/app.py b/apigateway/apigateway/api/app.py new file mode 100644 index 0000000..a8af22e --- /dev/null +++ b/apigateway/apigateway/api/app.py @@ -0,0 +1,37 @@ +# +# 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 pecan + +from apigateway.api import config as api_config +from apigateway.api import hooks + + +def get_pecan_config(): + filename = api_config.__file__.replace('.pyc', '.py') + return pecan.configuration.conf_from_file(filename) + + +def setup_app(): + config = get_pecan_config() + + app_hooks = [hooks.DBHook()] + app_conf = dict(config.app) + app = pecan.make_app( + app_conf.pop('root'), + logging=getattr(config, 'logging', {}), + hooks=app_hooks, + **app_conf + ) + + return app diff --git a/apigateway/apigateway/api/config.py b/apigateway/apigateway/api/config.py new file mode 100644 index 0000000..b76e681 --- /dev/null +++ b/apigateway/apigateway/api/config.py @@ -0,0 +1,18 @@ +# +# 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. + +app = { + 'root': 'apigateway.api.controllers.root.RootController', + 'modules': ['apigateway.api'], + 'debug': False, +} diff --git a/apigateway/apigateway/api/controllers/__init__.py b/apigateway/apigateway/api/controllers/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/api/controllers/__init__.py diff --git a/apigateway/apigateway/api/controllers/root.py b/apigateway/apigateway/api/controllers/root.py new file mode 100644 index 0000000..941b895 --- /dev/null +++ b/apigateway/apigateway/api/controllers/root.py @@ -0,0 +1,26 @@ +# +# 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. + +from pecan import rest +from wsme import types as wtypes + +from apigateway.api.controllers.v1 import controller as v1_controller +from apigateway.api import expose + + +class RootController(rest.RestController): + v1 = v1_controller.V1Controller() + + @expose.expose(wtypes.text) + def get(self): + return "apigateway" diff --git a/apigateway/apigateway/api/controllers/v1/__init__.py b/apigateway/apigateway/api/controllers/v1/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/api/controllers/v1/__init__.py diff --git a/apigateway/apigateway/api/controllers/v1/controller.py b/apigateway/apigateway/api/controllers/v1/controller.py new file mode 100644 index 0000000..79b529b --- /dev/null +++ b/apigateway/apigateway/api/controllers/v1/controller.py @@ -0,0 +1,26 @@ +# +# 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. + +from pecan import rest +from wsme import types as wtypes + +from apigateway.api.controllers.v1 import users as v1_users +from apigateway.api import expose + + +class V1Controller(rest.RestController): + users = v1_users.UsersController() + + @expose.expose(wtypes.text) + def get(self): + return 'apigateway v1controller' diff --git a/apigateway/apigateway/api/controllers/v1/users.py b/apigateway/apigateway/api/controllers/v1/users.py new file mode 100644 index 0000000..8cd2345 --- /dev/null +++ b/apigateway/apigateway/api/controllers/v1/users.py @@ -0,0 +1,81 @@ +# +# 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 pecan +from pecan import request +from pecan import rest +from wsme import types as wtypes + +from apigateway.api import expose + + +class User(wtypes.Base): + id = int + user_id = wtypes.text + name = wtypes.text + email = wtypes.text + + +class Users(wtypes.Base): + users = [User] + + +class UserController(rest.RestController): + + def __init__(self, user_id): + self.user_id = int(user_id) + + @expose.expose(User) + def get(self): + user_info = { + 'id': self.user_id, + 'name': 'parser', + } + return User(**user_info) + + @expose.expose(User, body=User) + def put(self, user): + user_info = { + 'id': self.user_id, + 'name': user.name, + } + return User(**user_info) + + @expose.expose() + def delete(self): + print('Delete user_id: %s' % self.user_id) + + +class UsersController(rest.RestController): + + @pecan.expose() + def _lookup(self, user_id, *remainder): + return UserController(user_id), remainder + + @expose.expose(Users) + def get(self): + db_conn = request.db_conn + users = db_conn.list_users() + users_list = [] + for user in users: + u = User() + u.id = user.id + u.user_id = user.user_id + u.name = user.name + u.email = user.email + users_list.append(u) + return Users(users=users_list) + + @expose.expose(None, body=User, status_code=201) + def post(self, user): + print(user) diff --git a/apigateway/apigateway/api/expose.py b/apigateway/apigateway/api/expose.py new file mode 100644 index 0000000..db30569 --- /dev/null +++ b/apigateway/apigateway/api/expose.py @@ -0,0 +1,22 @@ +# +# 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 wsmeext.pecan as wsme_pecan + + +def expose(*args, **kwargs): + """Ensure that only JSON, and not XML, is supported.""" + if 'rest_content_types' not in kwargs: + kwargs['rest_content_types'] = ('json',) + + return wsme_pecan.wsexpose(*args, **kwargs) diff --git a/apigateway/apigateway/api/hooks.py b/apigateway/apigateway/api/hooks.py new file mode 100644 index 0000000..03cbd9e --- /dev/null +++ b/apigateway/apigateway/api/hooks.py @@ -0,0 +1,23 @@ +# +# 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. + +from pecan import hooks + +from apigateway.db import api as db_api + + +class DBHook(hooks.PecanHook): + """Create a db connection instance before a request handle.""" + + def before(self, state): + state.request.db_conn = db_api.Connection() diff --git a/apigateway/apigateway/cmd/api.py b/apigateway/apigateway/cmd/api.py new file mode 100644 index 0000000..dfdc1dc --- /dev/null +++ b/apigateway/apigateway/cmd/api.py @@ -0,0 +1,30 @@ +# +# 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. + +from wsgiref import simple_server + +from apigateway.api import app + + +def main(): + host = '0.0.0.0' + port = 8080 + + application = app.setup_app() + srv = simple_server.make_server(host, port, application) + + srv.serve_forever() + + +if __name__ == '__main__': + main() diff --git a/apigateway/apigateway/db/__init__.py b/apigateway/apigateway/db/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/db/__init__.py diff --git a/apigateway/apigateway/db/api.py b/apigateway/apigateway/db/api.py new file mode 100644 index 0000000..908a99b --- /dev/null +++ b/apigateway/apigateway/db/api.py @@ -0,0 +1,77 @@ +# +# 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. + +from sqlalchemy import create_engine +import sqlalchemy.orm +from sqlalchemy.orm import exc + +from apigateway.db import models as db_models + + +_ENGINE = None +_SESSION_MAKER = None + + +def get_engine(): + global _ENGINE + if _ENGINE is not None: + return _ENGINE + + _ENGINE = create_engine('sqlite:///webdemo.db') + return _ENGINE + + +def get_session_maker(engine): + global _SESSION_MAKER + if _SESSION_MAKER is not None: + return _SESSION_MAKER + + _SESSION_MAKER = sqlalchemy.orm.sessionmaker(bind=engine) + return _SESSION_MAKER + + +def get_session(): + engine = get_engine() + maker = get_session_maker(engine) + session = maker() + + return session + + +class Connection(object): + + def __init__(self): + pass + + def get_user(self, user_id): + query = get_session().query(db_models.User).filter_by(user_id=user_id) + try: + user = query.one() + except exc.NoResultFound: + # TODO(developer): process this situation + pass + + return user + + def list_users(self): + session = get_session() + query = session.query(db_models.User) + users = query.all() + + return users + + def update_user(self, user): + pass + + def delete_user(self, user): + pass diff --git a/apigateway/apigateway/db/models.py b/apigateway/apigateway/db/models.py new file mode 100644 index 0000000..96fba77 --- /dev/null +++ b/apigateway/apigateway/db/models.py @@ -0,0 +1,32 @@ +# +# 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. + +from sqlalchemy import Column, Integer, String +from sqlalchemy.ext import declarative +from sqlalchemy import Index + + +Base = declarative.declarative_base() + + +class User(Base): + """User table""" + + __tablename__ = 'user' + __table_args__ = ( + Index('ix_user_user_id', 'user_id'), + ) + id = Column(Integer, primary_key=True) + user_id = Column(String(255), nullable=False) + name = Column(String(64), nullable=False, unique=True) + email = Column(String(255)) diff --git a/apigateway/apigateway/db/sqlalchemy/alembic.ini b/apigateway/apigateway/db/sqlalchemy/alembic.ini new file mode 100644 index 0000000..63fd682 --- /dev/null +++ b/apigateway/apigateway/db/sqlalchemy/alembic.ini @@ -0,0 +1,69 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = alembic + +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# max length of characters to apply to the +# "slug" field +#truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; this defaults +# to alembic/versions. When using multiple version +# directories, initial revisions must be specified with --version-path +# version_locations = %(here)s/bar %(here)s/bat alembic/versions + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +# sqlalchemy.url = driver://user:pass@localhost/dbname +sqlalchemy.url = sqlite:///../../../parser.db + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/apigateway/apigateway/db/sqlalchemy/alembic/README b/apigateway/apigateway/db/sqlalchemy/alembic/README new file mode 100644 index 0000000..98e4f9c --- /dev/null +++ b/apigateway/apigateway/db/sqlalchemy/alembic/README @@ -0,0 +1 @@ +Generic single-database configuration.
\ No newline at end of file diff --git a/apigateway/apigateway/db/sqlalchemy/alembic/env.py b/apigateway/apigateway/db/sqlalchemy/alembic/env.py new file mode 100644 index 0000000..c1d6706 --- /dev/null +++ b/apigateway/apigateway/db/sqlalchemy/alembic/env.py @@ -0,0 +1,83 @@ +# +# 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. + +from __future__ import with_statement +from alembic import context +from sqlalchemy import engine_from_config, pool +from logging.config import fileConfig + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +target_metadata = None + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=target_metadata, literal_binds=True) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + connectable = engine_from_config( + config.get_section(config.config_ini_section), + prefix='sqlalchemy.', + poolclass=pool.NullPool) + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=target_metadata + ) + + with context.begin_transaction(): + context.run_migrations() + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/apigateway/apigateway/db/sqlalchemy/alembic/script.py.mako b/apigateway/apigateway/db/sqlalchemy/alembic/script.py.mako new file mode 100644 index 0000000..43c0940 --- /dev/null +++ b/apigateway/apigateway/db/sqlalchemy/alembic/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/apigateway/apigateway/db/sqlalchemy/alembic/versions/6acdba136829_create_user_table.py b/apigateway/apigateway/db/sqlalchemy/alembic/versions/6acdba136829_create_user_table.py new file mode 100644 index 0000000..962e76a --- /dev/null +++ b/apigateway/apigateway/db/sqlalchemy/alembic/versions/6acdba136829_create_user_table.py @@ -0,0 +1,43 @@ +# +# 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. + +"""Create user table + +Revision ID: 6acdba136829 +Revises: +Create Date: 2017-01-22 9:18:09.967362 + +""" + +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '6acdba136829' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + 'user', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('user_id', sa.String(255), nullable=False), + sa.Column('name', sa.String(64), nullable=False, unique=True), + sa.Column('email', sa.String(255)) + ) + + +def downgrade(): + op.drop_table('user') diff --git a/apigateway/apigateway/grpc/__init__.py b/apigateway/apigateway/grpc/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/grpc/__init__.py diff --git a/apigateway/apigateway/grpc/tosca2heat/__init__.py b/apigateway/apigateway/grpc/tosca2heat/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/grpc/tosca2heat/__init__.py diff --git a/apigateway/apigateway/grpc/tosca2heat/model.py b/apigateway/apigateway/grpc/tosca2heat/model.py new file mode 100644 index 0000000..cdf6612 --- /dev/null +++ b/apigateway/apigateway/grpc/tosca2heat/model.py @@ -0,0 +1,15 @@ +# +# 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. + +# from apigateway.grpc.tosca2heat.common_pb2 import * +print(__file__) diff --git a/apigateway/apigateway/grpc/verigraph/__init__.py b/apigateway/apigateway/grpc/verigraph/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/grpc/verigraph/__init__.py diff --git a/apigateway/apigateway/grpc/verigraph/model.py b/apigateway/apigateway/grpc/verigraph/model.py new file mode 100644 index 0000000..c92c44a --- /dev/null +++ b/apigateway/apigateway/grpc/verigraph/model.py @@ -0,0 +1,15 @@ +# +# 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. + +# from apigateway.grpc.verigraph.common_pb2 import * +print(__file__) diff --git a/apigateway/apigateway/testes/__init__.py b/apigateway/apigateway/testes/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/testes/__init__.py |