Skip to content
Merged
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 @@ -107,3 +107,6 @@ users:
Chennamma-Hotkar:
name: Chennamma Hotkar
email: channuhotkar@gmail.com
pocopepe:
name: Viju Sanjai
email: avijusanjai@gmail.com
15 changes: 15 additions & 0 deletions pkg/unikontainers/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ const (
annotBlock = "com.urunc.unikernel.block"
annotBlockMntPoint = "com.urunc.unikernel.blkMntPoint"
annotMountRootfs = "com.urunc.unikernel.mountRootfs"
annotNetDev = "com.urunc.unikernel.solo5NetDev"
)

// A UnikernelConfig struct holds the info provided by bima image on how to execute our unikernel
Expand All @@ -58,6 +59,7 @@ type UnikernelConfig struct {
Block string `json:"com.urunc.unikernel.block,omitempty"`
BlkMntPoint string `json:"com.urunc.unikernel.blkMntPoint,omitempty"`
MountRootfs string `json:"com.urunc.unikernel.mountRootfs"`
NetDev string `json:"com.urunc.unikernel.solo5NetDev,omitempty"`
}

// validate checks if the mandatory configuration fields are present.
Expand Down Expand Up @@ -119,6 +121,7 @@ func getConfigFromSpec(spec *specs.Spec) *UnikernelConfig {
block := spec.Annotations[annotBlock]
blkMntPoint := spec.Annotations[annotBlockMntPoint]
MountRootfs := spec.Annotations[annotMountRootfs]
netDev := spec.Annotations[annotNetDev]
uniklog.WithFields(logrus.Fields{
"unikernelType": unikernelType,
"unikernelVersion": unikernelVersion,
Expand All @@ -129,6 +132,7 @@ func getConfigFromSpec(spec *specs.Spec) *UnikernelConfig {
"block": block,
"blkMntPoint": blkMntPoint,
"mountRootfs": MountRootfs,
"netDev": netDev,
}).WithField("source", "spec").Debug("urunc annotations")

return &UnikernelConfig{
Expand All @@ -141,6 +145,7 @@ func getConfigFromSpec(spec *specs.Spec) *UnikernelConfig {
Block: block,
BlkMntPoint: blkMntPoint,
MountRootfs: MountRootfs,
NetDev: netDev,
}
}

Expand Down Expand Up @@ -180,6 +185,7 @@ func getConfigFromJSON(jsonFilePath string) (*UnikernelConfig, error) {
"block": tryDecode(conf.Block),
"blkMntPoint": tryDecode(conf.BlkMntPoint),
"mountRootfs": tryDecode(conf.MountRootfs),
"netDev": tryDecode(conf.NetDev),
}).WithField("source", uruncJSONFilename).Debug("urunc annotations")

return &conf, nil
Expand Down Expand Up @@ -250,6 +256,12 @@ func (c *UnikernelConfig) decode() error {
}
c.MountRootfs = string(decoded)

decoded, err = base64.StdEncoding.DecodeString(c.NetDev)
if err != nil {
return fmt.Errorf("failed to decode netDev: %v", err)
}
c.NetDev = string(decoded)

return nil
}

Expand Down Expand Up @@ -283,6 +295,9 @@ func (c *UnikernelConfig) Map() map[string]string {
if c.MountRootfs != "" {
myMap[annotMountRootfs] = c.MountRootfs
}
if c.NetDev != "" {
myMap[annotNetDev] = c.NetDev
}

return myMap
}
4 changes: 4 additions & 0 deletions pkg/unikontainers/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ func TestGetConfigFromSpec(t *testing.T) {
annotBlock: "block1",
annotBlockMntPoint: "point1",
annotMountRootfs: "true",
annotNetDev: "management",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It took me a while to understand why this was changed. But all good!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I mean in that way, using that word.

},
}

Expand All @@ -50,6 +51,7 @@ func TestGetConfigFromSpec(t *testing.T) {
Block: "block1",
BlkMntPoint: "point1",
MountRootfs: "true",
NetDev: "management",
}

