Skip to content

Commit a158b34

Browse files
committed
Add vMCP image to operator-deploy-local task
The operator-deploy-local task now builds and loads the vMCP image into Kind alongside the operator and proxyrunner images. This makes local development easier when working with VirtualMCPServer resources. Changes: - Add VMCP_IMAGE variable to operator-deploy-local task - Add vmcpImage to operator Helm chart values - Set VMCP_IMAGE env var in operator deployment template
1 parent 59e4399 commit a158b34

File tree

4 files changed

+12
-1
lines changed

4 files changed

+12
-1
lines changed

cmd/thv-operator/Taskfile.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,20 @@ tasks:
142142
sh: KO_DOCKER_REPO=kind.local ko build --local -B ./cmd/thv-operator | tail -n 1
143143
TOOLHIVE_IMAGE:
144144
sh: KO_DOCKER_REPO=kind.local ko build --local -B ./cmd/thv-proxyrunner | tail -n 1
145+
VMCP_IMAGE:
146+
sh: KO_DOCKER_REPO=kind.local ko build --local -B ./cmd/vmcp | tail -n 1
145147
cmds:
146148
- echo "Loading toolhive operator image {{.OPERATOR_IMAGE}} into kind..."
147149
- kind load docker-image --name toolhive {{.OPERATOR_IMAGE}}
148150
- echo "Loading toolhive image {{.TOOLHIVE_IMAGE}} into kind..."
149151
- kind load docker-image --name toolhive {{.TOOLHIVE_IMAGE}}
152+
- echo "Loading vmcp image {{.VMCP_IMAGE}} into kind..."
153+
- kind load docker-image --name toolhive {{.VMCP_IMAGE}}
150154
- |
151155
helm upgrade --install toolhive-operator deploy/charts/operator \
152156
--set operator.image={{.OPERATOR_IMAGE}} \
153157
--set operator.toolhiveRunnerImage={{.TOOLHIVE_IMAGE}} \
158+
--set operator.vmcpImage={{.VMCP_IMAGE}} \
154159
--set operator.features.experimental={{.ENABLE_EXPERIMENTAL_FEATURES}} \
155160
--set registryAPI.image={{.REGISTRY_API_IMAGE}} \
156161
--namespace toolhive-system \

