#!/usr/bin/env python # coding: utf-8 # ## OU Container Builder YAML Configuration File builder # # 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 # In[4]: #%pip install schema # In[134]: from schema import Schema, SchemaError, Optional, Regex, Or import yaml # In[184]: 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 """ # In[185]: # 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_) # In[186]: configuration = yaml.safe_load(full_test_yaml) try: oucb_schema.validate(configuration) print("Configuration is valid.") except SchemaError as se: #raise se print(se) # In[ ]: # In[ ]: