github.com/vmware/govmomi@v0.51.0/simulator/example_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_test
     6  
     7  import (
     8  	"context"
     9  	"fmt"
    10  	"log"
    11  
    12  	"github.com/vmware/govmomi"
    13  	"github.com/vmware/govmomi/find"
    14  	"github.com/vmware/govmomi/object"
    15  	"github.com/vmware/govmomi/session"
    16  	"github.com/vmware/govmomi/simulator"
    17  	"github.com/vmware/govmomi/vim25"
    18  	"github.com/vmware/govmomi/vim25/mo"
    19  	"github.com/vmware/govmomi/vim25/types"
    20  )
    21  
    22  // Example boilerplate for starting a simulator initialized with an ESX model.
    23  func ExampleESX() {
    24  	ctx := context.Background()
    25  
    26  	// ESXi model + initial set of objects (VMs, network, datastore)
    27  	model := simulator.ESX()
    28  
    29  	defer model.Remove()
    30  	err := model.Create()
    31  	if err != nil {
    32  		log.Fatal(err)
    33  	}
    34  
    35  	s := model.Service.NewServer()
    36  	defer s.Close()
    37  
    38  	c, _ := govmomi.NewClient(ctx, s.URL, true)
    39  
    40  	fmt.Printf("%s with %d host", c.Client.ServiceContent.About.ApiType, model.Count().Host)
    41  	// Output: HostAgent with 1 host
    42  }
    43  
    44  // Example for starting a simulator with empty inventory, similar to a fresh install of vCenter.
    45  func ExampleModel() {
    46  	ctx := context.Background()
    47  
    48  	model := simulator.VPX()
    49  	model.Datacenter = 0 // No DC == no inventory
    50  
    51  	defer model.Remove()
    52  	err := model.Create()
    53  	if err != nil {
    54  		log.Fatal(err)
    55  	}
    56  
    57  	s := model.Service.NewServer()
    58  	defer s.Close()
    59  
    60  	c, _ := govmomi.NewClient(ctx, s.URL, true)
    61  
    62  	fmt.Printf("%s with %d hosts", c.Client.ServiceContent.About.ApiType, model.Count().Host)
    63  	// Output: VirtualCenter with 0 hosts
    64  }
    65  
    66  // Example boilerplate for starting a simulator initialized with a vCenter model.
    67  func ExampleVPX() {
    68  	ctx := context.Background()
    69  
    70  	// vCenter model + initial set of objects (cluster, hosts, VMs, network, datastore, etc)
    71  	model := simulator.VPX()
    72  
    73  	defer model.Remove()
    74  	err := model.Create()
    75  	if err != nil {
    76  		log.Fatal(err)
    77  	}
    78  
    79  	s := model.Service.NewServer()
    80  	defer s.Close()
    81  
    82  	c, _ := govmomi.NewClient(ctx, s.URL, true)
    83  
    84  	fmt.Printf("%s with %d hosts", c.Client.ServiceContent.About.ApiType, model.Count().Host)
    85  	// Output: VirtualCenter with 4 hosts
    86  }
    87  
    88  // Run simplifies startup/cleanup of a simulator instance for example or testing purposes.
    89  func ExampleModel_Run() {
    90  	err := simulator.VPX().Run(func(ctx context.Context, c *vim25.Client) error {
    91  		// Client has connected and logged in to a new simulator instance.
    92  		// Server.Close and Model.Remove are called when this func returns.
    93  		s, err := session.NewManager(c).UserSession(ctx)
    94  		if err != nil {
    95  			return err
    96  		}
    97  		fmt.Print(s.UserName)
    98  		return nil
    99  	})
   100  	if err != nil {
   101  		log.Fatal(err)
   102  	}
   103  	// Output: user
   104  }
   105  
   106  // Test simplifies startup/cleanup of a simulator instance for testing purposes.
   107  func ExampleTest() {
   108  	simulator.Test(func(ctx context.Context, c *vim25.Client) {
   109  		// Client has connected and logged in to a new simulator instance.
   110  		// Server.Close and Model.Remove are called when this func returns.
   111  		s, err := session.NewManager(c).UserSession(ctx)
   112  		if err != nil {
   113  			log.Fatal(err)
   114  		}
   115  		fmt.Print(s.UserName)
   116  	})
   117  	// Output: user
   118  }
   119  
   120  // Folder.AddOpaqueNetwork can be used to create an NSX backed OpaqueNetwork.
   121  func ExampleFolder_AddOpaqueNetwork() {
   122  	simulator.Run(func(ctx context.Context, c *vim25.Client) error {
   123  		sctx := ctx.(*simulator.Context)
   124  		finder := find.NewFinder(c)
   125  
   126  		// Find the network folder via vSphere API
   127  		obj, err := finder.Folder(ctx, "network")
   128  		if err != nil {
   129  			return err
   130  		}
   131  
   132  		// Get vcsim's network Folder object
   133  		folder := sctx.Map.Get(obj.Reference()).(*simulator.Folder)
   134  
   135  		spec := types.OpaqueNetworkSummary{
   136  			NetworkSummary: types.NetworkSummary{
   137  				Name: "my-nsx-network",
   138  			},
   139  			OpaqueNetworkId:   "my-nsx-id",
   140  			OpaqueNetworkType: "nsx.LogicalSwitch",
   141  		}
   142  
   143  		// Add NSX backed OpaqueNetwork, calling the simulator.Folder method directly.
   144  		err = folder.AddOpaqueNetwork(sctx, spec)
   145  		if err != nil {
   146  			return err
   147  		}
   148  
   149  		// Find the OpaqueNetwork via vSphere API
   150  		net, err := finder.Network(ctx, spec.Name)
   151  		if err != nil {
   152  			return err
   153  		}
   154  
   155  		nsx := net.(*object.OpaqueNetwork)
   156  		summary, err := nsx.Summary(ctx)
   157  		if err != nil {
   158  			return err
   159  		}
   160  
   161  		// The summary fields should match those of the spec used to create it
   162  		fmt.Printf("%s: %s", nsx.Name(), summary.OpaqueNetworkId)
   163  		return nil
   164  	})
   165  	// Output: my-nsx-network: my-nsx-id
   166  }
   167  
   168  // AddDVPortgroup against vcsim can create both standard and nsx backed DistributedVirtualPortgroup networks
   169  func ExampleDistributedVirtualSwitch_AddDVPortgroupTask() {
   170  	simulator.Run(func(ctx context.Context, c *vim25.Client) error {
   171  		finder := find.NewFinder(c)
   172  
   173  		dvs0, err := finder.Network(ctx, "DVS0")
   174  		if err != nil {
   175  			return err
   176  		}
   177  
   178  		spec := types.DVPortgroupConfigSpec{
   179  			Name:              "my-nsx-dvpg",
   180  			LogicalSwitchUuid: "my-nsx-id",
   181  		}
   182  
   183  		dvs := dvs0.(*object.DistributedVirtualSwitch)
   184  		task, err := dvs.AddPortgroup(ctx, []types.DVPortgroupConfigSpec{spec})
   185  		if err != nil {
   186  			return err
   187  		}
   188  		if err = task.Wait(ctx); err != nil {
   189  			return err
   190  		}
   191  
   192  		pg0, err := finder.Network(ctx, spec.Name)
   193  		if err != nil {
   194  			return err
   195  		}
   196  
   197  		pg := pg0.(*object.DistributedVirtualPortgroup)
   198  
   199  		var props mo.DistributedVirtualPortgroup
   200  		err = pg.Properties(ctx, pg.Reference(), []string{"config"}, &props)
   201  		if err != nil {
   202  			return err
   203  		}
   204  
   205  		fmt.Printf("%s: %s %s", pg.Name(), props.Config.BackingType, props.Config.LogicalSwitchUuid)
   206  
   207  		return nil
   208  	})
   209  	// Output: my-nsx-dvpg: nsx my-nsx-id
   210  }