Skip to content
Open
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
7 changes: 7 additions & 0 deletions python/samples/argocd_install/.env_example
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
model=gpt-4o-mini
AZURE_API_KEY=<your-api-key>
AZURE_API_BASE=https://<your-api-base>.openai.azure.com/
AZURE_API_VERSION=2024-08-01-preview
KUBECONFIG=/workspaces/autogen/python/samples/gitea_install/kubeconfig
REPO_URL=https://github.com/<my-org>/<my-repo>
REPO_PAT=<some-token-ending-with->11AVBLMCI0RB9l4J3GBnAC
40 changes: 40 additions & 0 deletions python/samples/argocd_install/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# ArgoCD Install Example

Agentic installation of ArgoCD on Kubernetes using local Kubectl/Helm CLIs.

## Prerequisites

First, you need a shell with AutoGen core and required dependencies installed.
- Use VSCode to start the DevContainer defined in `/.devcontainer/`.

- Then install Python dependencies:
```bash
pip install "autogen-ext[openai,azure]"
python3 -m pip install python-dotenv
pip install autogen_agentchat playwright
```

## LLM Configuration

The LLM configuration should be defined in a `.env` file.
Use `.env_example.yml` as a template.

## Other Environment Variables

In your `.env` file, also include the following:
- REPO_URL - Git repo used for storing ArgoCD App configs
- REPO_PAT - Token (Fine-grained recommended) for accessing your Git repo at REPO_URL.
- KUBECONFIG - path to your kubeconfig file in the following section

## Kubernetes Configuration

The cluster configuration should be defined in a `kubeconfig` file.
Use `kubeconfig_example` as a template.

## Running the example

- Navigate to `/workspaces/autogen/python/samples/argocd_install/` and execute:

```bash
python main.py
```
22 changes: 22 additions & 0 deletions python/samples/argocd_install/kubeconfig_example
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
apiVersion: v1
kind: Config
clusters:
- name: rancher-desktop
cluster:
#server: https://127.0.0.1:6443
server: https://host.docker.internal:6443
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkakNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUzTXpnd09USTRPVGd3SGhjTk1qVXdNVEk0TVRrek5EVTRXaGNOTXpVd01USTJNVGt6TkRVNApXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUzTXpnd09USTRPVGd3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFUaUZGanRWcXIxY0dIdUlTZjl1ZHRRTE9henlQbUVJaUsvLzZkdjJma3YKZDRXeE8vNlovN0lHbkhZMEQ4aW13dFI4OTVrVjEyNHFXeGNLQlhJMnVJTXRvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVXc0NDRTZmtqb3VtV2Z2Qi9UTVNyClY0VUd3VHd3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnWWRnSXA4bm1DMTltdkp1VnZsU0lkYkxzQitENDd2ZGwKcHVtSWlaUW1SSzhDSURJbW1aQXN6QVMzS1ZSNXlxMGVZMVlsMGlWSy9VWEZhZFVGcTAxVjlJek4KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
insecure-skip-tls-verify: false
users:
- name: rancher-desktop
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrRENDQVRlZ0F3SUJBZ0lJT25SUE13bkJIaVF3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOek00TURreU9EazRNQjRYRFRJMU1ERXlPREU1TXpRMU9Gb1hEVEkyTURFeQpPREU1TXpRMU9Gb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJKNm1QV3NIclBOTkM2M1YKR1NvdVZ0NDNTOEJyR3haOXB1MU85NW9XcTZZanNxb1Z2d3BTN3lQSXdCa1BlaFB1by9PK3g1dVRrMEZwczNoQgpCOTQzcDU2alNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCUTRyWG5WOVlJd2V4bW1ydjAxZmVMaTB4UVAvakFLQmdncWhrak9QUVFEQWdOSEFEQkUKQWlCbGZsMVVCdkwrUG9SYmhzVVZLemF3c1hjYkdEc0RPSVNtSjZjK0hrbjg3d0lnR1crY093YkJvdEwxQXpQMAphOEh4Nk0xV2huOU9LaWJ6NWRLN2J5UHhXcTQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkakNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUzTXpnd09USTRPVGd3SGhjTk1qVXdNVEk0TVRrek5EVTRXaGNOTXpVd01USTJNVGt6TkRVNApXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUzTXpnd09USTRPVGd3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFTdmZMYmN1eDNSVWhLT0lzSVU2VTdrRWNUZTB6cDBlb2tvdVpzT04wb2cKR3JwR2xLekFsaVNuck1FajF6RU9wVHRmT3hRZVlDS1FhOHo4V2pWQzFaTHdvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVU9LMTUxZldDTUhzWnBxNzlOWDNpCjR0TVVELzR3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnUzR3ODc5YUY3SnMvd1hVNlVqSDFaM3NvZitoRWxCM0gKaHpjbTc1akRxendDSUhlZTl4RklXSm9wdTBjOTVCMDdOVTJHR0M1WXkzNXhWdys1U29KVHZRZTkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUN3TzhYbnhUbnhsQjR6YVdDRGZYRk1YWG5YZzhTV0FHa0g5ZEpDTEUyZkpvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFbnFZOWF3ZXM4MDBMcmRVWktpNVczamRMd0dzYkZuMm03VTczbWhhcnBpT3lxaFcvQ2xMdgpJOGpBR1E5NkUrNmo4NzdIbTVPVFFXbXplRUVIM2plbm5nPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=
contexts:
- name: rancher-desktop
context:
cluster: rancher-desktop
name: rancher-desktop
user: rancher-desktop
preferences: {}
current-context: rancher-desktop
111 changes: 111 additions & 0 deletions python/samples/argocd_install/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
from dotenv import load_dotenv
import os
import asyncio
from pathlib import Path

