mirror of
https://github.com/ultravioletrs/cocos.git
synced 2026-06-23 04:10:25 +00:00
8eb1fac9ad
* Refactor and update dependencies in the project - Updated go.sum to replace `github.com/absmach/magistrala` with `github.com/absmach/supermq` across various modules. - Removed VSock configuration from environment variables and QEMU arguments. - Updated QEMU configuration and related tests to remove references to guest CID and VSock. - Added new HTTP transport layer for API endpoints in the manager. - Introduced Prometheus monitoring configuration with alert rules and Alertmanager setup. - Updated service and VM interfaces to remove unused methods and references. - Refactored tests to align with the new structure and dependencies. Signed-off-by: Sammy Oina <sammyoina@gmail.com> * Add MaxVMs configuration and enforce limit on VM creation Signed-off-by: Sammy Oina <sammyoina@gmail.com> * Add comprehensive tests for HTTP transport handlers and endpoints Signed-off-by: Sammy Oina <sammyoina@gmail.com> * Add test case for exceeding maximum number of VMs in TestRun Signed-off-by: Sammy Oina <sammyoina@gmail.com> * Improve error handling in TestHandlerWithCustomRouter to ensure response writing is checked Signed-off-by: Sammy Oina <sammyoina@gmail.com> * Update dependencies to latest versions - Upgrade cel.dev/expr from v0.23.0 to v0.24.0 - Upgrade github.com/absmach/supermq from v0.16.0 to v0.17.0 - Upgrade github.com/cenkalti/backoff from v4.3.0 to v5.0.2 - Upgrade github.com/cncf/xds/go to v0.0.0-20250501225837-2ac532fd4443 - Upgrade github.com/go-chi/chi/v5 from v5.2.1 to v5.2.2 - Upgrade github.com/go-jose/go-jose/v3 from v3.0.3 to v3.0.4 - Upgrade github.com/gofrs/uuid/v5 from v5.3.0 to v5.3.2 - Upgrade github.com/prometheus/client_golang from v1.22.0 to v1.23.0 - Upgrade github.com/prometheus/client_model from v0.6.1 to v0.6.2 - Upgrade github.com/prometheus/common from v0.62.0 to v0.65.0 - Upgrade github.com/prometheus/procfs from v0.15.1 to v0.16.1 - Upgrade go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp from v0.60.0 to v0.62.0 - Upgrade go.opentelemetry.io/otel/exporters/otlp/otlptrace from v1.36.0 to v1.37.0 - Upgrade golang.org/x/crypto from v0.39.0 to v0.40.0 - Upgrade golang.org/x/sys from v0.33.0 to v0.34.0 - Upgrade golang.org/x/text from v0.26.0 to v0.27.0 - Upgrade golang.org/x/time from v0.11.0 to v0.12.0 - Upgrade google.golang.org/grpc from v1.73.0 to v1.74.2 Signed-off-by: Sammy Oina <sammyoina@gmail.com> --------- Signed-off-by: Sammy Oina <sammyoina@gmail.com>
184 lines
3.9 KiB
Go
184 lines
3.9 KiB
Go
// Copyright (c) Ultraviolet
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
package qemu
|
|
|
|
import (
|
|
"log/slog"
|
|
"os"
|
|
"os/exec"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/ultravioletrs/cocos/manager/vm/mocks"
|
|
pkgmanager "github.com/ultravioletrs/cocos/pkg/manager"
|
|
)
|
|
|
|
const testComputationID = "test-computation"
|
|
|
|
func TestNewVM(t *testing.T) {
|
|
config := VMInfo{Config: Config{}}
|
|
|
|
vm := NewVM(config, testComputationID, slog.Default())
|
|
|
|
assert.NotNil(t, vm)
|
|
assert.IsType(t, &qemuVM{}, vm)
|
|
}
|
|
|
|
func TestStart(t *testing.T) {
|
|
// Create a temporary file for testing
|
|
tmpFile, err := os.CreateTemp("", "test-ovmf-vars")
|
|
assert.NoError(t, err)
|
|
defer os.Remove(tmpFile.Name())
|
|
|
|
config := VMInfo{Config: Config{
|
|
OVMFVarsConfig: OVMFVarsConfig{
|
|
File: tmpFile.Name(),
|
|
},
|
|
QemuBinPath: "echo",
|
|
}}
|
|
|
|
vm := NewVM(config, testComputationID, slog.Default()).(*qemuVM)
|
|
|
|
err = vm.Start()
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, vm.cmd)
|
|
|
|
_ = vm.Stop()
|
|
}
|
|
|
|
func TestStartSudo(t *testing.T) {
|
|
// Create a temporary file for testing
|
|
tmpFile, err := os.CreateTemp("", "test-ovmf-vars")
|
|
assert.NoError(t, err)
|
|
defer os.Remove(tmpFile.Name())
|
|
|
|
config := VMInfo{Config: Config{
|
|
OVMFVarsConfig: OVMFVarsConfig{
|
|
File: tmpFile.Name(),
|
|
},
|
|
QemuBinPath: "echo",
|
|
UseSudo: true,
|
|
}}
|
|
|
|
vm := NewVM(config, testComputationID, slog.Default()).(*qemuVM)
|
|
|
|
err = vm.Start()
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, vm.cmd)
|
|
|
|
_ = vm.Stop()
|
|
}
|
|
|
|
func TestStop(t *testing.T) {
|
|
t.Run("success", func(t *testing.T) {
|
|
cmd := exec.Command("echo", "test")
|
|
err := cmd.Start()
|
|
assert.NoError(t, err)
|
|
sm := new(mocks.StateMachine)
|
|
sm.On("Transition", pkgmanager.StopComputationRun).Return(nil)
|
|
|
|
vm := &qemuVM{
|
|
cmd: &exec.Cmd{
|
|
Process: cmd.Process,
|
|
},
|
|
StateMachine: sm,
|
|
}
|
|
|
|
err = vm.Stop()
|
|
assert.NoError(t, err)
|
|
})
|
|
t.Run("transition error", func(t *testing.T) {
|
|
cmd := exec.Command("echo", "test")
|
|
err := cmd.Start()
|
|
assert.NoError(t, err)
|
|
sm := new(mocks.StateMachine)
|
|
sm.On("Transition", pkgmanager.StopComputationRun).Return(assert.AnError)
|
|
sm.On("State").Return(pkgmanager.Stopped.String())
|
|
|
|
vm := &qemuVM{
|
|
cmd: &exec.Cmd{
|
|
Process: cmd.Process,
|
|
},
|
|
StateMachine: sm,
|
|
}
|
|
|
|
err = vm.Stop()
|
|
assert.NoError(t, err)
|
|
})
|
|
}
|
|
|
|
func TestSetProcess(t *testing.T) {
|
|
vm := &qemuVM{
|
|
vmi: VMInfo{
|
|
Config: Config{QemuBinPath: "echo"}, // Use 'echo' as a dummy QEMU binary
|
|
},
|
|
}
|
|
|
|
err := vm.SetProcess(os.Getpid()) // Use current process as a dummy
|
|
assert.NoError(t, err)
|
|
assert.NotNil(t, vm.cmd)
|
|
assert.NotNil(t, vm.cmd.Process)
|
|
}
|
|
|
|
func TestGetProcess(t *testing.T) {
|
|
expectedPid := 12345
|
|
vm := &qemuVM{
|
|
cmd: &exec.Cmd{
|
|
Process: &os.Process{Pid: expectedPid},
|
|
},
|
|
}
|
|
|
|
pid := vm.GetProcess()
|
|
assert.Equal(t, expectedPid, pid)
|
|
}
|
|
|
|
func TestGetConfig(t *testing.T) {
|
|
expectedConfig := VMInfo{
|
|
Config: Config{
|
|
QemuBinPath: "echo",
|
|
},
|
|
}
|
|
vm := &qemuVM{
|
|
vmi: expectedConfig,
|
|
}
|
|
|
|
config := vm.GetConfig()
|
|
assert.Equal(t, expectedConfig, config)
|
|
}
|
|
|
|
func TestSEVSNPEnabled(t *testing.T) {
|
|
t.Run("cpuinfo and kvm param correct", func(t *testing.T) {
|
|
assert.True(t, SEVSNPEnabled("flags: sev_snp abc", "Y"))
|
|
})
|
|
|
|
t.Run("missing sev_snp in cpuinfo", func(t *testing.T) {
|
|
assert.False(t, SEVSNPEnabled("flags: abc", "1"))
|
|
})
|
|
|
|
t.Run("kernel param not enabled", func(t *testing.T) {
|
|
assert.False(t, SEVSNPEnabled("flags: sev_snp", "0"))
|
|
})
|
|
}
|
|
|
|
func TestTDXEnabled(t *testing.T) {
|
|
t.Run("cpuinfo and kvm param correct", func(t *testing.T) {
|
|
assert.True(t, TDXEnabled("flags: tdx_host_platform abc", "Y"))
|
|
})
|
|
|
|
t.Run("missing tdx_host_platform in cpuinfo", func(t *testing.T) {
|
|
assert.False(t, TDXEnabled("flags: abc", "1"))
|
|
})
|
|
|
|
t.Run("kernel param not enabled", func(t *testing.T) {
|
|
assert.False(t, TDXEnabled("flags: tdx_host_platform", "0"))
|
|
})
|
|
}
|
|
|
|
func TestSEVSNPEnabledOnHost(t *testing.T) {
|
|
assert.False(t, SEVSNPEnabledOnHost())
|
|
}
|
|
|
|
func TestTDXEnabledOnHost(t *testing.T) {
|
|
assert.False(t, TDXEnabledOnHost())
|
|
}
|