Skip to content

Commit bb6e786

Browse files
committed
WIP kubevirt: Introduce toolset and plan based VM creation tool
Assisted-By: Claude <noreply@anthropic.com> Signed-off-by: Lee Yarwood <lyarwood@redhat.com>
1 parent 0c78a1e commit bb6e786

File tree

8 files changed

+986
-1
lines changed

8 files changed

+986
-1
lines changed

internal/tools/update-readme/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
_ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/config"
1616
_ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/core"
1717
_ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/helm"
18+
_ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/kubevirt"
1819
)
1920

2021
type OpenShift struct{}

pkg/kubernetes-mcp-server/cmd/root_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func TestToolsets(t *testing.T) {
137137
rootCmd := NewMCPServer(ioStreams)
138138
rootCmd.SetArgs([]string{"--help"})
139139
o, err := captureOutput(rootCmd.Execute) // --help doesn't use logger/klog, cobra prints directly to stdout
140-
if !strings.Contains(o, "Comma-separated list of MCP toolsets to use (available toolsets: config, core, helm).") {
140+
if !strings.Contains(o, "Comma-separated list of MCP toolsets to use (available toolsets: config, core, helm, kubevirt).") {
141141
t.Fatalf("Expected all available toolsets, got %s %v", o, err)
142142
}
143143
})

pkg/kubernetes/kubernetes.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package kubernetes
22

33
import (
44
"k8s.io/apimachinery/pkg/runtime"
5+
"k8s.io/client-go/rest"
56

67
"github.com/containers/kubernetes-mcp-server/pkg/helm"
78
"k8s.io/client-go/kubernetes/scheme"
@@ -30,6 +31,14 @@ func (k *Kubernetes) AccessControlClientset() *AccessControlClientset {
3031
return k.manager.accessControlClientSet
3132
}
3233

34+
// RESTConfig returns the Kubernetes REST configuration
35+
func (k *Kubernetes) RESTConfig() *rest.Config {
36+
if k.manager == nil {
37+
return nil
38+
}
39+
return k.manager.cfg
40+
}
41+
3342
var Scheme = scheme.Scheme
3443
var ParameterCodec = runtime.NewParameterCodec(Scheme)
3544

pkg/mcp/modules.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ package mcp
33
import _ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/config"
44
import _ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/core"
55
import _ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/helm"
6+
import _ "github.com/containers/kubernetes-mcp-server/pkg/toolsets/kubevirt"

pkg/toolsets/kubevirt/toolset.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package kubevirt
2+
3+
import (
4+
"slices"
5+
6+
"github.com/containers/kubernetes-mcp-server/pkg/api"
7+
internalk8s "github.com/containers/kubernetes-mcp-server/pkg/kubernetes"
8+
"github.com/containers/kubernetes-mcp-server/pkg/toolsets"
9+
vm_create "github.com/containers/kubernetes-mcp-server/pkg/toolsets/kubevirt/vm/create"
10+
)
11+
12+
type Toolset struct{}
13+
14+
var _ api.Toolset = (*Toolset)(nil)
15+
16+
func (t *Toolset) GetName() string {
17+
return "kubevirt"
18+
}
19+
20+
func (t *Toolset) GetDescription() string {
21+
return "KubeVirt virtual machine management tools"
22+
}
23+
24+
func (t *Toolset) GetTools(o internalk8s.Openshift) []api.ServerTool {
25+
return slices.Concat(
26+
vm_create.Tools(),
27+
)
28+
}
29+
30+
func init() {
31+
toolsets.Register(&Toolset{})
32+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# VirtualMachine Creation Plan
2+
3+
Use the `resources_create_or_update` tool with the following YAML:
4+
5+
```yaml
6+
apiVersion: kubevirt.io/v1
7+
kind: VirtualMachine
8+
metadata:
9+
name: {{.Name}}
10+
namespace: {{.Namespace}}
11+
spec:
12+
runStrategy: Halted
13+
{{- if .Instancetype}}
14+
instancetype:
15+
name: {{.Instancetype}}
16+
kind: VirtualMachineClusterInstancetype
17+
{{- end}}
18+
{{- if .Preference}}
19+
preference:
20+
name: {{.Preference}}
21+
kind: VirtualMachineClusterPreference
22+
{{- end}}
23+
{{- if .UseDataSource}}
24+
dataVolumeTemplates:
25+
- metadata:
26+
name: {{.Name}}-rootdisk
27+
spec:
28+
sourceRef:
29+
kind: DataSource
30+
name: {{.DataSourceName}}
31+
namespace: {{.DataSourceNamespace}}
32+
storage:
33+
resources:
34+
requests:
35+
storage: 30Gi
36+
{{- end}}
37+
template:
38+
spec:
39+
domain:
40+
devices:
41+
disks:
42+
- name: {{.Name}}-rootdisk
43+
{{- if not .Instancetype}}
44+
memory:
45+
guest: 1Gi
46+
{{- end}}
47+
volumes:
48+
- name: {{.Name}}-rootdisk
49+
{{- if .UseDataSource}}
50+
dataVolume:
51+
name: {{.Name}}-rootdisk
52+
{{- else}}
53+
containerDisk:
54+
image: {{.ContainerDisk}}
55+
{{- end}}
56+
```
57+
58+
## Verification
59+
60+
After creating the VirtualMachine, verify it was created successfully:
61+
62+
Use the `resources_get` tool:
63+
- **apiVersion**: `kubevirt.io/v1`
64+
- **kind**: `VirtualMachine`
65+
- **namespace**: `{{.Namespace}}`
66+
- **name**: `{{.Name}}`
67+
68+
Check the resource details for any warnings or errors in the status conditions.
69+
70+
## Troubleshooting
71+
72+
If the VirtualMachine fails to create or start:
73+
74+
1. **Check the VM resource details and events**:
75+
- Use `resources_get` tool with apiVersion `kubevirt.io/v1`, kind `VirtualMachine`, namespace `{{.Namespace}}`, name `{{.Name}}`
76+
- Look for error messages in the status conditions
77+
78+
2. **Verify instance type exists** (if specified):
79+
- Use `resources_get` tool with apiVersion `instancetype.kubevirt.io/v1beta1`, kind `VirtualMachineClusterInstancetype`, name `{{.Instancetype}}`
80+
81+
3. **Verify preference exists** (if specified):
82+
- Use `resources_get` tool with apiVersion `instancetype.kubevirt.io/v1beta1`, kind `VirtualMachineClusterPreference`, name `{{.Preference}}`
83+
84+
4. **Check KubeVirt installation**:
85+
- Use `pods_list` tool with namespace `kubevirt`

0 commit comments

Comments
 (0)