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 }