github.com/vmware/govmomi@v0.51.0/simulator/container_host_system_test.go (about)

     1  // © Broadcom. All Rights Reserved.
     2  // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
     3  // SPDX-License-Identifier: Apache-2.0
     4  
     5  package simulator
     6  
     7  import (
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/vmware/govmomi/simulator/esx"
    14  	"github.com/vmware/govmomi/test"
    15  	"github.com/vmware/govmomi/vim25/methods"
    16  	"github.com/vmware/govmomi/vim25/types"
    17  )
    18  
    19  func TestHostOptionManager(t *testing.T) {
    20  	m := ESX()
    21  
    22  	defer m.Remove()
    23  
    24  	err := m.Create()
    25  	if err != nil {
    26  		t.Fatal(err)
    27  	}
    28  
    29  	ctx := m.Service.Context
    30  
    31  	hs := NewHostSystem(ctx, esx.HostSystem)
    32  
    33  	advOpts, ok := m.Map().Get(hs.ConfigManager.AdvancedOption.Reference()).(*OptionManager)
    34  	require.True(t, ok, "Expected to inflate OptionManager from reference")
    35  
    36  	option := &types.OptionValue{
    37  		Key:   "TEST.hello",
    38  		Value: "world",
    39  	}
    40  
    41  	fault := advOpts.QueryOptions(&types.QueryOptions{Name: option.Key}).(*methods.QueryOptionsBody).Fault()
    42  	require.IsType(t, &types.InvalidName{}, fault.VimFault(), "Expected new host from template not to have test option set")
    43  
    44  	fault = advOpts.UpdateOptions(&types.UpdateOptions{ChangedValue: []types.BaseOptionValue{option}}).Fault()
    45  	require.Nil(t, fault, "Expected setting test option to succeed")
    46  
    47  	queryRes := advOpts.QueryOptions(&types.QueryOptions{Name: option.Key}).(*methods.QueryOptionsBody).Res
    48  	require.Equal(t, 1, len(queryRes.Returnval), "Expected query of set option to succeed")
    49  	require.Equal(t, option.Value, queryRes.Returnval[0].GetOptionValue().Value, "Expected set value")
    50  
    51  	option2 := &types.OptionValue{
    52  		Key:   "TEST.hello",
    53  		Value: "goodbye",
    54  	}
    55  
    56  	fault = advOpts.UpdateOptions(&types.UpdateOptions{ChangedValue: []types.BaseOptionValue{option2}}).Fault()
    57  	require.Nil(t, fault, "Expected update of test option to succeed")
    58  
    59  	queryRes = advOpts.QueryOptions(&types.QueryOptions{Name: option2.Key}).(*methods.QueryOptionsBody).Res
    60  	require.Equal(t, 1, len(queryRes.Returnval), "Expected query of updated option to succeed")
    61  	require.Equal(t, option2.Value, queryRes.Returnval[0].GetOptionValue().Value, "Expected updated value")
    62  
    63  	hs.configure(ctx, types.HostConnectSpec{}, true)
    64  	assert.Nil(t, hs.sh, "Expected not to have container backing if not requested")
    65  }
    66  
    67  func TestSyncWithOptionsStruct(t *testing.T) {
    68  	m := ESX()
    69  
    70  	defer m.Remove()
    71  
    72  	err := m.Create()
    73  	if err != nil {
    74  		t.Fatal(err)
    75  	}
    76  
    77  	ctx := m.Service.Context
    78  	hs := NewHostSystem(ctx, esx.HostSystem)
    79  
    80  	advOpts, ok := m.Map().Get(hs.ConfigManager.AdvancedOption.Reference()).(*OptionManager)
    81  	require.True(t, ok, "Expected to inflate OptionManager from reference")
    82  
    83  	option := &types.OptionValue{
    84  		Key:   "TEST.hello",
    85  		Value: "world",
    86  	}
    87  
    88  	fault := advOpts.UpdateOptions(&types.UpdateOptions{ChangedValue: []types.BaseOptionValue{option}}).Fault()
    89  	require.Nil(t, fault, "Expected setting test option to succeed")
    90  
    91  	assert.Equal(t, option, hs.Config.Option[1], "Expected mirror to reflect changes")
    92  }
    93  
    94  func TestPerHostOptionManager(t *testing.T) {
    95  	m := ESX()
    96  
    97  	defer m.Remove()
    98  
    99  	err := m.Create()
   100  	if err != nil {
   101  		t.Fatal(err)
   102  	}
   103  
   104  	ctx := m.Service.Context
   105  	hs := NewHostSystem(ctx, esx.HostSystem)
   106  	hs2 := NewHostSystem(ctx, esx.HostSystem)
   107  
   108  	advOpts, ok := m.Map().Get(hs.ConfigManager.AdvancedOption.Reference()).(*OptionManager)
   109  	require.True(t, ok, "Expected to inflate OptionManager from reference")
   110  
   111  	advOpts2 := m.Map().Get(hs2.ConfigManager.AdvancedOption.Reference()).(*OptionManager)
   112  
   113  	option := &types.OptionValue{
   114  		Key:   "TEST.hello",
   115  		Value: "world",
   116  	}
   117  
   118  	fault := advOpts.QueryOptions(&types.QueryOptions{Name: option.Key}).(*methods.QueryOptionsBody).Fault()
   119  	require.IsType(t, &types.InvalidName{}, fault.VimFault(), "Expected host from template not to have test option set")
   120  
   121  	fault = advOpts.UpdateOptions(&types.UpdateOptions{ChangedValue: []types.BaseOptionValue{option}}).Fault()
   122  	require.Nil(t, fault, "Expected setting test option to succeed")
   123  
   124  	queryRes := advOpts.QueryOptions(&types.QueryOptions{Name: option.Key}).(*methods.QueryOptionsBody).Res
   125  	require.Equal(t, 1, len(queryRes.Returnval), "Expected query of set option to succeed")
   126  	require.Equal(t, option.Value, queryRes.Returnval[0].GetOptionValue().Value, "Expected set value")
   127  
   128  	fault = advOpts2.QueryOptions(&types.QueryOptions{Name: option.Key}).(*methods.QueryOptionsBody).Fault()
   129  	require.IsType(t, &types.InvalidName{}, fault.VimFault(), "Expected second host to be unchanged")
   130  
   131  	option2 := &types.OptionValue{
   132  		Key:   "TEST.hello",
   133  		Value: "goodbye",
   134  	}
   135  
   136  	fault = advOpts.UpdateOptions(&types.UpdateOptions{ChangedValue: []types.BaseOptionValue{option2}}).Fault()
   137  	require.Nil(t, fault, "Expected update of test option to succeed")
   138  
   139  	queryRes = advOpts.QueryOptions(&types.QueryOptions{Name: option2.Key}).(*methods.QueryOptionsBody).Res
   140  	require.Equal(t, 1, len(queryRes.Returnval), "Expected query of updated option to succeed")
   141  	require.Equal(t, option2.Value, queryRes.Returnval[0].GetOptionValue().Value, "Expected updated value")
   142  
   143  	assert.Equal(t, option2, hs.Config.Option[1], "Expected mirror to reflect changes")
   144  
   145  	hs.configure(ctx, types.HostConnectSpec{}, true)
   146  	assert.Nil(t, hs.sh, "Expected not to have container backing if not requested")
   147  
   148  	hs3 := NewHostSystem(ctx, esx.HostSystem)
   149  
   150  	advOpts3 := m.Map().Get(hs3.ConfigManager.AdvancedOption.Reference()).(*OptionManager)
   151  	fault = advOpts3.QueryOptions(&types.QueryOptions{Name: option.Key}).(*methods.QueryOptionsBody).Fault()
   152  	require.IsType(t, &types.InvalidName{}, fault.VimFault(), "Expected host created after update not to inherit change")
   153  
   154  }
   155  
   156  func TestHostContainerBacking(t *testing.T) {
   157  	if !test.HasDocker() {
   158  		t.Skip("requires docker on linux")
   159  	}
   160  
   161  	m := ESX()
   162  
   163  	defer m.Remove()
   164  
   165  	err := m.Create()
   166  	if err != nil {
   167  		t.Fatal(err)
   168  	}
   169  
   170  	ctx := m.Service.Context
   171  
   172  	hs := NewHostSystem(ctx, esx.HostSystem)
   173  	hs.configureContainerBacking(ctx, "alpine", defaultSimVolumes, "vcsim-mgmt-underlay")
   174  
   175  	details, err := hs.getNetConfigInterface(ctx, "management")
   176  	assert.NoError(t, err, "Expected no error from management netconfig check")
   177  	assert.Equal(t, "0.0.0.0", details.vmk.Spec.Ip.IpAddress, "Expected IP to be empty prior to container creation")
   178  
   179  	hs.configure(ctx, types.HostConnectSpec{}, true)
   180  
   181  	assert.NoError(t, err, "Expected no error from management netconfig check")
   182  	assert.NotEqual(t, "0.0.0.0", details.vmk.Spec.Ip.IpAddress, "Expected management IP to set after container creation")
   183  
   184  	hs.sh.remove(ctx)
   185  }
   186  
   187  func TestMultipleSimHost(t *testing.T) {
   188  	if !test.HasDocker() {
   189  		t.Skip("requires docker on linux")
   190  	}
   191  
   192  	m := ESX()
   193  
   194  	defer m.Remove()
   195  
   196  	err := m.Create()
   197  	require.Nil(t, err, "expected successful creation of model")
   198  
   199  	ctx := m.Service.Context
   200  
   201  	hs := NewHostSystem(ctx, esx.HostSystem)
   202  	hs.configureContainerBacking(ctx, "alpine", defaultSimVolumes)
   203  
   204  	hs2 := NewHostSystem(ctx, esx.HostSystem)
   205  	hs2.configureContainerBacking(ctx, "alpine", defaultSimVolumes)
   206  
   207  	details, err := hs.getNetConfigInterface(ctx, "management")
   208  	assert.NoError(t, err, "Expected no error from management netconfig check")
   209  	assert.Equal(t, "0.0.0.0", details.vmk.Spec.Ip.IpAddress, "Expected IP to be empty prior to container creation")
   210  
   211  	hs.configure(ctx, types.HostConnectSpec{}, true)
   212  
   213  	details2, err := hs2.getNetConfigInterface(ctx, "management")
   214  	assert.NoError(t, err, "Expected no error from management netconfig check")
   215  	assert.Equal(t, "0.0.0.0", details2.vmk.Spec.Ip.IpAddress, "Expected IP to be empty prior to container creation")
   216  
   217  	hs2.configure(ctx, types.HostConnectSpec{}, true)
   218  
   219  	assert.NotEqual(t, details.vmk.Spec.Ip.IpAddress, details2.vmk.Spec.Ip.IpAddress, "Expected hosts to get different IPs")
   220  
   221  	hs.sh.remove(ctx)
   222  
   223  	// TODO: assert one container plus volumes left - need to wait for
   224  	// https://github.com/containers/podman/issues/19219 to be fixed for podman to work - otherwise all volumes get removed
   225  	// with the first host removed
   226  	hs2.sh.remove(ctx)
   227  }