github.com/vmware/govmomi@v0.51.0/vapi/library/finder/path_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 finder_test
     6  
     7  import (
     8  	"context"
     9  	"fmt"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  
    14  	"github.com/vmware/govmomi/find"
    15  	"github.com/vmware/govmomi/object"
    16  	"github.com/vmware/govmomi/simulator"
    17  	"github.com/vmware/govmomi/vapi/library"
    18  	"github.com/vmware/govmomi/vapi/library/finder"
    19  	"github.com/vmware/govmomi/vapi/rest"
    20  	_ "github.com/vmware/govmomi/vapi/simulator"
    21  	"github.com/vmware/govmomi/vim25"
    22  	"github.com/vmware/govmomi/vim25/mo"
    23  	"github.com/vmware/govmomi/vim25/types"
    24  )
    25  
    26  func TestResolveLibraryItemStorage(t *testing.T) {
    27  
    28  	testCases := []struct {
    29  		name                             string
    30  		nilDatacenter                    bool
    31  		datastoreMap                     map[string]mo.Datastore
    32  		topLevelDirectoryCreateSupported *bool
    33  	}{
    34  		{
    35  			name:                             "Nil datacenter and nil topLevelCreate",
    36  			nilDatacenter:                    true,
    37  			datastoreMap:                     nil,
    38  			topLevelDirectoryCreateSupported: nil,
    39  		},
    40  		{
    41  			name:                             "Nil datacenter and false topLevelCreate",
    42  			nilDatacenter:                    true,
    43  			datastoreMap:                     nil,
    44  			topLevelDirectoryCreateSupported: types.New(false),
    45  		},
    46  		{
    47  			name:                             "Nil datacenter and true topLevelCreate",
    48  			nilDatacenter:                    true,
    49  			datastoreMap:                     nil,
    50  			topLevelDirectoryCreateSupported: types.New(true),
    51  		},
    52  		{
    53  			name:                             "Non-nil datacenter and nil topLevelCreate",
    54  			nilDatacenter:                    false,
    55  			datastoreMap:                     nil,
    56  			topLevelDirectoryCreateSupported: nil,
    57  		},
    58  		{
    59  			name:                             "Non-Nil datacenter and false topLevelCreate",
    60  			nilDatacenter:                    false,
    61  			datastoreMap:                     nil,
    62  			topLevelDirectoryCreateSupported: types.New(false),
    63  		},
    64  		{
    65  			name:                             "Non-Nil datacenter and true topLevelCreate",
    66  			nilDatacenter:                    false,
    67  			datastoreMap:                     nil,
    68  			topLevelDirectoryCreateSupported: types.New(true),
    69  		},
    70  		{
    71  			name:                             "Nil datastoreMap",
    72  			nilDatacenter:                    true,
    73  			datastoreMap:                     nil,
    74  			topLevelDirectoryCreateSupported: nil,
    75  		},
    76  		{
    77  			name:                             "Non-Nil datastoreMap and true topLevelCreate",
    78  			nilDatacenter:                    true,
    79  			datastoreMap:                     map[string]mo.Datastore{},
    80  			topLevelDirectoryCreateSupported: types.New(true),
    81  		},
    82  	}
    83  
    84  	for i := range testCases {
    85  		tc := testCases[i]
    86  
    87  		t.Run(tc.name, func(t *testing.T) {
    88  
    89  			simulator.Test(func(ctx context.Context, vc *vim25.Client) {
    90  
    91  				vf := find.NewFinder(vc)
    92  				rc := rest.NewClient(vc)
    93  				lf := finder.NewPathFinder(library.NewManager(rc), vc)
    94  
    95  				dsName := "LocalDS_0"
    96  				if v := tc.topLevelDirectoryCreateSupported; v != nil && *v == false {
    97  					dsName = "vsanDatastore"
    98  
    99  					err := enableVSAN(ctx, vf)
   100  					if !assert.NoError(t, err) {
   101  						t.FailNow()
   102  					}
   103  				}
   104  
   105  				dc, err := vf.Datacenter(ctx, "*")
   106  				if !assert.NoError(t, err) || !assert.NotNil(t, dc) {
   107  					t.FailNow()
   108  				}
   109  
   110  				ds, err := vf.Datastore(ctx, dsName)
   111  				if !assert.NoError(t, err) || !assert.NotNil(t, ds) {
   112  					t.FailNow()
   113  				}
   114  
   115  				var (
   116  					dsURL string
   117  					moDS  mo.Datastore
   118  				)
   119  				if !assert.NoError(
   120  					t,
   121  					ds.Properties(
   122  						ctx,
   123  						ds.Reference(),
   124  						[]string{"name", "summary.url"},
   125  						&moDS)) {
   126  					t.FailNow()
   127  				}
   128  
   129  				dsURL = moDS.Summary.Url
   130  
   131  				storage := []library.Storage{
   132  					{
   133  						StorageBacking: library.StorageBacking{
   134  							DatastoreID: ds.Reference().Value,
   135  							Type:        "DATASTORE",
   136  						},
   137  						StorageURIs: []string{
   138  							fmt.Sprintf("%s/contentlib-${lib_id}/${item_id}/${file_1_name}_${file_1_id}.iso", dsURL),
   139  							fmt.Sprintf("%s/contentlib-${lib_id}/${item_id}/${file_2_name}_${file_2_id}.iso?serverId=${server_id}", dsURL),
   140  						},
   141  					},
   142  				}
   143  
   144  				nilDSM := tc.datastoreMap == nil
   145  
   146  				if !assert.NoError(
   147  					t,
   148  					lf.ResolveLibraryItemStorage(
   149  						ctx,
   150  						dc,
   151  						tc.datastoreMap,
   152  						storage)) {
   153  
   154  					t.FailNow()
   155  				}
   156  
   157  				assert.Len(t, storage, 1)
   158  				assert.Len(t, storage[0].StorageURIs, 2)
   159  
   160  				if nilDSM {
   161  					assert.Nil(t, tc.datastoreMap)
   162  				} else if assert.NotNil(t, tc.datastoreMap) {
   163  					if assert.Len(t, tc.datastoreMap, 1) {
   164  						dsv := ds.Reference().Value
   165  						if assert.Contains(t, tc.datastoreMap, dsv) {
   166  							ds := tc.datastoreMap[dsv]
   167  							assert.Equal(t, ds.Name, dsName)
   168  							assert.Equal(t, ds.Summary.Url, dsURL)
   169  							assert.Equal(t, ds.Capability.TopLevelDirectoryCreateSupported, tc.topLevelDirectoryCreateSupported)
   170  						}
   171  					}
   172  				}
   173  
   174  				for _, s := range storage {
   175  					for _, u := range s.StorageURIs {
   176  						var path object.DatastorePath
   177  						path.FromString(u)
   178  						assert.Equal(t, path.Datastore, dsName)
   179  						assert.NotContains(t, u, "?")
   180  					}
   181  				}
   182  			})
   183  		})
   184  	}
   185  }
   186  
   187  // TODO(dougm) consider vSAN enablement via simulator.Model
   188  func enableVSAN(ctx context.Context, vf *find.Finder) error {
   189  	cluster, err := vf.DefaultClusterComputeResource(ctx)
   190  	if err != nil {
   191  		return err
   192  	}
   193  
   194  	task, err := cluster.Reconfigure(ctx, &types.ClusterConfigSpecEx{
   195  		VsanConfig: &types.VsanClusterConfigInfo{
   196  			Enabled: types.NewBool(true),
   197  		},
   198  	}, true)
   199  
   200  	if err != nil {
   201  		return err
   202  	}
   203  
   204  	return task.Wait(ctx)
   205  }