Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/contributors.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 3 additions & 1 deletion pkg/unikontainers/unikontainers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
8 changes: 6 additions & 2 deletions pkg/unikontainers/vaccel.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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" {
Expand Down
43 changes: 43 additions & 0 deletions pkg/unikontainers/vaccel_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
package unikontainers

import (
"errors"
"testing"

"github.com/stretchr/testify/assert"
Expand Down Expand Up @@ -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)
})
}