Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
220 changes: 220 additions & 0 deletions OpenStack-accounting/.gitignore
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
35 changes: 35 additions & 0 deletions OpenStack-accounting/Dockerfile
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
Comment on lines +1 to +2

Copy link
Copy Markdown
Contributor

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?

Copy link
Copy Markdown
Collaborator Author

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


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"]
104 changes: 104 additions & 0 deletions OpenStack-accounting/README.md
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
Comment thread
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

```
2 changes: 0 additions & 2 deletions OpenStack-accounting/etc/thecount/thecount.conf.example

This file was deleted.

Loading