Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 23 additions & 31 deletions pkg/controller/vsphere/reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -594,15 +594,10 @@ func (r *Reconciler) reconcileRegionAndZoneLabels(vm *virtualMachine) error {
regionLabel := r.vSphereConfig.Labels.Region
zoneLabel := r.vSphereConfig.Labels.Zone

var res map[string]string

err := r.session.WithCachingTagsManager(vm.Context, func(c *session.CachingTagsManager) error {
var err error
res, err = vm.getRegionAndZone(c, regionLabel, zoneLabel)

return err
})

// Use cached tag manager to avoid creating new REST sessions.
// This eliminates excessive vCenter login/logout cycles.
tagManager := r.session.GetCachingTagsManager()
res, err := vm.getRegionAndZone(tagManager, regionLabel, zoneLabel)
if err != nil {
return err
}
Expand Down Expand Up @@ -1599,32 +1594,29 @@ func (vm *virtualMachine) getPowerState() (types.VirtualMachinePowerState, error
// reconcileTags ensures that the required tags are present on the virtual machine, eg the Cluster ID
// that is used by the installer on cluster deletion to ensure ther are no leaked resources.
func (vm *virtualMachine) reconcileTags(ctx context.Context, sessionInstance *session.Session, machine *machinev1.Machine, providerSpec *machinev1.VSphereMachineProviderSpec) error {
if err := sessionInstance.WithCachingTagsManager(vm.Context, func(c *session.CachingTagsManager) error {
klog.Infof("%v: Reconciling attached tags", machine.GetName())

clusterID := machine.Labels[machinev1.MachineClusterIDLabel]
tagIDs := []string{clusterID}
tagIDs = append(tagIDs, providerSpec.TagIDs...)
klog.Infof("%v: Reconciling %s tags to vm", machine.GetName(), tagIDs)
for _, tagID := range tagIDs {
attached, err := vm.checkAttachedTag(ctx, tagID, c)
if err != nil {
return err
}
// Use cached tag manager to avoid creating new REST sessions.
// This eliminates excessive vCenter login/logout cycles.
tagManager := sessionInstance.GetCachingTagsManager()
klog.Infof("%v: Reconciling attached tags", machine.GetName())

clusterID := machine.Labels[machinev1.MachineClusterIDLabel]
tagIDs := []string{clusterID}
tagIDs = append(tagIDs, providerSpec.TagIDs...)
klog.Infof("%v: Reconciling %s tags to vm", machine.GetName(), tagIDs)
for _, tagID := range tagIDs {
attached, err := vm.checkAttachedTag(ctx, tagID, tagManager)
if err != nil {
return err
}

if !attached {
klog.Infof("%v: Attaching %s tag to vm", machine.GetName(), tagID)
// the tag should already be created by installer or the administrator
if err := c.AttachTag(ctx, tagID, vm.Ref); err != nil {
return err
}
if !attached {
klog.Infof("%v: Attaching %s tag to vm", machine.GetName(), tagID)
// the tag should already be created by installer or the administrator
if err := tagManager.AttachTag(ctx, tagID, vm.Ref); err != nil {
return err
}
}
return nil
}); err != nil {
return err
}

return nil
}

Expand Down
205 changes: 87 additions & 118 deletions pkg/controller/vsphere/reconciler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ import (

"github.com/vmware/govmomi/object"
"github.com/vmware/govmomi/simulator"
"github.com/vmware/govmomi/vapi/rest"
"github.com/vmware/govmomi/vapi/tags"
"github.com/vmware/govmomi/vim25"
"github.com/vmware/govmomi/vim25/mo"
Expand Down Expand Up @@ -1666,45 +1665,40 @@ func TestReconcileTags(t *testing.T) {
}

if tc.attachTag {
if err := sessionObj.WithCachingTagsManager(context.TODO(), func(tagMgr *session.CachingTagsManager) error {
tagMgr := sessionObj.GetCachingTagsManager()

tags, err := tagMgr.GetAttachedTags(context.TODO(), managedObjRef)
if err != nil {
return err
}
tags, err := tagMgr.GetAttachedTags(context.TODO(), managedObjRef)
if err != nil {
t.Fatal(err)
}

if len(tags) == 0 {
t.Fatalf("Expected tags to be found")
}
if len(tags) == 0 {
t.Fatalf("Expected tags to be found")
}

expectedTags := []string{tc.tagName}
if len(providerSpec.TagIDs) > 0 {
expectedTags = append(expectedTags, providerSpec.TagIDs...)
}
expectedTags := []string{tc.tagName}
if len(providerSpec.TagIDs) > 0 {
expectedTags = append(expectedTags, providerSpec.TagIDs...)
}

for _, expectedTag := range expectedTags {
gotTag := false
for _, attachedTag := range tags {
if session.IsName(expectedTag) {
if attachedTag.Name == expectedTag {
gotTag = true
break
}
} else {
if attachedTag.ID == expectedTag {
gotTag = true
break
}
for _, expectedTag := range expectedTags {
gotTag := false
for _, attachedTag := range tags {
if session.IsName(expectedTag) {
if attachedTag.Name == expectedTag {
gotTag = true
break
}
} else {
if attachedTag.ID == expectedTag {
gotTag = true
break
}
}
if !gotTag {
t.Fatalf("Expected tag %s to be found", expectedTag)
}
}

return nil
}); err != nil {
t.Fatal(err)
if !gotTag {
t.Fatalf("Expected tag %s to be found", expectedTag)
}
}
}
}
Expand All @@ -1730,50 +1724,43 @@ func TestCheckAttachedTag(t *testing.T) {
tagName := "CLUSTERID"
nonAttachedTagName := "nonAttachedTag"

if err := sessionObj.WithRestClient(context.TODO(), func(c *rest.Client) error {
tagsMgr := tags.NewManager(c)
tagsMgr := sessionObj.TagManager

id, err := tagsMgr.CreateCategory(context.TODO(), &tags.Category{
AssociableTypes: []string{"VirtualMachine"},
Cardinality: "SINGLE",
Name: tagToCategoryName(tagName),
})
if err != nil {
return err
}

_, err = tagsMgr.CreateTag(context.TODO(), &tags.Tag{
CategoryID: id,
Name: tagName,
})
if err != nil {
return err
}

if err := tagsMgr.AttachTag(context.TODO(), tagName, vm.Ref); err != nil {
return err
}
id, err := tagsMgr.CreateCategory(context.TODO(), &tags.Category{
AssociableTypes: []string{"VirtualMachine"},
Cardinality: "SINGLE",
Name: tagToCategoryName(tagName),
})
if err != nil {
t.Fatal(err)
}

nonAttachedCategoryId, err := tagsMgr.CreateCategory(context.TODO(), &tags.Category{
AssociableTypes: []string{"VirtualMachine"},
Cardinality: "SINGLE",
Name: tagToCategoryName(nonAttachedTagName),
})
_, err = tagsMgr.CreateTag(context.TODO(), &tags.Tag{
CategoryID: id,
Name: tagName,
})
if err != nil {
t.Fatal(err)
}

if err != nil {
return err
}
if err := tagsMgr.AttachTag(context.TODO(), tagName, vm.Ref); err != nil {
t.Fatal(err)
}

_, err = tagsMgr.CreateTag(context.TODO(), &tags.Tag{
CategoryID: nonAttachedCategoryId,
Name: nonAttachedTagName,
})
if err != nil {
return err
}
nonAttachedCategoryId, err := tagsMgr.CreateCategory(context.TODO(), &tags.Category{
AssociableTypes: []string{"VirtualMachine"},
Cardinality: "SINGLE",
Name: tagToCategoryName(nonAttachedTagName),
})
if err != nil {
t.Fatal(err)
}

return nil
}); err != nil {
_, err = tagsMgr.CreateTag(context.TODO(), &tags.Tag{
CategoryID: nonAttachedCategoryId,
Name: nonAttachedTagName,
})
if err != nil {
t.Fatal(err)
}

Expand All @@ -1800,20 +1787,15 @@ func TestCheckAttachedTag(t *testing.T) {

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
if err := sessionObj.WithCachingTagsManager(context.TODO(), func(c *session.CachingTagsManager) error {
c := sessionObj.GetCachingTagsManager()

attached, err := vm.checkAttachedTag(context.TODO(), tc.tagName, c)
if err != nil {
return fmt.Errorf("Not expected error %v", err)
}

if attached != tc.findTag {
return fmt.Errorf("Failed to find attached tag: got %v, expected %v", attached, tc.findTag)
}
attached, err := vm.checkAttachedTag(context.TODO(), tc.tagName, c)
if err != nil {
t.Fatalf("Not expected error %v", err)
}

return nil
}); err != nil {
t.Fatal(err)
if attached != tc.findTag {
t.Fatalf("Failed to find attached tag: got %v, expected %v", attached, tc.findTag)
}
})
}
Expand Down Expand Up @@ -3321,21 +3303,15 @@ func TestReconcileMachineWithCloudState(t *testing.T) {
t.Fatalf("cannot create tag and category: %v", err)
}

if err := session.WithRestClient(context.TODO(), func(c *rest.Client) error {
tagsMgr := tags.NewManager(c)

err = tagsMgr.AttachTag(context.TODO(), testZone, cluster.Reference())
if err != nil {
return err
}
tagsMgr := session.TagManager

err = tagsMgr.AttachTag(context.TODO(), testRegion, dc.Reference())
if err != nil {
return err
}
err = tagsMgr.AttachTag(context.TODO(), testZone, cluster.Reference())
if err != nil {
t.Fatal(err)
}

return nil
}); err != nil {
err = tagsMgr.AttachTag(context.TODO(), testRegion, dc.Reference())
if err != nil {
t.Fatal(err)
}

Expand Down Expand Up @@ -3412,29 +3388,22 @@ func TestReconcileMachineWithCloudState(t *testing.T) {
}

func createTagAndCategory(session *session.Session, categoryName, tagName string) (string, error) {
var tagID string
if err := session.WithRestClient(context.TODO(), func(c *rest.Client) error {
tagsMgr := tags.NewManager(c)

id, err := tagsMgr.CreateCategory(context.TODO(), &tags.Category{
AssociableTypes: []string{"VirtualMachine"},
Cardinality: "SINGLE",
Name: categoryName,
})
if err != nil {
return err
}
tagsMgr := session.TagManager

tagID, err = tagsMgr.CreateTag(context.TODO(), &tags.Tag{
CategoryID: id,
Name: tagName,
})
if err != nil {
return err
}
id, err := tagsMgr.CreateCategory(context.TODO(), &tags.Category{
AssociableTypes: []string{"VirtualMachine"},
Cardinality: "SINGLE",
Name: categoryName,
})
if err != nil {
return "", err
}

return nil
}); err != nil {
tagID, err := tagsMgr.CreateTag(context.TODO(), &tags.Tag{
CategoryID: id,
Name: tagName,
})
if err != nil {
return "", err
}

Expand Down
Loading