github.com/vmware/govmomi@v0.43.0/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 }