{"id":46563672,"url":"https://github.com/tosin2013/jupyter-notebook-validator-operator","last_synced_at":"2026-03-07T06:31:27.914Z","repository":{"id":323125427,"uuid":"1092204858","full_name":"tosin2013/jupyter-notebook-validator-operator","owner":"tosin2013","description":"A Kubernetes-native operator that automates Jupyter Notebook validation in MLOps workflows. Built with Operator SDK and Go, it provides Git integration, pod orchestration for notebook execution, golden notebook comparison for regression testing, and model-aware validation for ML/AI workloads.","archived":false,"fork":false,"pushed_at":"2026-01-25T01:57:38.000Z","size":5647,"stargazers_count":1,"open_issues_count":6,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-25T12:15:07.235Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tosin2013.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/CONTRIBUTING_MODEL_PLATFORMS.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-08T07:27:18.000Z","updated_at":"2026-01-25T01:57:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tosin2013/jupyter-notebook-validator-operator","commit_stats":null,"previous_names":["tosin2013/jupyter-notebook-validator-operator"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/tosin2013/jupyter-notebook-validator-operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tosin2013%2Fjupyter-notebook-validator-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tosin2013%2Fjupyter-notebook-validator-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tosin2013%2Fjupyter-notebook-validator-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tosin2013%2Fjupyter-notebook-validator-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tosin2013","download_url":"https://codeload.github.com/tosin2013/jupyter-notebook-validator-operator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tosin2013%2Fjupyter-notebook-validator-operator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30209086,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T05:23:27.321Z","status":"ssl_error","status_checked_at":"2026-03-07T05:00:17.256Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-03-07T06:31:27.198Z","updated_at":"2026-03-07T06:31:27.899Z","avatar_url":"https://github.com/tosin2013.png","language":"Go","funding_links":[],"categories":["Kubernetes Operators"],"sub_categories":[],"readme":"# Jupyter Notebook Validator Operator\n\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n[![Go Report Card](https://goreportcard.com/badge/github.com/tosin2013/jupyter-notebook-validator-operator)](https://goreportcard.com/report/github.com/tosin2013/jupyter-notebook-validator-operator)\n[![CI](https://github.com/tosin2013/jupyter-notebook-validator-operator/actions/workflows/ci.yml/badge.svg)](https://github.com/tosin2013/jupyter-notebook-validator-operator/actions/workflows/ci.yml)\n[![Tier 1 Tests](https://github.com/tosin2013/jupyter-notebook-validator-operator/actions/workflows/ci-unit-tests.yaml/badge.svg)](https://github.com/tosin2013/jupyter-notebook-validator-operator/actions/workflows/ci-unit-tests.yaml)\n[![OpenShift](https://img.shields.io/badge/OpenShift-4.18+-red.svg)](https://www.openshift.com/)\n[![Kubernetes](https://img.shields.io/badge/Kubernetes-1.31+-blue.svg)](https://kubernetes.io/)\n\nA Kubernetes-native operator that automates Jupyter Notebook validation in MLOps workflows. Built with Operator SDK and Go, it provides Git integration, pod orchestration for notebook execution, golden notebook comparison for regression testing, and model-aware validation for ML/AI workloads.\n\n## Overview\n\nThe Jupyter Notebook Validator Operator enables automated testing and validation of Jupyter notebooks in Kubernetes and OpenShift environments. It's designed for data science teams, ML engineers, and platform teams who need to ensure notebook reliability, reproducibility, and integration with deployed ML models.\n\n### Key Features\n\n- **🔄 Automated Notebook Execution** - Execute notebooks in isolated Kubernetes pods with Papermill\n- **📊 Golden Notebook Comparison** - Regression testing with cell-by-cell output comparison\n- **🔐 Credential Management** - Secure injection of credentials (AWS, databases, APIs) via Secrets, ESO, or Vault\n- **🤖 Model-Aware Validation** - Validate notebooks against deployed models (KServe, OpenShift AI, vLLM, etc.)\n- **🔍 Git Integration** - Clone notebooks from Git repositories (HTTPS and SSH authentication)\n- **📈 Observability** - Prometheus metrics and structured logging with credential sanitization\n- **🎯 Platform Detection** - Auto-detect model serving platforms (9 platforms supported)\n- **🔒 Security** - RBAC, Pod Security Standards, secret rotation, and audit logging\n\n## Quick Start\n\n### Prerequisites\n\n- **Kubernetes/OpenShift Cluster:** OpenShift 4.18+ (recommended) or Kubernetes 1.31+\n- **Command-line Tools:** kubectl or oc CLI, make (for building from source)\n- **Optional:** External Secrets Operator (ESO), KServe or OpenShift AI, Tekton Pipelines (for build integration)\n\n### Installation\n\n```bash\n# Install CRDs\nmake install\n\n# Build and push image\nmake docker-build docker-push IMG=quay.io/tosin2013/jupyter-notebook-validator-operator:v0.1.0\n\n# Deploy operator\nmake deploy IMG=quay.io/tosin2013/jupyter-notebook-validator-operator:v0.1.0\n```\n\n### Verify Installation\n\n```bash\nkubectl get pods -n jupyter-notebook-validator-operator-system\nkubectl get crd notebookvalidationjobs.mlops.mlops.dev\n```\n\n## Usage Examples\n\nSee [config/samples/](config/samples/) for complete examples.\n\n### Basic Validation\n\n```yaml\napiVersion: mlops.mlops.dev/v1alpha1\nkind: NotebookValidationJob\nmetadata:\n  name: simple-validation\nspec:\n  notebook:\n    git:\n      url: https://github.com/tosin2013/jupyter-notebook-validator-test-notebooks.git\n      ref: main\n    path: notebooks/tier1-simple/01-hello-world.ipynb\n  podConfig:\n    containerImage: quay.io/jupyter/scipy-notebook:latest\n```\n\n### GPU and Specialized Node Scheduling\n\nSchedule validation pods on GPU nodes, high-memory nodes, or spot instances using Kubernetes-native scheduling features:\n\n```yaml\napiVersion: mlops.mlops.dev/v1alpha1\nkind: NotebookValidationJob\nmetadata:\n  name: gpu-training-validation\nspec:\n  notebook:\n    git:\n      url: https://github.com/example/ml-notebooks.git\n      ref: main\n    path: notebooks/gpu-training.ipynb\n  podConfig:\n    containerImage: quay.io/jupyter/pytorch-notebook:cuda-latest\n    resources:\n      limits:\n        nvidia.com/gpu: \"1\"\n        memory: \"16Gi\"\n    # Tolerate GPU node taints\n    tolerations:\n      - key: nvidia.com/gpu\n        operator: Exists\n        effect: NoSchedule\n    # Target GPU nodes\n    nodeSelector:\n      nvidia.com/gpu.present: \"true\"\n    # Advanced affinity rules\n    affinity:\n      nodeAffinity:\n        requiredDuringSchedulingIgnoredDuringExecution:\n          nodeSelectorTerms:\n            - matchExpressions:\n                - key: nvidia.com/gpu.present\n                  operator: In\n                  values: [\"true\"]\n  timeout: \"2h\"\n```\n\nSee [config/samples/mlops_v1alpha1_notebookvalidationjob_gpu_scheduling.yaml](config/samples/mlops_v1alpha1_notebookvalidationjob_gpu_scheduling.yaml) for more examples including:\n- GPU node scheduling with NVIDIA tolerations\n- High-memory node scheduling\n- Spot/preemptible instance scheduling\n- Multi-tenant cluster node pools with pod anti-affinity\n\n## Documentation\n\n- **[Architecture Overview](docs/ARCHITECTURE_OVERVIEW.md)** - System design\n- **[Testing Guide](docs/TESTING_GUIDE.md)** - Testing procedures\n- **[Notebook Credentials Guide](docs/NOTEBOOK_CREDENTIALS_GUIDE.md)** - Credential injection\n- **[Model Discovery Guide](docs/MODEL_DISCOVERY_GUIDE.md)** - Model validation\n- **[Community Platforms](docs/COMMUNITY_PLATFORMS.md)** - Supported platforms\n- **[ADRs](docs/adrs/)** - Architectural decisions\n\n## Supported Platforms\n\n- **Model Serving:** KServe, OpenShift AI, vLLM, TorchServe, TensorFlow Serving, Triton, Ray Serve, Seldon, BentoML\n- **Credential Management:** Kubernetes Secrets, External Secrets Operator (ESO), HashiCorp Vault\n\n## License\n\nCopyright 2025 Tosin Akinosho. Licensed under the Apache License, Version 2.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftosin2013%2Fjupyter-notebook-validator-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftosin2013%2Fjupyter-notebook-validator-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftosin2013%2Fjupyter-notebook-validator-operator/lists"}