Support running host processes alongside VMs (#482)

* Regenerate .pb with protoc-gen-go v1.36.11

* Support running host processes alongside VMs

* Replace existing host processes when starting a set
This commit is contained in:
edi-oai
2026-09-03 00:24:09 +01:00
committed by GitHub
parent 3fe0a284c5
commit a3e08ffcbf
33 changed files with 1454 additions and 309 deletions
+25
View File
@@ -34,6 +34,13 @@ func (controller *Controller) createVM(ctx *gin.Context) responder.Responder {
return responder.JSON(http.StatusBadRequest, NewErrorResponse("invalid JSON was provided"))
}
// Host processes require an additional role
if len(vm.HostProcesses) != 0 {
if responder := controller.authorize(ctx, v1.ServiceAccountRoleHostProcessWrite); responder != nil {
return responder
}
}
if vm.Name == "" {
return responder.JSON(http.StatusPreconditionFailed, NewErrorResponse("VM name is empty"))
} else if err := simplename.Validate(vm.Name); err != nil {
@@ -122,6 +129,11 @@ func (controller *Controller) createVM(ctx *gin.Context) responder.Responder {
vm.RestartPolicy = v1.RestartPolicyNever
}
// Validate hostProcesses
if err := v1.ValidateHostProcesses(vm.HostProcesses); err != nil {
return responder.JSON(http.StatusBadRequest, NewErrorResponse("invalid host processes: %v", err))
}
// Validate hostDirs
if responder := controller.validateHostDirs(vm.HostDirs); responder != nil {
return responder
@@ -182,6 +194,14 @@ func (controller *Controller) updateVMSpec(ctx *gin.Context) responder.Responder
return responder.Error(err)
}
// Changes to host processes require an additional role
//nolint:staticcheck // Preserve the original explicit VMSpec comparison.
if !dbVM.VMSpec.HostProcessesEqual(userVM.VMSpec) {
if responder := controller.authorize(ctx, v1.ServiceAccountRoleHostProcessWrite); responder != nil {
return responder
}
}
if dbVM.TerminalState() {
return responder.JSON(http.StatusPreconditionFailed,
NewErrorResponse("cannot update VM in a terminal state"))
@@ -197,6 +217,11 @@ func (controller *Controller) updateVMSpec(ctx *gin.Context) responder.Responder
return responder.JSON(http.StatusPreconditionFailed, NewErrorResponse("%v", err))
}
// Validate hostProcesses
if err := v1.ValidateHostProcesses(userVM.HostProcesses); err != nil {
return responder.JSON(http.StatusBadRequest, NewErrorResponse("invalid host processes: %v", err))
}
// Softnet-specific logic: automatically enable Softnet when NetSoftnetAllow or NetSoftnetBlock are set
// and propagate deprecated and non-deprecated boolean fields into each other
if userVM.NetSoftnetDeprecated || userVM.NetSoftnet || len(userVM.NetSoftnetAllow) != 0 || len(userVM.NetSoftnetBlock) != 0 {