diff --git a/README.md b/README.md index c0760e0445cdc89874087047a449f7837894dbee..4d98b72f05e40301ed2a9646e70e22669e268c4d 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,57 @@ resource management tooling & experiments -TODO ... + + +## running locally + +*this is a quick setup version for running +standalone on your local machine (will be +merged into the full docs later)* + +### database setup + + * set the value of `sqlalchemy.url` + in `alembic.ini` to point to a writeable file, e.g. + ```python + sqlalchemy.url = sqlite:////absolute/path/to/foo.db + ``` + * create the database by running the alembic + migration from the top-level directory + ```bash + alembic upgrade head + ``` + +### running the app + + + * create a settings filename + (see `config-example.json` for an example) ... something like: + ```json + { + "db": "sqlite:////tmp/test.db", + "ssh": { + "username": "ro-username", + "private-key": "/absolute/path/to/private/key" + } + } + ``` + * run the app like this + (`app.py` starts the server on port 44444): + ```bash + SETTINGS_FILENAME=/absolute/path/to/config.json python -m resource_management.app + ``` + +### examples + + * get the version + ```bash + curl http://localhost:44444/api/version + ``` + * load interfaces from a router + ```bash + curl -X POST http://localhost:44444/api/initialize-router/router.host.name + ``` + * view the docs by loading `http://localhost:44444/docs` + in your browser (there are requests for reserving + lags and physical lag interfaces) diff --git a/config-example.json b/config-example.json new file mode 100644 index 0000000000000000000000000000000000000000..a3181baefdae7eafdab12a4fb0898b144c8db443 --- /dev/null +++ b/config-example.json @@ -0,0 +1,7 @@ +{ + "db": "sqlite:////tmp/test.db", + "ssh": { + "username": "ro-username", + "private-key": "/absolute/path/to/private/key" + } +} \ No newline at end of file diff --git a/resource_management/alembic.ini b/resource_management/alembic.ini index 01d7a46c79aea3b4c60203d6572783ccf26a3067..0aad7a6e5e6cd079ffb64a6c68f290e6dcec4973 100644 --- a/resource_management/alembic.ini +++ b/resource_management/alembic.ini @@ -3,5 +3,7 @@ # make sure the right line is un / commented depending on which schema you want # a migration for script_location = migrations -# change this to run migrations from the command line -sqlalchemy.url = mysql://dummy:dummy-pass@localhost/resources_test +sqlalchemy.url = sqlite:////absolute/path/to/foo.db +sqlalchemy.url = sqlite:////Users/reid/workspace/nat/resource-management/resource_management/foo.db +# or here is an example of a mysql dsn +# sqlalchemy.url = mysql://dummy:dummy-pass@localhost/resources_db_name diff --git a/resource_management/app.py b/resource_management/app.py new file mode 100644 index 0000000000000000000000000000000000000000..47da1ce6f81f0a107ba43a3b7c2e91407b2034a5 --- /dev/null +++ b/resource_management/app.py @@ -0,0 +1,14 @@ +""" +default app creation +""" +import resource_management + +app = resource_management.create_app() + +if __name__ == "__main__": + import uvicorn + uvicorn.run( + 'resource_management.app:app', + host='0.0.0.0', + port=44444, + log_level='debug') diff --git a/resource_management/db/__init__.py b/resource_management/db/__init__.py index 661cc76cc4d2782824633e99f7657199429a790b..f833291783cebe323040785a6a64ec11b659c7ce 100644 --- a/resource_management/db/__init__.py +++ b/resource_management/db/__init__.py @@ -38,8 +38,9 @@ def init_db_model(dsn): # cf. https://docs.sqlalchemy.org/en # /latest/orm/extensions/automap.html - engine = create_engine( - dsn, pool_size=10, pool_recycle=3600) + engine = create_engine(dsn) + # engine = create_engine( + # dsn, pool_size=10, pool_recycle=3600) # engine = create_engine( # dsn, pool_size=10, max_overflow=0, pool_recycle=3600) diff --git a/resource_management/migrations/versions/1983660b3e64_create_initial_tables.py b/resource_management/migrations/versions/1983660b3e64_create_initial_tables.py deleted file mode 100644 index ed1d804cf7bc6c1e4eac001bc00d54163a6f0066..0000000000000000000000000000000000000000 --- a/resource_management/migrations/versions/1983660b3e64_create_initial_tables.py +++ /dev/null @@ -1,67 +0,0 @@ -"""create initial tables - -Revision ID: 1983660b3e64 -Revises: -Create Date: 2022-12-18 14:16:34.695912 - -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '1983660b3e64' -down_revision = None -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.create_table( - 'nodes', - sa.Column('id', sa.Integer, primary_key=True), - sa.Column('fqdn', sa.String(256), nullable=False)) - - op.create_table( - 'line_cards', - sa.Column('id', sa.Integer, primary_key=True), - sa.Column('slot', sa.Integer, nullable=False), - sa.Column('model', sa.String(256), nullable=False), - sa.Column('serial', sa.String(256), nullable=False), - sa.Column('description', sa.String(256), nullable=False), - sa.Column( - 'node_id', - sa.Integer, - sa.ForeignKey('nodes.id'), - nullable=False)) - - op.create_table( - 'ports', - sa.Column('id', sa.Integer, primary_key=True), - sa.Column('pic', sa.Integer, nullable=False), - sa.Column('position', sa.Integer, nullable=False), - sa.Column('interface', sa.String(256), nullable=True), - sa.Column('cable', sa.String(256), nullable=True), - sa.Column('cable', sa.String(256), nullable=True), - sa.Column( - 'line_card_id', - sa.Integer, - sa.ForeignKey('line_cards.id'), - nullable=False)) - - op.create_table( - 'port_speed_capabilities', - sa.Column('id', sa.Integer, primary_key=True), - sa.Column('speed', sa.String(256), nullable=True), - sa.Column( - 'port_id', - sa.Integer, - sa.ForeignKey('ports.id'), - nullable=False)) - - -def downgrade() -> None: - op.drop_table('port_speed_capabilities') - op.drop_table('ports') - op.drop_table('line_cards') - op.drop_table('nodes') diff --git a/resource_management/migrations/versions/1ec562888fd6_initial_tables.py b/resource_management/migrations/versions/1ec562888fd6_initial_tables.py new file mode 100644 index 0000000000000000000000000000000000000000..34fabf1e874ca1b34843a80e0ba8191231373b9e --- /dev/null +++ b/resource_management/migrations/versions/1ec562888fd6_initial_tables.py @@ -0,0 +1,74 @@ +"""initial tables + +Revision ID: 1ec562888fd6 +Revises: N/A +Create Date: 2023-03-20 07:05:18.984767 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '1ec562888fd6' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade() -> None: + + op.create_table( + 'routers', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('fqdn', sa.String(256), nullable=False)) + + op.create_table( + 'lags', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('name', sa.String, nullable=False), + sa.Column( + 'availability', + sa.Enum('AVAILABLE', 'USED', 'RESERVED', name='lag_availability'), + nullable=False), + sa.Column( + 'router_id', + sa.Integer, + sa.ForeignKey('routers.id'), + nullable=False)) + + op.create_table( + 'physical_interfaces', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('name', sa.String, nullable=False), + sa.Column( + 'availability', + sa.Enum('AVAILABLE', 'USED', 'RESERVED', name='lag_availability'), + nullable=False), + sa.Column( + 'router_id', + sa.Integer, + sa.ForeignKey('routers.id'), + nullable=False), + sa.Column( + 'lag_id', + sa.Integer, + sa.ForeignKey('lags.id'), + nullable=True)) + + op.create_table( + 'logical_interfaces', + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('name', sa.String, nullable=False), + sa.Column( + 'physical_id', + sa.Integer, + sa.ForeignKey('physical_interfaces.id'), + nullable=False)) + + +def downgrade() -> None: + op.drop_table('logical_interfaces') + op.drop_table('physical_interfaces') + op.drop_table('lags') + op.drop_table('routers')