config := getConfigFromSpec(spec)
Expand Down Expand Up @@ -239,6 +241,7 @@ func TestMap(t *testing.T) {
Block: "block_value",
BlkMntPoint: "point_value",
MountRootfs: "false",
NetDev: "netdev_value",
}
expectedMap := map[string]string{
annotCmdLine: "cmd_value",
Expand All @@ -249,6 +252,7 @@ func TestMap(t *testing.T) {
annotBlock: "block_value",
annotBlockMntPoint: "point_value",
annotMountRootfs: "false",
annotNetDev: "netdev_value",
}
resultMap := config.Map()
assert.Equal(t, expectedMap, resultMap)
Expand Down
1 change: 1 addition & 0 deletions pkg/unikontainers/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ type UnikernelParams struct {
Monitor string // The monitor where guest will execute
Version string // The version of the unikernel
InitrdPath string // The path to the initrd of the unikernel
NetDevName string // The name of the guest network device declared at build time
Net NetDevParams
Block []BlockDevParams
Rootfs RootfsParams // Information about rootfs
Expand Down
33 changes: 25 additions & 8 deletions pkg/unikontainers/unikernels/mirage.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,11 @@ import (
const MirageUnikernel string = "mirage"

type Mirage struct {
Command string
Monitor string
Net MirageNet
Block []MirageBlock
Command string
Monitor string
Net MirageNet
Block []MirageBlock
netDevName string
}

type MirageNet struct {
Expand Down Expand Up @@ -57,8 +58,8 @@ func (m *Mirage) SupportsFS(_ string) bool {
func (m *Mirage) MonitorNetCli(ifName string, mac string) string {
switch m.Monitor {
case "hvt", "spt":
netOption := "--net:service=" + ifName
netOption += " --net-mac:service=" + mac
netOption := "--net:" + m.netDevName + "=" + ifName
netOption += " --net-mac:" + m.netDevName + "=" + mac
return netOption
default:
return ""
Expand Down Expand Up @@ -103,8 +104,18 @@ func (m *Mirage) Init(data types.UnikernelParams) error {
if err != nil {
return err
}
m.Net.Address = fmt.Sprintf("--ipv4=%s/%d", data.Net.IP, mask)
m.Net.Gateway = "--ipv4-gateway=" + data.Net.Gateway
// Mirage groups a network device's command line options under a prefix,
// and that prefix is the device name. The default device "service" uses
// the plain --ipv4 and --ipv4-gateway flags, but any other device needs
// its name as the prefix, like --management-ipv4 for a device called
// "management". So we only add the prefix when the device is not "service".
if data.NetDevName != "" && data.NetDevName != "service" {
m.Net.Address = fmt.Sprintf("--%s-ipv4=%s/%d", data.NetDevName, data.Net.IP, mask)
m.Net.Gateway = "--" + data.NetDevName + "-ipv4-gateway=" + data.Net.Gateway
} else {
m.Net.Address = fmt.Sprintf("--ipv4=%s/%d", data.Net.IP, mask)
m.Net.Gateway = "--ipv4-gateway=" + data.Net.Gateway
}
}
m.Block = make([]MirageBlock, 0, len(data.Block))
for _, blk := range data.Block {
Expand All @@ -118,6 +129,12 @@ func (m *Mirage) Init(data types.UnikernelParams) error {
m.Command = strings.Join(data.CmdLine, " ")
m.Monitor = data.Monitor

if data.NetDevName != "" {
m.netDevName = data.NetDevName
} else {
m.netDevName = "service"
}

return nil
}

Expand Down
22 changes: 22 additions & 0 deletions pkg/unikontainers/unikernels/mirage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,25 @@ func TestMirageInitSubnetMask(t *testing.T) {
})
}
}

func TestMirageNetDevName(t *testing.T) {
t.Run("uses net device name from annotation", func(t *testing.T) {
t.Parallel()
m := &Mirage{}
err := m.Init(types.UnikernelParams{Monitor: "hvt", NetDevName: "management"})
assert.NoError(t, err)
cli := m.MonitorNetCli("tap0", "aa:bb:cc:dd:ee:ff")
assert.Contains(t, cli, "--net:management=tap0")
assert.Contains(t, cli, "--net-mac:management=aa:bb:cc:dd:ee:ff")
})

t.Run("falls back to service when annotation is absent", func(t *testing.T) {
t.Parallel()
m := &Mirage{}
err := m.Init(types.UnikernelParams{Monitor: "hvt"})
assert.NoError(t, err)
cli := m.MonitorNetCli("tap0", "aa:bb:cc:dd:ee:ff")
assert.Contains(t, cli, "--net:service=tap0")
assert.Contains(t, cli, "--net-mac:service=aa:bb:cc:dd:ee:ff")
})
}
11 changes: 6 additions & 5 deletions pkg/unikontainers/unikontainers.go
Original file line number Diff line number Diff line change
Expand Up @@ -439,11 +439,12 @@ func (u *Unikontainer) Exec(metrics m.Writer) error {
// UnikernelParams
// populate unikernel params
unikernelParams := types.UnikernelParams{
CmdLine: u.Spec.Process.Args,
EnvVars: u.Spec.Process.Env,
Monitor: vmmType,
Version: unikernelVersion,
ProcConf: procAttrs,
CmdLine: u.Spec.Process.Args,
EnvVars: u.Spec.Process.Env,
Monitor: vmmType,
Version: unikernelVersion,
ProcConf: procAttrs,
NetDevName: u.State.Annotations[annotNetDev],
}
if len(unikernelParams.CmdLine) == 0 {
unikernelParams.CmdLine = strings.Fields(u.State.Annotations[annotCmdLine])
Expand Down
Loading