Skip to content

Commit

Permalink
fix continues update volume metadata calls for TKC volumes (#2909)
Browse files Browse the repository at this point in the history
  • Loading branch information
divyenpatel authored May 31, 2024
1 parent 63e38a3 commit 1a0fa44
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 10 deletions.
14 changes: 4 additions & 10 deletions pkg/syncer/fullsync.go
Original file line number Diff line number Diff line change
Expand Up @@ -788,21 +788,15 @@ func fullSyncConstructVolumeMaps(ctx context.Context, pvList []*v1.PersistentVol
var cnsMetadata []cnstypes.BaseCnsEntityMetadata
allEntityMetadata := volume.Metadata.EntityMetadata
for _, metadata := range allEntityMetadata {
if metadata.(*cnstypes.CnsKubernetesEntityMetadata).ClusterID ==
clusterIDforVolumeMetadata {
if metadata.(*cnstypes.CnsKubernetesEntityMetadata).ClusterID == clusterIDforVolumeMetadata {
cnsMetadata = append(cnsMetadata, metadata)
}
}
volumeToCnsEntityMetadataMap[volume.VolumeId.Id] = cnsMetadata
if len(volume.Metadata.ContainerClusterArray) == 1 &&
clusterIDforVolumeMetadata == volume.Metadata.ContainerClusterArray[0].ClusterId &&
metadataSyncer.configInfo.Cfg.Global.ClusterDistribution ==
volume.Metadata.ContainerClusterArray[0].ClusterDistribution {
log.Debugf("Volume %s has cluster distribution set to %s",
volume.Name, volume.Metadata.ContainerClusterArray[0].ClusterDistribution)
volumeClusterDistributionMap[volume.VolumeId.Id] = true
}

volumeClusterDistributionMap[volume.VolumeId.Id] =
hasClusterDistributionSet(ctx, volume, clusterIDforVolumeMetadata,
metadataSyncer.configInfo.Cfg.Global.ClusterDistribution)
}
}
return volumeToCnsEntityMetadataMap, volumeToK8sEntityMetadataMap, volumeClusterDistributionMap, nil
Expand Down
19 changes: 19 additions & 0 deletions pkg/syncer/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -914,3 +914,22 @@ func addResourceVersion(patchBytes []byte, resourceVersion string) ([]byte, erro
}
return versionBytes, nil
}

// hasClusterDistributionSet checks volume information obtained from CNS queryvolume API and check
// expected cluster distribution is set for specific clusterID in ContainerClusterArray associated with volume
// for Volumes Created from TKG Cluster, QueryVolume returns two entries for containerClusterArray
// one for clusterFlavor: "WORKLOAD" and clusterDistribution "SupervisorCluster" and
// another for clusterFlavor: "GUEST_CLUSTER" clusterDistribution: "TKGService"
func hasClusterDistributionSet(ctx context.Context, volume cnstypes.CnsVolume,
clusterIDforVolumeMetadata string, expectedClusterDistribution string) bool {
log := logger.GetLogger(ctx)
for _, containerCluster := range volume.Metadata.ContainerClusterArray {
if clusterIDforVolumeMetadata == containerCluster.ClusterId &&
containerCluster.ClusterDistribution == expectedClusterDistribution {
log.Debugf("Volume %s has cluster distribution set to %s",
volume.Name, containerCluster.ClusterDistribution)
return true
}
}
return false
}
85 changes: 85 additions & 0 deletions pkg/syncer/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"testing"

"github.com/google/uuid"
"github.com/stretchr/testify/assert"
cnstypes "github.com/vmware/govmomi/cns/types"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

Expand Down Expand Up @@ -391,3 +393,86 @@ func TestGetTopologySegmentsFromNodeAffinityRulesMultipleMatchExpressions(t *tes
}
}
}

func TestHasClusterDistributionSet(t *testing.T) {
tests := []struct {
name string
volume cnstypes.CnsVolume
clusterIDforVolumeMetadata string
expectedClusterDistribution string
expectedResult bool
}{
{
name: "Cluster distribution matches",
volume: cnstypes.CnsVolume{
VolumeId: cnstypes.CnsVolumeId{
Id: "volumeID",
},
Metadata: cnstypes.CnsVolumeMetadata{
ContainerClusterArray: []cnstypes.CnsContainerCluster{
{ClusterId: "cluster-1", ClusterDistribution: "SupervisorCluster"},
{ClusterId: "cluster-2", ClusterDistribution: "TKGService"},
},
},
},
clusterIDforVolumeMetadata: "cluster-1",
expectedClusterDistribution: "SupervisorCluster",
expectedResult: true,
},
{
name: "Cluster distribution does not set",
volume: cnstypes.CnsVolume{
VolumeId: cnstypes.CnsVolumeId{
Id: "volumeID",
},
Metadata: cnstypes.CnsVolumeMetadata{
ContainerClusterArray: []cnstypes.CnsContainerCluster{
{ClusterId: "cluster-1", ClusterDistribution: ""},
{ClusterId: "cluster-2", ClusterDistribution: "TKGService"},
},
},
},
clusterIDforVolumeMetadata: "cluster-1",
expectedClusterDistribution: "SupervisorCluster",
expectedResult: false,
},
{
volume: cnstypes.CnsVolume{
VolumeId: cnstypes.CnsVolumeId{
Id: "volumeID",
},
Metadata: cnstypes.CnsVolumeMetadata{
ContainerClusterArray: []cnstypes.CnsContainerCluster{
{ClusterId: "cluster-1", ClusterDistribution: "SupervisorCluster"},
{ClusterId: "cluster-2", ClusterDistribution: "TKGService"},
},
},
},
clusterIDforVolumeMetadata: "cluster-3",
expectedClusterDistribution: "SupervisorCluster",
expectedResult: false,
},
{
name: "No container clusters in metadata",
volume: cnstypes.CnsVolume{
VolumeId: cnstypes.CnsVolumeId{
Id: "volumeID",
},
Metadata: cnstypes.CnsVolumeMetadata{
ContainerClusterArray: []cnstypes.CnsContainerCluster{},
},
},
clusterIDforVolumeMetadata: "cluster-1",
expectedClusterDistribution: "SupervisorCluster",
expectedResult: false,
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
result := hasClusterDistributionSet(context.Background(),
test.volume, test.clusterIDforVolumeMetadata, test.expectedClusterDistribution)
assert.Equal(t, test.expectedResult, result)
})
}
}

0 comments on commit 1a0fa44

Please sign in to comment.