Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
6d4c0fd
update terraform version
gaganso Aug 24, 2025
054cc9d
update azurerm provider and remove unnecessary providers
gaganso Aug 24, 2025
0c16657
updating to pessimistic constraint operator to better manage versions
gaganso Aug 24, 2025
fd3c3d1
Update privileges required for resource creation
gaganso Aug 24, 2025
ba4ac51
Merge branch 'terraform' of https://github.com/microsoft/AIOpsLab int…
gaganso Aug 24, 2025
21a165f
updated gitignore
gaganso Sep 21, 2025
5fc2b3b
support dynamic cluster size and update the terraform scripts
gaganso Sep 21, 2025
f828600
skip provider registration
gaganso Sep 21, 2025
139ec2c
explain different scenarios for registering providers
gaganso Sep 21, 2025
c66c519
updated the scripts to use existing resource group
gaganso Sep 22, 2025
d40f9e1
Fix Helm.status argument mismatch in Prometheus telemetry
Rahuldrabit Jan 10, 2026
794a766
Fix Helm release check for Prometheus by using lowercase release name
Rahuldrabit Jan 10, 2026
5718fe9
Initial plan
Copilot Jan 14, 2026
021e184
Refactor pod readiness polling to use wait_for_ready helper
Copilot Jan 14, 2026
d9796bd
Bump pyasn1 from 0.6.1 to 0.6.2
dependabot[bot] Jan 16, 2026
504654c
add default path for ssh files
Jan 16, 2026
5daa4f7
Merge pull request #134 from microsoft/dependabot/pip/pyasn1-0.6.2
gaganso Jan 20, 2026
253c546
Merge pull request #129 from microsoft/copilot/refactor-pod-readiness…
HacksonClark Jan 22, 2026
4ab7c2a
Bump sentencepiece from 0.2.0 to 0.2.1
dependabot[bot] Jan 22, 2026
e9f6bc0
Merge pull request #135 from microsoft/dependabot/pip/sentencepiece-0…
gaganso Jan 26, 2026
5d45dee
Bump python-multipart from 0.0.20 to 0.0.22
dependabot[bot] Jan 26, 2026
540f177
Merge pull request #137 from microsoft/dependabot/pip/python-multipar…
gaganso Jan 29, 2026
c8e906c
Add early check for missing helm chart paths with submodule hint
Jan 29, 2026
383cca2
add conntrack package
Jan 30, 2026
1d880da
ansible changes for terraform integration
Jan 30, 2026
7e25919
Terraform NSG and output improvements - restricted to corpnet by defa…
Jan 30, 2026
dcd95d6
Update gitignore and poetry lock file
Jan 30, 2026
a023219
Merge branch 'main' into fix/prometheus-helm-status
HacksonClark Feb 4, 2026
706cd38
Merge pull request #126 from Rahuldrabit/fix/prometheus-helm-status
HacksonClark Feb 4, 2026
6844709
Terraform and Ansible deployment improvements
Feb 4, 2026
9f3d542
Bump protobuf from 6.31.1 to 6.33.5
dependabot[bot] Feb 5, 2026
a56bb5d
Merge pull request #139 from microsoft/dependabot/pip/protobuf-6.33.5
HacksonClark Feb 5, 2026
9668d98
Add CLAUDE.md and clean up .gitignore
Feb 10, 2026
e8bb6f7
Merge pull request #140 from microsoft/add-claude-md
gaganso Feb 11, 2026
6a5fe92
Bump pillow from 11.3.0 to 12.1.1
dependabot[bot] Feb 11, 2026
6a92353
Merge pull request #141 from microsoft/dependabot/pip/pillow-12.1.1
HacksonClark Feb 11, 2026
95c165e
Replace poetry shell with eval $(poetry env activate)
Feb 17, 2026
81b9d54
Make NSG source address a configurable Terraform variable
Feb 17, 2026
d3cb5b1
Overhaul deploy.py with auto-install, Mode B setup, and --allowed-ips
Feb 17, 2026
8652dcd
Update terraform README for deploy.py changes and Mode A/B
Feb 17, 2026
4e36592
Consolidate CLAUDE.md Azure deployment section
Feb 17, 2026
06eaaac
Fix helm chart path check for remote repo charts
Feb 18, 2026
3adffc7
Merge remote-tracking branch 'origin/main' into terraform
Feb 18, 2026
0f67d18
Fix terraform README: broken links, wrong flags, stale references
Feb 18, 2026
f595889
Fix CLAUDE.md NSG description to match actual defaults
Feb 18, 2026
0d0eb9d
Fix Ansible security: file permissions and token logging
Feb 18, 2026
64520a8
Fix helm.py upgrade and remove unused Terraform resources
Feb 18, 2026
15e14a3
Add kubectl SHA256 checksum verification in deploy.py
Feb 18, 2026
26756be
Fix kubectl.py to support non-kind kubeconfig contexts
Feb 18, 2026
2541e06
Downgrade Prometheus "not found" log from ERROR to WARNING
Feb 18, 2026
e35c20d
Fix kubectl.py context: treat localhost as non-kind cluster
Feb 23, 2026
2f8d9c8
Add Ansible playbook and template for Mode A setup
Feb 23, 2026
6bcc8dd
Add Mode A deployment, --setup-only, and --dev flags to deploy.py
Feb 23, 2026
a712ecf
feat(clients): add GenericOpenAIClient for any OpenAI Responses API e…
srmanda-cs Feb 24, 2026
aa16259
feat(clients): add GenericOpenAIAgent using GenericOpenAIClient
srmanda-cs Feb 24, 2026
3f65e90
feat(clients): register GenericOpenAIAgent in AgentRegistry
srmanda-cs Feb 24, 2026
3ecefb8
docs(clients): document GenericOpenAIAgent and its configuration
srmanda-cs Feb 24, 2026
27ecf69
chore(env): add OPENAI_COMPATIBLE_API_KEY, BASE_URL, and MODEL to .en…
srmanda-cs Feb 24, 2026
c8696c2
fix(clients): switch GenericOpenAIClient to chat.completions API for …
srmanda-cs Feb 24, 2026
3b1cc96
fix(clients): increase GenericOpenAIClient default max_tokens to 1600…
srmanda-cs Feb 24, 2026
1b5764b
fix: replace stale Responses API refs with correct OpenAI Chat Comple…
srmanda-cs Feb 24, 2026
7eb09d0
Update clients/utils/llm.py
srmanda-cs Feb 25, 2026
daa7961
Merge pull request #145 from srmanda-cs/feature/generic-openai-client
gaganso Feb 25, 2026
7ac4b6e
Update scripts/terraform/deploy.py
gaganso Feb 25, 2026
629537b
chore(clients): correct type annotations across clients
srmanda-cs Feb 25, 2026
81bee7f
Merge pull request #147 from srmanda-cs/chore/corrected-type-annotations
gaganso Feb 25, 2026
b8fea15
chore(clients): convert anew exception raises to preserve stack trace
srmanda-cs Feb 25, 2026
64b77c8
Clean up helm.py, deploy.py, and generate_inventory.py
Feb 24, 2026
f11193b
Address Copilot review: remove --disable-host-key-checking, harden de…
Feb 26, 2026
2a85a37
Update docs: Mode A auto-setup, new CLI flags, align Mode A/B termino…
Feb 26, 2026
45723bb
Merge pull request #143 from microsoft/terraform
gaganso Feb 26, 2026
088f4d8
build(deps): declare implicit core deps and add optional client group
srmanda-cs Feb 26, 2026
a8697ea
test(integration): add no-op hotel-reservation end-to-end smoke test
srmanda-cs Feb 26, 2026
83a6c3d
feat(ci): add GitHub Actions integration smoke test workflow
srmanda-cs Feb 26, 2026
3b0c99c
Update tests/integration/smoke_test.py
srmanda-cs Feb 26, 2026
b75acda
Restrict integration test triggers to main branch
srmanda-cs Feb 27, 2026
1113f01
feat(ci): add concurrency control and paths ignore
srmanda-cs Mar 4, 2026
7e98032
Merge pull request #148 from srmanda-cs/chore/exception-and-logging-c…
gaganso Mar 6, 2026
ca1928a
Merge pull request #149 from srmanda-cs/feat/ci-integration-smoke-test
gaganso Mar 6, 2026
430f75a
build(deps): bump pyjwt from 2.10.1 to 2.12.0
dependabot[bot] Mar 13, 2026
92fffd8
build(deps): bump pyasn1 from 0.6.2 to 0.6.3
dependabot[bot] Mar 17, 2026
0c38aec
Merge pull request #153 from microsoft/dependabot/pip/pyasn1-0.6.3
gaganso Mar 17, 2026
3943ba4
build(deps): bump cryptography from 44.0.3 to 46.0.5
dependabot[bot] Mar 17, 2026
65d5a00
Merge pull request #151 from microsoft/dependabot/pip/pyjwt-2.12.0
gaganso Mar 17, 2026
996d2b5
Merge pull request #154 from microsoft/dependabot/pip/cryptography-46…
gaganso Mar 17, 2026
f7aff78
build(deps): bump requests from 2.32.4 to 2.33.0
dependabot[bot] Mar 26, 2026
23eeb46
build(deps): bump cryptography from 46.0.5 to 46.0.6
dependabot[bot] Mar 29, 2026
738e10a
Merge pull request #156 from microsoft/dependabot/pip/cryptography-46…
gaganso Mar 30, 2026
6c38435
Merge pull request #155 from microsoft/dependabot/pip/requests-2.33.0
gaganso Mar 30, 2026
32f51fd
build(deps): bump pygments from 2.19.2 to 2.20.0
dependabot[bot] Mar 30, 2026
2d9199c
build(deps-dev): bump aiohttp from 3.13.3 to 3.13.4
dependabot[bot] Apr 1, 2026
2c5f476
fix: handle None return from get_container_runtime()
Rahuldrabit Apr 4, 2026
fbfa9f5
refactor: improve get_container_runtime timing and error handling
Rahuldrabit Apr 4, 2026
4805c40
Merge pull request #158 from microsoft/dependabot/pip/aiohttp-3.13.4
gaganso Apr 5, 2026
f9493ca
Merge pull request #157 from microsoft/dependabot/pip/pygments-2.20.0
gaganso Apr 5, 2026
3b72835
build(deps-dev): bump aiohttp from 3.13.4 to 3.14.0
dependabot[bot] Jun 3, 2026
5f6e5e4
Handle succeeded pods in readiness wait
Jun 5, 2026
0e8d1fb
Merge pull request #175 from microsoft/dependabot/pip/aiohttp-3.14.0
gaganso Jun 5, 2026
e63cae2
Merge pull request #177 from hydrogenbond007/fix/openebs-ready-succee…
gaganso Jun 5, 2026
ee4d39c
Merge pull request #159 from Rahuldrabit/fix/container-runtime-none-c…
gaganso Jun 5, 2026
fec3ba2
build(deps): bump idna from 3.10 to 3.15
dependabot[bot] Jun 5, 2026
5a1caaf
Merge pull request #174 from microsoft/dependabot/pip/idna-3.15
gaganso Jun 5, 2026
3b0e547
build(deps-dev): bump python-multipart from 0.0.22 to 0.0.27
dependabot[bot] Jun 5, 2026
a61251d
build(deps): bump urllib3 from 2.6.3 to 2.7.0
dependabot[bot] Jun 5, 2026
c6d2114
build(deps): bump gitpython from 3.1.45 to 3.1.50
dependabot[bot] Jun 5, 2026
f449866
build(deps-dev): bump mako from 1.3.10 to 1.3.12
dependabot[bot] Jun 5, 2026
f45e02d
build(deps): bump python-dotenv from 1.1.1 to 1.2.2
dependabot[bot] Jun 5, 2026
4846e01
build(deps): bump pillow from 12.1.1 to 12.2.0
dependabot[bot] Jun 5, 2026
e9fdd99
build(deps): bump cryptography from 46.0.6 to 46.0.7
dependabot[bot] Jun 5, 2026
6e4eb95
Merge pull request #173 from microsoft/dependabot/pip/urllib3-2.7.0
gaganso Jun 5, 2026
7627965
Merge pull request #172 from microsoft/dependabot/pip/gitpython-3.1.50
gaganso Jun 5, 2026
5d4bd3f
Merge pull request #171 from microsoft/dependabot/pip/python-multipar…
gaganso Jun 5, 2026
99c9259
Merge pull request #169 from microsoft/dependabot/pip/mako-1.3.12
gaganso Jun 5, 2026
9b642db
Merge pull request #167 from microsoft/dependabot/pip/python-dotenv-1…
gaganso Jun 5, 2026
cbc7b8f
Merge pull request #164 from microsoft/dependabot/pip/pillow-12.2.0
gaganso Jun 5, 2026
80901cc
Merge pull request #161 from microsoft/dependabot/pip/cryptography-46…
gaganso Jun 5, 2026
b14c08d
build(deps): bump pyjwt from 2.12.0 to 2.13.0 (#181)
dependabot[bot] Aug 13, 2026
1fdba04
build(deps-dev): bump python-multipart from 0.0.27 to 0.0.31 (#182)
dependabot[bot] Aug 13, 2026
a30b1e7
build(deps-dev): bump msgpack from 1.1.1 to 1.2.1 (#184)
dependabot[bot] Aug 13, 2026
14174b1
build(deps): bump pillow from 12.2.0 to 12.3.0 (#188)
dependabot[bot] Aug 13, 2026
3ca4a55
build(deps): bump pyasn1 from 0.6.3 to 0.6.4 (#190)
dependabot[bot] Aug 13, 2026
3536739
build(deps-dev): bump aiohttp from 3.14.0 to 3.14.3 (#194)
dependabot[bot] Aug 13, 2026
b9a814e
build(deps): bump gitpython from 3.1.50 to 3.1.58 (#195)
dependabot[bot] Aug 13, 2026
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
16 changes: 16 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,22 @@ GROQ_API_KEY=your_groq_api_key_here
# OpenRouter Model Selection (optional)
OPENROUTER_MODEL=openai/gpt-4o-mini

# =============================================================================
# GENERIC OPENAI CHAT COMPLETIONS API CLIENT
# =============================================================================

# API key for any OpenAI Chat Completions API compatible endpoint (e.g. Poe)
# Get a Poe API key from: https://creator.poe.com/
OPENAI_COMPATIBLE_API_KEY=your_api_key_here

# Base URL of the target endpoint
# Example for Poe: https://api.poe.com/llm/v1
OPENAI_COMPATIBLE_BASE_URL=https://api.poe.com/llm/v1

# Model name to use via the generic client (default: gpt-4o)
# Example for Poe: MiniMax-Text-01, Claude-3-7-Sonnet, etc.
OPENAI_COMPATIBLE_MODEL=gpt-4o

# Set it to a positive integer(window size in lines) to trim log blocks that only differ in timestamps. This saves input tokens and reduces context length.
# For example, if LOG_TRIM=2, the code will compare every 1 line, and then every 2 lines for duplication.
LOG_TRIM=0
195 changes: 195 additions & 0 deletions .github/workflows/integration-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
name: Integration Smoke Test

# Trigger on every push to main branch and on every pull request to main branch.
# This ensures regressions are caught before merging to main.
on:
push:
branches: ['main']
paths-ignore:
- '**.md'
- '.env.example'
- 'assets/**'
- 'LICENSE.txt'
- 'NOTICE.txt'
- '.github/ISSUE_TEMPLATE/**'
pull_request:
branches: ['main']
paths-ignore:
- '**.md'
- '.env.example'
- 'assets/**'
- 'LICENSE.txt'
- 'NOTICE.txt'
- '.github/ISSUE_TEMPLATE/**'

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
smoke-test:
name: no-op hotel-reservation smoke test
runs-on: ubuntu-latest
# Full cluster setup + app deploy + workload + teardown typically takes 15-25 min.
timeout-minutes: 45

steps:
# -----------------------------------------------------------------------
# 1. Source checkout
# -----------------------------------------------------------------------
- name: Checkout repository (with submodules)
uses: actions/checkout@v4
with:
# aiopslab-applications contains the K8s manifests and Helm charts
# required by the orchestrator to deploy HotelReservation.
submodules: recursive

# -----------------------------------------------------------------------
# 2. Cluster tooling
# kubectl is pre-installed on ubuntu-latest; we only need kind + helm.
# -----------------------------------------------------------------------
- name: Install kind
run: |
# Download to /tmp to avoid colliding with the repo's kind/ directory
curl -Lo /tmp/kind-bin https://kind.sigs.k8s.io/dl/v0.27.0/kind-linux-amd64
chmod +x /tmp/kind-bin
sudo mv /tmp/kind-bin /usr/local/bin/kind
kind version

- name: Install Helm
run: curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# Pre-pull the node image so cluster creation doesn't time out waiting
# for a large Docker pull inside the kind bootstrap.
- name: Pre-pull kind node image
run: docker pull jacksonarthurclark/aiopslab-kind-x86:latest

# OpenEBS Node Disk Manager (NDM) mounts /run/udev into its pod to scan
# block devices. The kind-config-ci.yaml passes this as an extraMount so
# kind places the host path inside the node container. On GitHub-hosted
# runners /run/udev may not exist or may be a socket file, which causes
# kubelet to reject the hostPath mount with "is not a directory". We
# create it as an empty directory before kind cluster creation so the
# mount path type check (Directory) passes.
- name: Prepare /run/udev for OpenEBS NDM
run: sudo mkdir -p /run/udev

- name: Create kind cluster
run: |
kind create cluster \
--config kind/kind-config-x86.yaml \
--wait 120s
kubectl cluster-info
kubectl get nodes

# -----------------------------------------------------------------------
# 2b. Pre-install OpenEBS before pytest
#
# The orchestrator's init_problem() applies the OpenEBS manifest and
# waits with a hard max_wait=300s. On a cold runner the pod images
# (~800 MB) must be pulled from Docker Hub first, which can easily
# exceed 5 minutes and cause a timeout. Pre-installing here lets the
# images pull at their own pace (up to 10 min), so by the time pytest
# calls wait_for_ready("openebs") the pods are already Ready.
# kubectl apply is idempotent so the orchestrator re-applying is fine.
# -----------------------------------------------------------------------
- name: Pre-install OpenEBS
run: |
kubectl apply -f https://openebs.github.io/charts/openebs-operator.yaml
echo "Waiting up to 10 min for OpenEBS pods to be ready (cold image pull)..."
kubectl wait pod --all -n openebs \
--for=condition=Ready \
--timeout=600s
kubectl patch storageclass openebs-hostpath \
-p '{"metadata":{"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
echo "OpenEBS is ready."

# -----------------------------------------------------------------------
# 2c. Pre-install Prometheus before pytest
#
# init_problem() deploys Prometheus via Helm and waits with max_wait=300s.
# On a cold runner, pulling Prometheus + sub-chart images (node-exporter,
# kube-state-metrics, alertmanager, pushgateway) from Docker Hub can
# take 3-6 min, exceeding the 5-minute hard timeout.
#
# Pre-installing here means Prometheus._is_prometheus_running() will
# return True when init_problem() calls Prometheus.deploy(), causing it
# to skip redeployment entirely — wait_for_ready("observe") returns
# immediately.
#
# Chart path mirrors Prometheus.load_service_json():
# BASE_DIR / "observer/prometheus/prometheus/"
# = aiopslab/observer/prometheus/prometheus/
# -----------------------------------------------------------------------
- name: Pre-install Prometheus
run: |
kubectl create namespace observe --dry-run=client -o yaml | kubectl apply -f -
kubectl apply -f aiopslab/observer/prometheus/prometheus-pvc.yml -n observe
helm dependency update aiopslab/observer/prometheus/prometheus/
helm install prometheus aiopslab/observer/prometheus/prometheus/ \
-n observe --create-namespace
echo "Waiting up to 10 min for Prometheus pods to be ready (cold image pull)..."
kubectl wait pod --all -n observe \
--for=condition=Ready \
--timeout=600s
echo "Prometheus is ready."

# -----------------------------------------------------------------------
# 3. Python + dependencies
# -----------------------------------------------------------------------
- name: Set up Python 3.11
uses: actions/setup-python@v5
with:
python-version: '3.11'

- name: Install Poetry
run: pip install poetry

# Install core framework + dev tools; skip heavy ML client packages
# (vllm, flwr, etc.) that need CUDA and are not required for the smoke test.
- name: Install dependencies
run: poetry install --without clients --with dev

# -----------------------------------------------------------------------
# 4. Framework configuration
# config.yml is gitignored; generate it on the fly.
# k8s_host=kind tells the orchestrator to use the local kubeconfig.
# -----------------------------------------------------------------------
- name: Generate aiopslab/config.yml
run: |
cat > aiopslab/config.yml <<'EOF'
k8s_host: kind
k8s_user: runner
ssh_key_path: ~/.ssh/id_rsa
data_dir: data
qualitative_eval: false
print_session: false
EOF

# -----------------------------------------------------------------------
# 5. Run smoke test
# KubeCtl defaults AIOPSLAB_CLUSTER=kind → context=kind-kind, which
# matches the default cluster name created above.
# -----------------------------------------------------------------------
- name: Run integration smoke test
run: poetry run pytest tests/integration/smoke_test.py -v -s -m integration

# -----------------------------------------------------------------------
# 6. Diagnostics on failure
# -----------------------------------------------------------------------
- name: Dump cluster state on failure
if: failure()
run: |
echo "=== All namespaced resources ==="
kubectl get all --all-namespaces
echo "=== Recent events ==="
kubectl get events --all-namespaces --sort-by='.lastTimestamp' | tail -40
kind export logs --name kind /tmp/kind-logs

- name: Upload kind logs on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: kind-logs
path: /tmp/kind-logs
retention-days: 7
Loading
Loading