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  }