Simple attempt at a validator for ou-container-builder
YAML configuration file (v3).
Handy docs: https://www.andrewvillazon.com/validate-yaml-python-schema/
Repo: https://github.com/keleshev/schema
#%pip install schema
from schema import Schema, SchemaError, Optional, Regex, Or
import yaml
full_test_yaml="""version: 3
module:
code: TM129
presentation: 23B
image:
base: as
user: as
packs:
jupyterlab: {}
notebook: {}
ipykernel: {}
sources:
apt:
- name: mongodb
key_url: https://www.mongodb.org/static/pgp/server-7.0.asc
dearmor: true
deb:
url: https://repo.mongodb.org/apt/ubuntu
distribution: jammy/mongodb-org/7.0
component: multiverse
server:
access_token: as
default_path: as
packages:
apt:
build:
- gdal-bin
- libgdal-dev
deploy:
- mongodb-org
- postgresql
- openjdk-17-jre
- openjdk-17-jre-headless
- gdal-bin
- libgdal-dev
pip:
system:
- ou-tm351-jl-extensions>=0.2.8
user:
- pymongo
- jupysql
- psycopg2-binary
- pgspecial
- SQLAlchemy
- schemadisplay-magic>=0.0.7
- geopandas
- fiona
- Shapely
- geopy
- folium
- descartes
- pandas
- scipy
- seaborn
- xlrd
- openpyxl
content:
- source: as
target: as
overwrite: always
- source: ./db_setup/mongodb-org/mongod
target: /etc/init.d/mongod
overwrite: always
- source: ./db_setup/mongodb-org/mongod.conf
target: /etc/mongod.conf
overwrite: always
- source: asa
target: as
overwrite: always
- source: ./icons/openrefine.svg
target: /var/ou/icons/openrefine.svg
overwrite: always
environment:
- name: MONGO_DB_PATH
value: /var/db/data/mongo
- name: PG_VERSION
value: '15'
- name: PGDATA
value: /var/lib/postgresql/$PG_VERSION/main
- name: POSTGRES_USER
value: postgres
- name: POSTGRES_PASSWORD
value: postgres
- name: POSTGRES_DB
value: oudb
- name: PLOOMBER_STATS_ENABLED
value: 'false'
- name: PLOOMBER_VERSION_CHECK_DISABLED
value: 'false'
- name: OPENREFINE_VERSION
value: 3.8.0
- name: OPENREFINE_PATH
value: /var/openrefine
scripts:
- stage: deploy
commands: >-
chmod ugo+rx /etc/init.d/mongod,cp -p /etc/mongod.conf
/etc/ouseful/mongod.conf,chmod u-w /etc/ouseful/mongod.conf
- stage: deploy
commands: >-
sed -e "s/[#]?listen_addresses = .*/listen_addresses = '*'/g" -i
"/etc/postgresql/$PG_VERSION/main/postgresql.conf",usermod -aG users
postgres
- stage: build
commands: >-
wget -q -O openrefine-${OPENREFINE_VERSION}.tar.gz
https://github.com/OpenRefine/OpenRefine/releases/download/${OPENREFINE_VERSION}/openrefine-linux-${OPENREFINE_VERSION}.tar.gz,tar
xzf openrefine-${OPENREFINE_VERSION}.tar.gz,mv
openrefine-${OPENREFINE_VERSION} $OPENREFINE_PATH
output_blocks:
deploy:
- block: COPY --from=base /var/openrefine /var/openrefine
weight: 2333
web_apps:
- path: openrefine
options:
command:
- /var/openrefine/refine
- '-i'
- 127.0.0.1
- '-p'
- '{port}'
- '-d'
- /home/ou/TM351-24J/openrefine
- '-H'
- '*'
- '-x'
- refine.display.new.version.notice=false
timeout: '120'
launcher:
enabled: false
services:
- mongod
- postgresql
"""
# Need to schemas - one for the full schema, another for partial schema
# In the partial schema validation, all elements optional?
oucb_schema_ = {"version": int,
"module": {"code":Regex(r'[A-M]{1,5}\d{3}$'),
"presentation": Regex(r'^\d{2}[A-M]$')},
"image":{
"base": str,
"user": str
},
"packs": {Optional("jupyterlab"): dict,
Optional("notebook"): dict,
Optional("ipykernel"): dict,
Optional("irkernel"): dict,
Optional("code_server"): dict,
Optional("xfce4"): dict,
},
Optional("sources"): {Optional("apt"): [{"name":str, "key_url": str, "dearmor": bool,
"deb": {"url": str, "distribution": str, "component": str}}]},
Optional("server"): {"access_token": str, "default_path": str},
Optional("packages"): { Optional("apt"):
{
Optional("build"): list,
Optional("deploy"): list
},
Optional("pip"): {Optional("system"): list, Optional("user"): list}
},
Optional("content"): [{"source": str, "target":str, "overwrite":Or("always", "never")}],
Optional("environment"): [{"name":str, "value":str}],
Optional("scripts"): [{"stage": Or("build", "deploy"), "commands": str}],
Optional("output_blocks"): {
Optional("build"): [{"block":str, "weight":int}],
Optional("deploy"): [{"block":str, "weight":int}]
},
Optional("web_apps"): [{
"path": str, "options":{"command": list, "timeout": Or(str, int)},
Optional("launcher"): {Optional("title"): str,
Optional("icon_path"): str,
Optional("enabled"): bool},
}],
Optional("services"): list
}
oucb_schema = Schema(oucb_schema_)
configuration = yaml.safe_load(full_test_yaml)
try:
oucb_schema.validate(configuration)
print("Configuration is valid.")
except SchemaError as se:
#raise se
print(se)
Configuration is valid.