github.com/vmware/govmomi@v0.51.0/simulator/host_network_system.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 "github.com/vmware/govmomi/vim25/methods" 9 "github.com/vmware/govmomi/vim25/mo" 10 "github.com/vmware/govmomi/vim25/soap" 11 "github.com/vmware/govmomi/vim25/types" 12 ) 13 14 type HostNetworkSystem struct { 15 mo.HostNetworkSystem 16 17 Host *mo.HostSystem 18 19 types.QueryNetworkHintResponse 20 } 21 22 func NewHostNetworkSystem(host *mo.HostSystem) *HostNetworkSystem { 23 return &HostNetworkSystem{ 24 Host: host, 25 HostNetworkSystem: mo.HostNetworkSystem{ 26 NetworkInfo: &types.HostNetworkInfo{ 27 Vswitch: []types.HostVirtualSwitch{ 28 { 29 Name: "vSwitch0", 30 Portgroup: []string{"VM Network"}, 31 }, 32 }, 33 Portgroup: host.Config.Network.Portgroup, 34 }, 35 }, 36 } 37 } 38 39 func (s *HostNetworkSystem) init(r *Registry) { 40 for _, obj := range r.objects { 41 if h, ok := obj.(*HostSystem); ok { 42 if h.ConfigManager.NetworkSystem.Value == s.Self.Value { 43 s.Host = &h.HostSystem 44 } 45 } 46 } 47 } 48 49 func (s *HostNetworkSystem) folder(ctx *Context) *Folder { 50 f := ctx.Map.getEntityDatacenter(s.Host).NetworkFolder 51 return ctx.Map.Get(f).(*Folder) 52 } 53 54 func (s *HostNetworkSystem) AddVirtualSwitch(c *types.AddVirtualSwitch) soap.HasFault { 55 r := &methods.AddVirtualSwitchBody{} 56 57 for _, vswitch := range s.NetworkInfo.Vswitch { 58 if vswitch.Name == c.VswitchName { 59 r.Fault_ = Fault("", &types.AlreadyExists{Name: c.VswitchName}) 60 return r 61 } 62 } 63 64 s.NetworkInfo.Vswitch = append(s.NetworkInfo.Vswitch, types.HostVirtualSwitch{ 65 Name: c.VswitchName, 66 }) 67 68 r.Res = &types.AddVirtualSwitchResponse{} 69 70 return r 71 } 72 73 func (s *HostNetworkSystem) RemoveVirtualSwitch(c *types.RemoveVirtualSwitch) soap.HasFault { 74 r := &methods.RemoveVirtualSwitchBody{} 75 76 vs := s.NetworkInfo.Vswitch 77 78 for i, v := range vs { 79 if v.Name == c.VswitchName { 80 s.NetworkInfo.Vswitch = append(vs[:i], vs[i+1:]...) 81 r.Res = &types.RemoveVirtualSwitchResponse{} 82 return r 83 } 84 } 85 86 r.Fault_ = Fault("", &types.NotFound{}) 87 88 return r 89 } 90 91 func (s *HostNetworkSystem) AddPortGroup(ctx *Context, c *types.AddPortGroup) soap.HasFault { 92 var vswitch *types.HostVirtualSwitch 93 94 r := &methods.AddPortGroupBody{} 95 96 if c.Portgrp.Name == "" { 97 r.Fault_ = Fault("", &types.InvalidArgument{InvalidProperty: "name"}) 98 return r 99 } 100 101 for i := range s.NetworkInfo.Vswitch { 102 if s.NetworkInfo.Vswitch[i].Name == c.Portgrp.VswitchName { 103 vswitch = &s.NetworkInfo.Vswitch[i] 104 break 105 } 106 } 107 108 if vswitch == nil { 109 r.Fault_ = Fault("", &types.NotFound{}) 110 return r 111 } 112 113 network := &mo.Network{} 114 network.Name = c.Portgrp.Name 115 network.Entity().Name = network.Name 116 117 folder := s.folder(ctx) 118 119 if obj := ctx.Map.FindByName(c.Portgrp.Name, folder.ChildEntity); obj != nil { 120 r.Fault_ = Fault("", &types.DuplicateName{ 121 Name: c.Portgrp.Name, 122 Object: obj.Reference(), 123 }) 124 125 return r 126 } 127 128 folderPutChild(ctx, &folder.Folder, network) 129 130 vswitch.Portgroup = append(vswitch.Portgroup, c.Portgrp.Name) 131 132 s.NetworkInfo.Portgroup = append(s.NetworkInfo.Portgroup, types.HostPortGroup{ 133 Key: "key-vim.host.PortGroup-" + c.Portgrp.Name, 134 Port: nil, 135 Spec: c.Portgrp, 136 }) 137 138 r.Res = &types.AddPortGroupResponse{} 139 140 return r 141 } 142 143 func (s *HostNetworkSystem) RemovePortGroup(ctx *Context, c *types.RemovePortGroup) soap.HasFault { 144 var vswitch *types.HostVirtualSwitch 145 146 r := &methods.RemovePortGroupBody{} 147 148 for i, v := range s.NetworkInfo.Vswitch { 149 for j, pg := range v.Portgroup { 150 if pg == c.PgName { 151 vswitch = &s.NetworkInfo.Vswitch[i] 152 vswitch.Portgroup = append(vswitch.Portgroup[:j], vswitch.Portgroup[j+1:]...) 153 } 154 } 155 } 156 157 if vswitch == nil { 158 r.Fault_ = Fault("", &types.NotFound{}) 159 return r 160 } 161 162 folder := s.folder(ctx) 163 e := ctx.Map.FindByName(c.PgName, folder.ChildEntity) 164 folderRemoveChild(ctx, &folder.Folder, e.Reference()) 165 166 for i, pg := range s.NetworkInfo.Portgroup { 167 if pg.Spec.Name == c.PgName { 168 var portgroup = s.NetworkInfo.Portgroup 169 s.NetworkInfo.Portgroup = append(portgroup[:i], portgroup[i+1:]...) 170 } 171 } 172 173 r.Res = &types.RemovePortGroupResponse{} 174 175 return r 176 } 177 178 func (s *HostNetworkSystem) UpdateNetworkConfig(req *types.UpdateNetworkConfig) soap.HasFault { 179 s.NetworkConfig = &req.Config 180 181 return &methods.UpdateNetworkConfigBody{ 182 Res: &types.UpdateNetworkConfigResponse{ 183 Returnval: types.HostNetworkConfigResult{}, 184 }, 185 } 186 } 187 188 func (s *HostNetworkSystem) QueryNetworkHint(req *types.QueryNetworkHint) soap.HasFault { 189 if s.Host.Runtime.ConnectionState != types.HostSystemConnectionStateConnected { 190 return &methods.QueryNetworkHintBody{ 191 Fault_: Fault("", &types.HostNotConnected{}), 192 } 193 } 194 195 return &methods.QueryNetworkHintBody{ 196 Res: &types.QueryNetworkHintResponse{ 197 Returnval: s.QueryNetworkHintResponse.Returnval, 198 }, 199 } 200 }