Skip to content

Commit baa6897

Browse files
Merge pull request openshift#8671 from jcpowermac/OCPBUGS-36242
OCPBUGS-36242: vSphere - If the folder pre-exists do not tag
2 parents 71962a1 + a51eaa9 commit baa6897

File tree

5 files changed

+58
-93
lines changed

5 files changed

+58
-93
lines changed

pkg/asset/installconfig/vsphere/folder.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
//go:build !altinfra
2-
// +build !altinfra
3-
41
package vsphere
52

63
import (
74
"context"
5+
"errors"
86
"time"
97

8+
"github.com/vmware/govmomi/find"
109
"k8s.io/apimachinery/pkg/util/validation/field"
1110
)
1211

1312
// folderExists returns an error if a folder is specified in the vSphere platform but a folder with that name is not found in the datacenter.
1413
func folderExists(validationCtx *validationContext, folderPath string, fldPath *field.Path) field.ErrorList {
14+
var notFoundError *find.NotFoundError
1515
allErrs := field.ErrorList{}
1616
finder := validationCtx.Finder
1717
// If no folder is specified, skip this check as the folder will be created.
@@ -23,9 +23,14 @@ func folderExists(validationCtx *validationContext, folderPath string, fldPath *
2323
defer cancel()
2424

2525
folder, err := finder.Folder(ctx, folderPath)
26-
if err != nil {
26+
if err != nil && !errors.As(err, &notFoundError) {
2727
return append(allErrs, field.Invalid(fldPath, folderPath, err.Error()))
2828
}
29+
30+
// folder was not found so no privilege check can be performed
31+
if folder == nil {
32+
return allErrs
33+
}
2934
permissionGroup := permissions[permissionFolder]
3035

3136
err = comparePrivileges(ctx, validationCtx, folder.Reference(), permissionGroup)

pkg/asset/installconfig/vsphere/folder_altinfra.go

Lines changed: 0 additions & 44 deletions
This file was deleted.

pkg/asset/installconfig/vsphere/validation_test.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -361,27 +361,15 @@ func TestValidateFailureDomains(t *testing.T) {
361361
checkTags: false,
362362
expectErr: `^platform.vsphere.failureDomains.topology: Invalid value: "invalid-network": unable to find network provided$`,
363363
}, {
364-
name: "multi-zone validation - invalid folder",
364+
name: "multi-zone validation - create missing folder",
365365
failureDomain: func() *vsphere.FailureDomain {
366366
failureDomain := &validMultiVCenterPlatform().FailureDomains[0]
367-
failureDomain.Topology.Folder = "/DC0/vm/invalid-folder"
367+
failureDomain.Topology.Folder = "/DC0/vm/create-missing-folder"
368368
return failureDomain
369369
}(),
370370
validationMethod: validateFailureDomain,
371371
checkTags: false,
372-
expectErr: `^platform.vsphere.failureDomains.topology.folder: Invalid value: "/DC0/vm/invalid-folder": folder '/DC0/vm/invalid-folder' not found$`,
373-
},
374-
375-
{
376-
name: "multi-zone validation - invalid folder",
377-
failureDomain: func() *vsphere.FailureDomain {
378-
failureDomain := &validMultiVCenterPlatform().FailureDomains[0]
379-
failureDomain.Topology.Folder = "/DC0/vm/invalid-folder"
380-
return failureDomain
381-
}(),
382-
validationMethod: validateFailureDomain,
383-
checkTags: false,
384-
expectErr: `^platform.vsphere.failureDomains.topology.folder: Invalid value: "/DC0/vm/invalid-folder": folder '/DC0/vm/invalid-folder' not found$`,
372+
expectErr: ``,
385373
}, {
386374
name: "multi-zone tag categories present and tags attached",
387375
validationMethod: validateFailureDomain,

pkg/infrastructure/vsphere/clusterapi/clusterapi.go

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"path"
77
"strings"
88

9+
"github.com/vmware/govmomi/object"
910
"sigs.k8s.io/cluster-api-provider-vsphere/apis/v1beta1"
1011
"sigs.k8s.io/cluster-api-provider-vsphere/pkg/session"
1112

@@ -52,20 +53,26 @@ func initializeFoldersAndTemplates(ctx context.Context, cachedImage string, fail
5253
folderPath = folder
5354
}
5455

55-
folderMo, err := createFolder(ctx, folderPath, session)
56-
if err != nil {
57-
return fmt.Errorf("unable to create folder: %w", err)
58-
}
56+
var folderObj *object.Folder
5957

60-
// attach tag to folder
61-
err = session.TagManager.AttachTag(ctx, tagID, folderMo.Reference())
62-
if err != nil {
63-
return fmt.Errorf("unable to attach tag to folder: %w", err)
58+
// Only createFolder() and attach the tag if the folder does not exist prior to installing
59+
if folderObj, err = folderExists(ctx, folderPath, session); folderObj == nil && err == nil {
60+
folderObj, err = createFolder(ctx, folderPath, session)
61+
if err != nil {
62+
return fmt.Errorf("unable to create folder: %w", err)
63+
}
64+
// attach tag to folder
65+
err = session.TagManager.AttachTag(ctx, tagID, folderObj.Reference())
66+
if err != nil {
67+
return fmt.Errorf("unable to attach tag to folder: %w", err)
68+
}
69+
} else if err != nil {
70+
return fmt.Errorf("unable to get folder: %w", err)
6471
}
6572

6673
// if the template is empty, the ova must be imported
6774
if len(failureDomain.Topology.Template) == 0 {
68-
if err = importRhcosOva(ctx, session, folderMo,
75+
if err = importRhcosOva(ctx, session, folderObj,
6976
cachedImage, clusterID, tagID, string(diskType), failureDomain); err != nil {
7077
return fmt.Errorf("failed to import ova: %w", err)
7178
}

pkg/infrastructure/vsphere/clusterapi/folder.go

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,44 @@ import (
1010
"sigs.k8s.io/cluster-api-provider-vsphere/pkg/session"
1111
)
1212

13-
func createFolder(ctx context.Context, fullpath string, session *session.Session) (*object.Folder, error) {
13+
func folderExists(ctx context.Context, dir string, session *session.Session) (*object.Folder, error) {
14+
/* scenarios:
15+
* 1. folder exists and returns
16+
* 2. folder does not exist and err and folder are nil
17+
* 3. finder.Folder fails and returns folder nil and error
18+
*/
1419
var notFoundError *find.NotFoundError
20+
folder, err := session.Finder.Folder(ctx, dir)
1521

16-
dir := path.Dir(fullpath)
17-
base := path.Base(fullpath)
18-
finder := session.Finder
19-
20-
folder, err := finder.Folder(ctx, fullpath)
21-
if err != nil && !errors.As(err, &notFoundError) {
22+
// scenario two
23+
if folder == nil && errors.As(err, &notFoundError) {
24+
return nil, nil
25+
}
26+
// scenario three
27+
if err != nil {
2228
return nil, err
2329
}
30+
// scenario one
31+
return folder, nil
32+
}
33+
34+
func createFolder(ctx context.Context, fullpath string, session *session.Session) (*object.Folder, error) {
35+
var folder *object.Folder
36+
var err error
37+
38+
dir := path.Dir(fullpath)
39+
base := path.Base(fullpath)
2440

2541
// if folder is nil the fullpath does not exist
26-
if folder == nil {
27-
folder, err = finder.Folder(ctx, dir)
28-
29-
if errors.As(err, &notFoundError) {
30-
folder, err = createFolder(ctx, dir, session)
31-
if err != nil {
32-
return folder, err
33-
}
42+
if folder, err = folderExists(ctx, dir, session); err == nil && folder == nil {
43+
folder, err = createFolder(ctx, dir, session)
44+
if err != nil {
45+
return nil, err
3446
}
47+
}
3548

36-
if folder != nil {
37-
folder, err = folder.CreateFolder(ctx, base)
38-
if err != nil {
39-
return folder, err
40-
}
41-
}
49+
if folder != nil && err == nil {
50+
return folder.CreateFolder(ctx, base)
4251
}
4352
return folder, err
4453
}

0 commit comments

Comments
 (0)