diff --git a/.github/contributors.yaml b/.github/contributors.yaml index 0b2d4b21..6a03a00f 100644 --- a/.github/contributors.yaml +++ b/.github/contributors.yaml @@ -101,6 +101,9 @@ users: mdryaan: name: Md Raiyan email: alikhurshid842001@gmail.com + Chennamma-Hotkar: + name: Chennamma Hotkar + email: channuhotkar@gmail.com abhaygoudannavar: name: AbhayGoudannavar email: abhaysgoudnvr@gmail.com diff --git a/pkg/unikontainers/unikontainers.go b/pkg/unikontainers/unikontainers.go index a3a00bb5..fc297f93 100644 --- a/pkg/unikontainers/unikontainers.go +++ b/pkg/unikontainers/unikontainers.go @@ -553,7 +553,9 @@ func (u *Unikontainer) Exec(metrics m.Writer) error { // vAccel setup vAccelType, vsockSocketPath, rpcAddress, err := resolveVAccelConfig(u.State.Annotations[annotHypervisor], u.Spec.Annotations) if err != nil { - uniklog.Debugf("vAccel config: %v", err) + if !errors.Is(err, ErrVAccelDisabled) { + uniklog.Warnf("vAccel misconfiguration: %v", err) + } } if vAccelType == "vsock" && err == nil { diff --git a/pkg/unikontainers/vaccel.go b/pkg/unikontainers/vaccel.go index 909089c9..f6905696 100644 --- a/pkg/unikontainers/vaccel.go +++ b/pkg/unikontainers/vaccel.go @@ -15,12 +15,17 @@ package unikontainers import ( + "errors" "fmt" "regexp" "golang.org/x/sys/unix" ) +// ErrVAccelDisabled is returned by resolveVAccelConfig when the vAccel +// annotation is absent. This is an expected condition, not a misconfiguration. +var ErrVAccelDisabled = errors.New("vaccel is disabled") + // idToGuestCID generates a deterministic guest CID (Context Identifier) // for vsock communication based on a container or VM ID. func idToGuestCID(id string) int { @@ -87,8 +92,7 @@ func resolveVAccelConfig(hypervisor string, annotations map[string]string) (stri return vAccelType, "", "", err } } else { - err = fmt.Errorf("vaccel is disabled") - return vAccelType, "", "", err + return "", "", "", ErrVAccelDisabled } if vAccelType == "vsock" { diff --git a/pkg/unikontainers/vaccel_test.go b/pkg/unikontainers/vaccel_test.go index 3a6ca47f..9ab8f01d 100644 --- a/pkg/unikontainers/vaccel_test.go +++ b/pkg/unikontainers/vaccel_test.go @@ -15,6 +15,7 @@ package unikontainers import ( + "errors" "testing" "github.com/stretchr/testify/assert" @@ -168,3 +169,45 @@ func TestIsValidVSockAddress(t *testing.T) { }) } } + +func TestResolveVAccelConfig(t *testing.T) { + t.Run("vaccel disabled returns ErrVAccelDisabled", func(t *testing.T) { + t.Parallel() + annotations := map[string]string{} + _, _, _, err := resolveVAccelConfig("qemu", annotations) + assert.ErrorIs(t, err, ErrVAccelDisabled) + }) + + t.Run("vaccel enabled but rpc address missing returns error", func(t *testing.T) { + t.Parallel() + annotations := map[string]string{ + "com.urunc.unikernel.vAccel": "vsock", + } + _, _, _, err := resolveVAccelConfig("qemu", annotations) + assert.Error(t, err) + assert.False(t, errors.Is(err, ErrVAccelDisabled), "missing rpc address should not be ErrVAccelDisabled") + }) + + t.Run("vaccel enabled with malformed rpc address returns error", func(t *testing.T) { + t.Parallel() + annotations := map[string]string{ + "com.urunc.unikernel.vAccel": "vsock", + "com.urunc.unikernel.RPCAddress": "invalid-address", + } + _, _, _, err := resolveVAccelConfig("qemu", annotations) + assert.Error(t, err) + assert.False(t, errors.Is(err, ErrVAccelDisabled), "malformed address should not be ErrVAccelDisabled") + }) + + t.Run("vaccel enabled with valid qemu vsock address succeeds", func(t *testing.T) { + t.Parallel() + annotations := map[string]string{ + "com.urunc.unikernel.vAccel": "vsock", + "com.urunc.unikernel.RPCAddress": "vsock://2:1234", + } + vAccelType, _, addr, err := resolveVAccelConfig("qemu", annotations) + assert.NoError(t, err) + assert.Equal(t, "vsock", vAccelType) + assert.Equal(t, "vsock://2:1234", addr) + }) +}