gitee.com/leisunstar/runtime@v0.0.0-20200521203717-5cef3e7b53f9/virtcontainers/acrn_arch_base_test.go (about)

     1  // Copyright (c) 2019 Intel Corporation
     2  //
     3  // SPDX-License-Identifier: Apache-2.0
     4  //
     5  
     6  package virtcontainers
     7  
     8  import (
     9  	"fmt"
    10  	"io/ioutil"
    11  	"net"
    12  	"os"
    13  	"path/filepath"
    14  	"testing"
    15  
    16  	"github.com/kata-containers/runtime/virtcontainers/device/config"
    17  	"github.com/kata-containers/runtime/virtcontainers/persist/fs"
    18  	"github.com/kata-containers/runtime/virtcontainers/types"
    19  	"github.com/stretchr/testify/assert"
    20  )
    21  
    22  const (
    23  	acrnArchBaseAcrnPath    = "/usr/bin/acrn"
    24  	acrnArchBaseAcrnCtlPath = "/usr/bin/acrnctl"
    25  )
    26  
    27  var acrnArchBaseKernelParamsNonDebug = []Param{
    28  	{"quiet", ""},
    29  }
    30  
    31  var acrnArchBaseKernelParamsDebug = []Param{
    32  	{"debug", ""},
    33  }
    34  
    35  var acrnArchBaseKernelParams = []Param{
    36  	{"root", "/dev/vda"},
    37  }
    38  
    39  func newAcrnArchBase() *acrnArchBase {
    40  	return &acrnArchBase{
    41  		path:                 acrnArchBaseAcrnPath,
    42  		ctlpath:              acrnArchBaseAcrnCtlPath,
    43  		kernelParamsNonDebug: acrnArchBaseKernelParamsNonDebug,
    44  		kernelParamsDebug:    acrnArchBaseKernelParamsDebug,
    45  		kernelParams:         acrnArchBaseKernelParams,
    46  	}
    47  }
    48  
    49  func TestAcrnArchBaseAcrnPaths(t *testing.T) {
    50  	assert := assert.New(t)
    51  	acrnArchBase := newAcrnArchBase()
    52  
    53  	p, err := acrnArchBase.acrnPath()
    54  	assert.NoError(err)
    55  	assert.Equal(p, acrnArchBaseAcrnPath)
    56  
    57  	ctlp, err := acrnArchBase.acrnctlPath()
    58  	assert.NoError(err)
    59  	assert.Equal(ctlp, acrnArchBaseAcrnCtlPath)
    60  }
    61  
    62  func TestAcrnArchBaseKernelParameters(t *testing.T) {
    63  	assert := assert.New(t)
    64  	acrnArchBase := newAcrnArchBase()
    65  
    66  	// with debug params
    67  	expectedParams := acrnArchBaseKernelParams
    68  	debugParams := acrnArchBaseKernelParamsDebug
    69  	expectedParams = append(expectedParams, debugParams...)
    70  	p := acrnArchBase.kernelParameters(true)
    71  	assert.Equal(expectedParams, p)
    72  
    73  	// with non-debug params
    74  	expectedParams = acrnArchBaseKernelParams
    75  	nonDebugParams := acrnArchBaseKernelParamsNonDebug
    76  	expectedParams = append(expectedParams, nonDebugParams...)
    77  	p = acrnArchBase.kernelParameters(false)
    78  	assert.Equal(expectedParams, p)
    79  }
    80  
    81  func TestAcrnArchBaseCapabilities(t *testing.T) {
    82  	assert := assert.New(t)
    83  	acrnArchBase := newAcrnArchBase()
    84  
    85  	c := acrnArchBase.capabilities()
    86  	assert.True(c.IsBlockDeviceSupported())
    87  	assert.True(c.IsBlockDeviceHotplugSupported())
    88  	assert.False(c.IsFsSharingSupported())
    89  }
    90  
    91  func TestAcrnArchBaseMemoryTopology(t *testing.T) {
    92  	assert := assert.New(t)
    93  	acrnArchBase := newAcrnArchBase()
    94  
    95  	mem := uint64(8192)
    96  
    97  	expectedMemory := Memory{
    98  		Size: fmt.Sprintf("%dM", mem),
    99  	}
   100  
   101  	m := acrnArchBase.memoryTopology(mem)
   102  	assert.Equal(expectedMemory, m)
   103  }
   104  
   105  func TestAcrnArchBaseAppendConsoles(t *testing.T) {
   106  	var devices []Device
   107  	assert := assert.New(t)
   108  	acrnArchBase := newAcrnArchBase()
   109  
   110  	path := filepath.Join(filepath.Join(fs.MockRunStoragePath(), sandboxID), consoleSocket)
   111  
   112  	expectedOut := []Device{
   113  		ConsoleDevice{
   114  			Name:     "console0",
   115  			Backend:  Socket,
   116  			PortType: ConsoleBE,
   117  			Path:     path,
   118  		},
   119  	}
   120  
   121  	devices = acrnArchBase.appendConsole(devices, path)
   122  	assert.Equal(expectedOut, devices)
   123  }
   124  
   125  func TestAcrnArchBaseAppendImage(t *testing.T) {
   126  	var devices []Device
   127  	assert := assert.New(t)
   128  	acrnArchBase := newAcrnArchBase()
   129  
   130  	image, err := ioutil.TempFile("", "img")
   131  	assert.NoError(err)
   132  	defer os.Remove(image.Name())
   133  	err = image.Close()
   134  	assert.NoError(err)
   135  
   136  	devices, err = acrnArchBase.appendImage(devices, image.Name())
   137  	assert.NoError(err)
   138  	assert.Len(devices, 1)
   139  
   140  	expectedOut := []Device{
   141  		BlockDevice{
   142  			FilePath: image.Name(),
   143  			Index:    0,
   144  		},
   145  	}
   146  
   147  	assert.Equal(expectedOut, devices)
   148  }
   149  
   150  func TestAcrnArchBaseAppendBridges(t *testing.T) {
   151  	function := 0
   152  	emul := acrnHostBridge
   153  	config := ""
   154  
   155  	var devices []Device
   156  	assert := assert.New(t)
   157  	acrnArchBase := newAcrnArchBase()
   158  
   159  	devices = acrnArchBase.appendBridges(devices)
   160  	assert.Len(devices, 1)
   161  
   162  	expectedOut := []Device{
   163  		BridgeDevice{
   164  			Function: function,
   165  			Emul:     emul,
   166  			Config:   config,
   167  		},
   168  	}
   169  
   170  	assert.Equal(expectedOut, devices)
   171  }
   172  
   173  func TestAcrnArchBaseAppendLpcDevice(t *testing.T) {
   174  	function := 0
   175  	emul := acrnLPCDev
   176  
   177  	var devices []Device
   178  	assert := assert.New(t)
   179  	acrnArchBase := newAcrnArchBase()
   180  
   181  	devices = acrnArchBase.appendLPC(devices)
   182  	assert.Len(devices, 1)
   183  
   184  	expectedOut := []Device{
   185  		LPCDevice{
   186  			Function: function,
   187  			Emul:     emul,
   188  		},
   189  	}
   190  
   191  	assert.Equal(expectedOut, devices)
   192  }
   193  
   194  func testAcrnArchBaseAppend(t *testing.T, structure interface{}, expected []Device) {
   195  	var devices []Device
   196  	var err error
   197  	assert := assert.New(t)
   198  	acrnArchBase := newAcrnArchBase()
   199  
   200  	switch s := structure.(type) {
   201  	case types.Socket:
   202  		devices = acrnArchBase.appendSocket(devices, s)
   203  	case config.BlockDrive:
   204  		devices = acrnArchBase.appendBlockDevice(devices, s)
   205  	}
   206  
   207  	assert.NoError(err)
   208  	assert.Equal(devices, expected)
   209  }
   210  
   211  func TestAcrnArchBaseAppendSocket(t *testing.T) {
   212  	name := "archserial.test"
   213  	hostPath := "/tmp/archserial.sock"
   214  
   215  	expectedOut := []Device{
   216  		ConsoleDevice{
   217  			Name:     name,
   218  			Backend:  Socket,
   219  			PortType: SerialBE,
   220  			Path:     hostPath,
   221  		},
   222  	}
   223  
   224  	socket := types.Socket{
   225  		HostPath: hostPath,
   226  		Name:     name,
   227  	}
   228  
   229  	testAcrnArchBaseAppend(t, socket, expectedOut)
   230  }
   231  
   232  func TestAcrnArchBaseAppendBlockDevice(t *testing.T) {
   233  	path := "/tmp/archtest.img"
   234  	index := 5
   235  
   236  	expectedOut := []Device{
   237  		BlockDevice{
   238  			FilePath: path,
   239  			Index:    index,
   240  		},
   241  	}
   242  
   243  	drive := config.BlockDrive{
   244  		File:  path,
   245  		Index: index,
   246  	}
   247  
   248  	testAcrnArchBaseAppend(t, drive, expectedOut)
   249  }
   250  
   251  func TestAcrnArchBaseAppendNetwork(t *testing.T) {
   252  	var devices []Device
   253  	assert := assert.New(t)
   254  	acrnArchBase := newAcrnArchBase()
   255  
   256  	macAddr := net.HardwareAddr{0x02, 0x00, 0xCA, 0xFE, 0x00, 0x04}
   257  
   258  	vethEp := &VethEndpoint{
   259  		NetPair: NetworkInterfacePair{
   260  			TapInterface: TapInterface{
   261  				ID:   "uniqueTestID0",
   262  				Name: "br0_kata",
   263  				TAPIface: NetworkInterface{
   264  					Name: "tap0_kata",
   265  				},
   266  			},
   267  			VirtIface: NetworkInterface{
   268  				Name:     "eth0",
   269  				HardAddr: macAddr.String(),
   270  			},
   271  			NetInterworkingModel: DefaultNetInterworkingModel,
   272  		},
   273  		EndpointType: VethEndpointType,
   274  	}
   275  
   276  	macvtapEp := &MacvtapEndpoint{
   277  		EndpointType: MacvtapEndpointType,
   278  		EndpointProperties: NetworkInfo{
   279  			Iface: NetlinkIface{
   280  				Type: "macvtap",
   281  			},
   282  		},
   283  	}
   284  
   285  	expectedOut := []Device{
   286  		NetDevice{
   287  			Type:       TAP,
   288  			IFName:     vethEp.NetPair.TAPIface.Name,
   289  			MACAddress: vethEp.NetPair.TAPIface.HardAddr,
   290  		},
   291  		NetDevice{
   292  			Type:       MACVTAP,
   293  			IFName:     macvtapEp.Name(),
   294  			MACAddress: macvtapEp.HardwareAddr(),
   295  		},
   296  	}
   297  
   298  	devices = acrnArchBase.appendNetwork(devices, vethEp)
   299  	devices = acrnArchBase.appendNetwork(devices, macvtapEp)
   300  	assert.Equal(expectedOut, devices)
   301  }