-
Notifications
You must be signed in to change notification settings - Fork 12
WIP: rework accounting scripts #288
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
anish-mudaraddi
wants to merge
4
commits into
master
Choose a base branch
from
wip-accounting
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,220 @@ | ||
| # Byte-compiled / optimized / DLL files | ||
| __pycache__/ | ||
| *.py[codz] | ||
| *$py.class | ||
|
|
||
| # C extensions | ||
| *.so | ||
|
|
||
| # Distribution / packaging | ||
| .Python | ||
| build/ | ||
| develop-eggs/ | ||
| dist/ | ||
| downloads/ | ||
| eggs/ | ||
| .eggs/ | ||
| lib/ | ||
| lib64/ | ||
| parts/ | ||
| sdist/ | ||
| var/ | ||
| wheels/ | ||
| share/python-wheels/ | ||
| *.egg-info/ | ||
| .installed.cfg | ||
| *.egg | ||
| MANIFEST | ||
|
|
||
| # PyInstaller | ||
| # Usually these files are written by a python script from a template | ||
| # before PyInstaller builds the exe, so as to inject date/other infos into it. | ||
| *.manifest | ||
| *.spec | ||
|
|
||
| # Installer logs | ||
| pip-log.txt | ||
| pip-delete-this-directory.txt | ||
|
|
||
| # Unit test / coverage reports | ||
| htmlcov/ | ||
| .tox/ | ||
| .nox/ | ||
| .coverage | ||
| .coverage.* | ||
| .cache | ||
| nosetests.xml | ||
| coverage.xml | ||
| *.cover | ||
| *.py.cover | ||
| *.lcov | ||
| .hypothesis/ | ||
| .pytest_cache/ | ||
| cover/ | ||
|
|
||
| # Translations | ||
| *.mo | ||
| *.pot | ||
|
|
||
| # Django stuff: | ||
| *.log | ||
| local_settings.py | ||
| db.sqlite3 | ||
| db.sqlite3-journal | ||
|
|
||
| # Flask stuff: | ||
| instance/ | ||
| .webassets-cache | ||
|
|
||
| # Scrapy stuff: | ||
| .scrapy | ||
|
|
||
| # Sphinx documentation | ||
| docs/_build/ | ||
|
|
||
| # PyBuilder | ||
| .pybuilder/ | ||
| target/ | ||
|
|
||
| # Jupyter Notebook | ||
| .ipynb_checkpoints | ||
|
|
||
| # IPython | ||
| profile_default/ | ||
| ipython_config.py | ||
|
|
||
| # pyenv | ||
| # For a library or package, you might want to ignore these files since the code is | ||
| # intended to run in multiple environments; otherwise, check them in: | ||
| # .python-version | ||
|
|
||
| # pipenv | ||
| # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. | ||
| # However, in case of collaboration, if having platform-specific dependencies or dependencies | ||
| # having no cross-platform support, pipenv may install dependencies that don't work, or not | ||
| # install all needed dependencies. | ||
| # Pipfile.lock | ||
|
|
||
| # UV | ||
| # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. | ||
| # This is especially recommended for binary packages to ensure reproducibility, and is more | ||
| # commonly ignored for libraries. | ||
| # uv.lock | ||
|
|
||
| # poetry | ||
| # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. | ||
| # This is especially recommended for binary packages to ensure reproducibility, and is more | ||
| # commonly ignored for libraries. | ||
| # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control | ||
| # poetry.lock | ||
| # poetry.toml | ||
|
|
||
| # pdm | ||
| # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. | ||
| # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. | ||
| # https://pdm-project.org/en/latest/usage/project/#working-with-version-control | ||
| # pdm.lock | ||
| # pdm.toml | ||
| .pdm-python | ||
| .pdm-build/ | ||
|
|
||
| # pixi | ||
| # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. | ||
| # pixi.lock | ||
| # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one | ||
| # in the .venv directory. It is recommended not to include this directory in version control. | ||
| .pixi/* | ||
| !.pixi/config.toml | ||
|
|
||
| # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm | ||
| __pypackages__/ | ||
|
|
||
| # Celery stuff | ||
| celerybeat-schedule* | ||
| celerybeat.pid | ||
|
|
||
| # Redis | ||
| *.rdb | ||
| *.aof | ||
| *.pid | ||
|
|
||
| # RabbitMQ | ||
| mnesia/ | ||
| rabbitmq/ | ||
| rabbitmq-data/ | ||
|
|
||
| # ActiveMQ | ||
| activemq-data/ | ||
|
|
||
| # SageMath parsed files | ||
| *.sage.py | ||
|
|
||
| # Environments | ||
| .env | ||
| .envrc | ||
| .venv | ||
| env/ | ||
| venv/ | ||
| ENV/ | ||
| env.bak/ | ||
| venv.bak/ | ||
|
|
||
| # Spyder project settings | ||
| .spyderproject | ||
| .spyproject | ||
|
|
||
| # Rope project settings | ||
| .ropeproject | ||
|
|
||
| # mkdocs documentation | ||
| /site | ||
|
|
||
| # mypy | ||
| .mypy_cache/ | ||
| .dmypy.json | ||
| dmypy.json | ||
|
|
||
| # Pyre type checker | ||
| .pyre/ | ||
|
|
||
| # pytype static type analyzer | ||
| .pytype/ | ||
|
|
||
| # Cython debug symbols | ||
| cython_debug/ | ||
|
|
||
| # PyCharm | ||
| # JetBrains specific template is maintained in a separate JetBrains.gitignore that can | ||
| # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore | ||
| # and can be added to the global gitignore or merged into this file. For a more nuclear | ||
| # option (not recommended) you can uncomment the following to ignore the entire idea folder. | ||
| # .idea/ | ||
|
|
||
| # Abstra | ||
| # Abstra is an AI-powered process automation framework. | ||
| # Ignore directories containing user credentials, local state, and settings. | ||
| # Learn more at https://abstra.io/docs | ||
| .abstra/ | ||
|
|
||
| # Visual Studio Code | ||
| # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore | ||
| # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore | ||
| # and can be added to the global gitignore or merged into this file. However, if you prefer, | ||
| # you could uncomment the following to ignore the entire vscode folder | ||
| # .vscode/ | ||
| # Temporary file for partial code execution | ||
| tempCodeRunnerFile.py | ||
|
|
||
| # Ruff stuff: | ||
| .ruff_cache/ | ||
|
|
||
| # PyPI configuration file | ||
| .pypirc | ||
|
|
||
| # Marimo | ||
| marimo/_static/ | ||
| marimo/_lsp/ | ||
| __marimo__/ | ||
|
|
||
| # Streamlit | ||
| .streamlit/secrets.toml |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| # Use Python 3.12 slim image as base | ||
| FROM python:3.12-slim | ||
|
|
||
| WORKDIR /app | ||
|
|
||
| # Install system dependencies if needed | ||
| RUN apt-get update && apt-get install -y \ | ||
| --no-install-recommends ca-certificates\ | ||
| && rm -rf /var/lib/apt/lists/* | ||
|
|
||
| # Parse and report everything in UTC unless the operator overrides it. | ||
| ENV TZ=UTC \ | ||
| PYTHONUNBUFFERED=1 \ | ||
| THE_COUNT_CONFIG_FILE=/etc/thecount/thecount.conf \ | ||
| LOG_LEVEL=INFO \ | ||
| LOG_FILE=/var/log/thecount/thecount.log | ||
|
|
||
| # Python dependencies for the extractors. | ||
| # Copy package files for installation | ||
| COPY pyproject.toml README.md ./ | ||
| COPY thecount/ ./thecount/ | ||
|
|
||
| # Install only the package with core dependencies (no optional dependencies) | ||
| RUN pip install --no-cache-dir . | ||
|
|
||
| # Create a non-root user | ||
| RUN useradd --shell /bin/bash monitoring | ||
| RUN chown -R monitoring:monitoring /app | ||
| USER monitoring | ||
|
|
||
| # Set the entrypoint to your package's main module | ||
| ENTRYPOINT ["python", "-m", "thecount"] | ||
|
|
||
| # Default command (can be overridden) | ||
| CMD ["--help"] | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,104 @@ | ||
| # Thecount - fetch, calculate and store cloud accounting data | ||
|
|
||
| ## Prerequisites | ||
|
|
||
| A VM/system/device with docker installed | ||
| 1. must have access to an Openstack DB - with an accounting user setup - to fetch relevant openstack data. | ||
| User with read access to the relevant databases for each OpenStack component you are accounting for - right now: | ||
| - cinder | ||
| - manila | ||
| - nova | ||
| - glance | ||
|
anish-mudaraddi marked this conversation as resolved.
|
||
|
|
||
| 2. must have access to an influxdb TSDB - for storing parsed accounting data and setup a user with write permissions | ||
|
|
||
| ## Setting up SQL Procedures | ||
|
|
||
| under `sql` folder, several `.sql` files exist that set out SQL procedure code that can be saved onto the database | ||
| and can be executed whenever needed to collect accounting data | ||
|
|
||
| to apply login to mysql: | ||
| `mysql -u admin -p mypass` | ||
| run: | ||
| `USE cinder` | ||
| `SOURCE /sql/cinder_get_accounting_data.sql;` | ||
|
|
||
| make sure you set the correct db before applying the sql file | ||
|
|
||
| Then you need to set permissions for accounting user | ||
| `mysql -u admin -p <pass>` | ||
|
|
||
| create user - repeat for each monitoring node and where `accounting-db` is the user | ||
| `CREATE USER 'accounting-db'@'host.example.com' IDENTIFIED BY 'StrongPasswordHere!';` | ||
|
|
||
| set permissions for each db - repeat for each monitoring node | ||
| `grant ALL on keystone.* to 'accounting-db'@'host.example.com';` | ||
| `grant ALL on nova.* to 'accounting-db'@'host.example.com';` | ||
| `grant ALL on nova_api.* to 'accounting-db'@'host.example.com';` | ||
| `grant ALL on nova_cell0.* to 'accounting-db'@'host.example.com';` | ||
| `grant ALL on cinder.* to 'accounting-db'@'host.example.com';` | ||
| `grant ALL on manila.* to 'accounting-db'@'host.example.com';` | ||
| `grant ALL on glance.* to 'accounting-db'@'host.example.com';` | ||
|
|
||
|
|
||
| ## Installation | ||
|
|
||
| We deploy this with kayobe in our kayobe config repo, but if you want to setup manually you can in two ways | ||
|
|
||
| ### As a container | ||
|
|
||
| ```commandline | ||
| docker build . -t harbor.stfc.ac.uk/stfc-cloud/thecount:v1.0.0 -t harbor.stfc.ac.uk/stfc-cloud/thecount:latest | ||
| docker run | ||
| -v thecount.conf:/etc/thecount/thecount.conf | ||
| -v var/log/thecount/:/var/log/thecount/ | ||
| harbor.stfc.ac.uk/stfc-cloud/thecount:latest --help | ||
| ``` | ||
| run `--help` for args you can pass in and how they work | ||
| see `./thecount.conf.example` for how to create the config file | ||
|
|
||
| ### As a package | ||
|
|
||
| you can install it as a package too | ||
|
|
||
| ```commandline | ||
| python -m venv thecount | ||
| source thecount/bin/activate | ||
| pip install . | ||
| ``` | ||
|
|
||
| then run it as a module | ||
|
|
||
| ``` | ||
| python3 -m thecount --help | ||
|
|
||
| # run on older pre-defined start and end time (midnight to midnight) | ||
| python -m thecount --config-path /etc/thecount/thecount.conf \ | ||
| --start-time 2026-08-27 \ | ||
| --end-time 2026-08-28 \ | ||
| --interval 1440 \ | ||
| --all | ||
|
|
||
| # run using bash date to generate ISO timestamp | ||
| python -m thecount --config-path /etc/thecount/thecount.conf \ | ||
| --start-time $(date +"%Y-%m-%dT%H:%M:%S" -d "yesterday") \ | ||
| --end-time $(date +"%Y-%m-%dT%H:%M:%S") \ | ||
| --jobs cinder \ | ||
| --jobs glance \ | ||
| --interval 360 \ | ||
| --dry-run \ | ||
| --all | ||
|
|
||
| # run continuously starting from older start time (midnight) | ||
| python -m thecount --config-path /etc/thecount/thecount.conf --start-time 2026-08-27 --interval 1440 --all | ||
|
|
||
| # run continuously from current time | ||
| python -m thecount --config-path /etc/thecount/thecount.conf --interval 1440 --all | ||
|
|
||
| # run only cinder job | ||
| python -m thecount --config-path /etc/thecount/thecount.conf --interval 1440 --jobs cinder | ||
|
|
||
| # run cinder and manila job | ||
| python -m thecount --config-path /etc/thecount/thecount.conf --interval 1440 --jobs cinder --jobs manila | ||
|
|
||
| ``` | ||
This file was deleted.
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why was version 3.12 chosen, any reason we couldn't use something newer like 3.14?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I used python3.12 to write the code - hence python:3.12