deploy/charts/operator/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ The command removes all the Kubernetes components associated with the chart and
5252
|-----|-------------|------|---------|
5353
| fullnameOverride | string | `"toolhive-operator"` | Provide a fully-qualified name override for resources |
5454
| nameOverride | string | `""` | Override the name of the chart |
55-
| operator | object | `{"affinity":{},"autoscaling":{"enabled":false,"maxReplicas":100,"minReplicas":1,"targetCPUUtilizationPercentage":80},"containerSecurityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"runAsUser":1000,"seccompProfile":{"type":"RuntimeDefault"}},"env":{},"features":{"experimental":false},"gc":{"gogc":75,"gomeglimit":"150MiB"},"image":"ghcr.io/stacklok/toolhive/operator:v0.6.6","imagePullPolicy":"IfNotPresent","imagePullSecrets":[],"leaderElectionRole":{"binding":{"name":"toolhive-operator-leader-election-rolebinding"},"name":"toolhive-operator-leader-election-role","rules":[{"apiGroups":[""],"resources":["configmaps"],"verbs":["get","list","watch","create","update","patch","delete"]},{"apiGroups":["coordination.k8s.io"],"resources":["leases"],"verbs":["get","list","watch","create","update","patch","delete"]},{"apiGroups":[""],"resources":["events"],"verbs":["create","patch"]}]},"livenessProbe":{"httpGet":{"path":"/healthz","port":"health"},"initialDelaySeconds":15,"periodSeconds":20},"nodeSelector":{},"podAnnotations":{},"podLabels":{},"podSecurityContext":{"runAsNonRoot":true},"ports":[{"containerPort":8080,"name":"metrics","protocol":"TCP"},{"containerPort":8081,"name":"health","protocol":"TCP"}],"proxyHost":"0.0.0.0","rbac":{"allowedNamespaces":[],"scope":"cluster"},"readinessProbe":{"httpGet":{"path":"/readyz","port":"health"},"initialDelaySeconds":5,"periodSeconds":10},"replicaCount":1,"resources":{"limits":{"cpu":"500m","memory":"128Mi"},"requests":{"cpu":"10m","memory":"64Mi"}},"serviceAccount":{"annotations":{},"automountServiceAccountToken":true,"create":true,"labels":{},"name":"toolhive-operator"},"tolerations":[],"toolhiveRunnerImage":"ghcr.io/stacklok/toolhive/proxyrunner:v0.6.6","volumeMounts":[],"volumes":[]}` | All values for the operator deployment and associated resources |
55+
| operator | object | `{"affinity":{},"autoscaling":{"enabled":false,"maxReplicas":100,"minReplicas":1,"targetCPUUtilizationPercentage":80},"containerSecurityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"runAsUser":1000,"seccompProfile":{"type":"RuntimeDefault"}},"env":{},"features":{"experimental":false},"gc":{"gogc":75,"gomeglimit":"150MiB"},"image":"ghcr.io/stacklok/toolhive/operator:v0.6.6","imagePullPolicy":"IfNotPresent","imagePullSecrets":[],"leaderElectionRole":{"binding":{"name":"toolhive-operator-leader-election-rolebinding"},"name":"toolhive-operator-leader-election-role","rules":[{"apiGroups":[""],"resources":["configmaps"],"verbs":["get","list","watch","create","update","patch","delete"]},{"apiGroups":["coordination.k8s.io"],"resources":["leases"],"verbs":["get","list","watch","create","update","patch","delete"]},{"apiGroups":[""],"resources":["events"],"verbs":["create","patch"]}]},"livenessProbe":{"httpGet":{"path":"/healthz","port":"health"},"initialDelaySeconds":15,"periodSeconds":20},"nodeSelector":{},"podAnnotations":{},"podLabels":{},"podSecurityContext":{"runAsNonRoot":true},"ports":[{"containerPort":8080,"name":"metrics","protocol":"TCP"},{"containerPort":8081,"name":"health","protocol":"TCP"}],"proxyHost":"0.0.0.0","rbac":{"allowedNamespaces":[],"scope":"cluster"},"readinessProbe":{"httpGet":{"path":"/readyz","port":"health"},"initialDelaySeconds":5,"periodSeconds":10},"replicaCount":1,"resources":{"limits":{"cpu":"500m","memory":"128Mi"},"requests":{"cpu":"10m","memory":"64Mi"}},"serviceAccount":{"annotations":{},"automountServiceAccountToken":true,"create":true,"labels":{},"name":"toolhive-operator"},"tolerations":[],"toolhiveRunnerImage":"ghcr.io/stacklok/toolhive/proxyrunner:v0.6.6","vmcpImage":"ghcr.io/stacklok/toolhive/vmcp:v0.6.6","volumeMounts":[],"volumes":[]}` | All values for the operator deployment and associated resources |
5656
| operator.affinity | object | `{}` | Affinity settings for the operator pod |
5757
| operator.autoscaling | object | `{"enabled":false,"maxReplicas":100,"minReplicas":1,"targetCPUUtilizationPercentage":80}` | Configuration for horizontal pod autoscaling |
5858
| operator.autoscaling.enabled | bool | `false` | Enable autoscaling for the operator |
@@ -92,6 +92,7 @@ The command removes all the Kubernetes components associated with the chart and
9292
| operator.serviceAccount.name | string | `"toolhive-operator"` | The name of the service account to use. If not set and create is true, a name is generated. |
9393
| operator.tolerations | list | `[]` | Tolerations for the operator pod |
9494
| operator.toolhiveRunnerImage | string | `"ghcr.io/stacklok/toolhive/proxyrunner:v0.6.6"` | Image to use for Toolhive runners |
95+
| operator.vmcpImage | string | `"ghcr.io/stacklok/toolhive/vmcp:v0.6.6"` | Image to use for Virtual MCP Server (vMCP) deployments |
9596
| operator.volumeMounts | list | `[]` | Additional volume mounts on the operator container |
9697
| operator.volumes | list | `[]` | Additional volumes to mount on the operator pod |
9798
| registryAPI | object | `{"image":"ghcr.io/stacklok/thv-registry-api:v0.2.0","serviceAccount":{"annotations":{},"automountServiceAccountToken":true,"labels":{},"name":"toolhive-registry-api"}}` | All values for the registry API deployment and associated resources |

deploy/charts/operator/templates/deployment.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ spec:
6464
{{- end }}
6565
- name: TOOLHIVE_RUNNER_IMAGE
6666
value: "{{ .Values.operator.toolhiveRunnerImage }}"
67+
- name: VMCP_IMAGE
68+
value: "{{ .Values.operator.vmcpImage }}"
6769
- name: TOOLHIVE_PROXY_HOST
6870
value: "{{ .Values.operator.proxyHost }}"
6971
- name: TOOLHIVE_REGISTRY_API_IMAGE

deploy/charts/operator/values.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ operator:
2121
# -- Image to use for Toolhive runners
2222
toolhiveRunnerImage: ghcr.io/stacklok/toolhive/proxyrunner:v0.6.6
2323

24+
# -- Image to use for Virtual MCP Server (vMCP) deployments
25+
vmcpImage: ghcr.io/stacklok/toolhive/vmcp:v0.6.6
26+
2427
# -- Host for the proxy deployed by the operator
2528
proxyHost: 0.0.0.0
2629

0 commit comments

Comments
 (0)