from autogen_agentchat.agents import AssistantAgent, UserProxyAgent, CodeExecutorAgent
from autogen_agentchat.conditions import TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import AzureOpenAIChatCompletionClient
from autogen_ext.code_executors.local import LocalCommandLineCodeExecutor

# Load environment variables
load_dotenv("./.env")

async def main() -> None:
"""Main function to run Autogen agents and execute tasks sequentially."""

# Initialize Model Client
model_client = AzureOpenAIChatCompletionClient(
model=os.getenv("model"),
azure_endpoint=os.getenv("AZURE_API_BASE"),
api_key=os.getenv("AZURE_API_KEY"),
api_version=os.getenv("AZURE_API_VERSION"),
)

# Retrieve GitHub credentials from environment variables
repo_url = os.getenv("REPO_URL", "https://github.com/example/repo") # Default if not set
repo_pat = os.getenv("REPO_PAT", "your-pat-token")

# Setup Code Execution Environment
work_dir = Path("coding")
work_dir.mkdir(exist_ok=True)
#local_executor = LocalCommandLineCodeExecutor(timeout=120, work_dir=work_dir)
local_executor = LocalCommandLineCodeExecutor(work_dir=work_dir)
code_executor_agent = CodeExecutorAgent("code_executor", code_executor=local_executor)

# Define Agents
assistant = AssistantAgent(
name="assistant",
model_client=model_client,
system_message="""Use the code_executor_agent to solve tasks.
When writing code, provide at least one markdown-encoded code block to execute.
That is, quoting code in ```python or ```sh code blocks).
""",
reflect_on_tool_use=True,
)
user_proxy = UserProxyAgent("user_proxy")

# Termination condition
termination = TextMentionTermination("exit") # Type 'exit' to end the conversation.

# Define Team
team = RoundRobinGroupChat(
[assistant, user_proxy, code_executor_agent],
termination_condition=termination
)

# Task 1: Install ArgoCD on Kubernetes using Helm
argocd_install_task = """
Install ArgoCD on Kubernetes using Helm, if not yet installed.
Install to the 'argocd' namespace.
Assume kubectl and Helm are pre-configured in the local environment.
Wait for ArgoCD pods to become responsive.
"""
await Console(team.run_stream(task=argocd_install_task))


# Task 2: Ensure local access to ArgoCD server
argocd_access_task = """
Ensure local access to ArgoCD server
You may need port forwarding and / or a load balancer for ArgoCD server using kubectl.
"""
await Console(team.run_stream(task=argocd_access_task))


# Task 3: Install ArgoCD CLI and login to server
argocd_cli_install_task = """
Ensure the ArgoCD CLI is installed locally. Login to the server.
"""
await Console(team.run_stream(task=argocd_cli_install_task))


# Task 4: Test repo access
repo_access_task = f"""
Use this GitHub repository: {repo_url}
Access the repository with this fine-grained token: {repo_pat}

Test repo read/write access.
"""
await Console(team.run_stream(task=repo_access_task))


# Task 5: Configure ArgoCD to Deploy Argo Workflows via GitOps
argocd_config_task = f"""
Use ArgoCD's GitOps capabilities to deploy Argo Workflows (ArgoWF) to the argowf namespace, if not yet installed.
Store the ArgoWF config files in a GitHub repository for ArgoCD to scan.
Store Helm values rather than simple K8s manifests.

Retrieve the ArgoCD admin secret using:
```sh
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{{.data.password}}" | base64 -d
```

Use this GitHub repository: {repo_url}
Access the repository with this fine-grained token: {repo_pat}
"""
await Console(team.run_stream(task=argocd_config_task))

# Run the script
asyncio.run(main())