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

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