Skip to content

Commit

Permalink
[MESH-3865] - Add unique VS name when copying
Browse files Browse the repository at this point in the history
Signed-off-by: vinay-g <vinayg99@gmail.com>
  • Loading branch information
vinay-g authored and vinaygonuguntla committed Aug 24, 2024
1 parent 747a58e commit 48084dc
Show file tree
Hide file tree
Showing 4 changed files with 226 additions and 62 deletions.
99 changes: 71 additions & 28 deletions admiral/pkg/clusters/virtualservice_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ type SyncVirtualServiceResource func(
remoteRegistry *RemoteRegistry,
sourceCluster string,
syncNamespace string,
vsName string,
) error

// VirtualServiceHandler responsible for handling Add/Update/Delete events for
Expand Down Expand Up @@ -159,6 +160,8 @@ func (vh *VirtualServiceHandler) handleVirtualServiceEvent(ctx context.Context,
return nil
}

vSName := common.GenerateUniqueNameForVS(virtualService.Namespace, virtualService.Name)

dependentClusters := vh.remoteRegistry.AdmiralCache.CnameDependentClusterCache.Get(spec.Hosts[0]).CopyJustValues()
if len(dependentClusters) > 0 {
// Add source clusters to the list of clusters to copy the virtual service
Expand All @@ -172,6 +175,7 @@ func (vh *VirtualServiceHandler) handleVirtualServiceEvent(ctx context.Context,
vh.remoteRegistry,
vh.clusterID,
syncNamespace,
vSName,
)
if err != nil {
log.Warnf(LogErrFormat, "Sync", common.VirtualServiceResourceType, virtualService.Name, dependentClusters, err.Error()+": sync to dependent clusters will not be retried")
Expand All @@ -192,6 +196,7 @@ func (vh *VirtualServiceHandler) handleVirtualServiceEvent(ctx context.Context,
vh.remoteRegistry,
vh.clusterID,
syncNamespace,
vSName,
)
if err != nil {
log.Warnf(LogErrFormat, "Sync", common.VirtualServiceResourceType, virtualService.Name, "*", err.Error()+": sync to remote clusters will not be retried")
Expand Down Expand Up @@ -252,8 +257,12 @@ func syncVirtualServicesToAllDependentClusters(
remoteRegistry *RemoteRegistry,
sourceCluster string,
syncNamespace string,
vSName string,
) error {
defer logElapsedTimeForVirtualService("syncVirtualServicesToAllDependentClusters="+string(event), "", virtualService)()
if vSName == "" {
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, "", sourceCluster, "VirtualService generated name is empty")
}
if virtualService == nil {
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, "", sourceCluster, "VirtualService is nil")
}
Expand All @@ -273,6 +282,7 @@ func syncVirtualServicesToAllDependentClusters(
virtualServiceCopy,
event,
syncNamespace,
vSName,
)
if err != nil {
allClusterErrors = common.AppendError(allClusterErrors, err)
Expand All @@ -289,47 +299,57 @@ func syncVirtualServiceToDependentCluster(
remoteRegistry *RemoteRegistry,
virtualService *v1alpha3.VirtualService,
event common.Event,
syncNamespace string) error {
syncNamespace string,
vSName string) error {

ctxLogger := log.WithFields(log.Fields{
"type": "syncVirtualServiceToDependentCluster",
"identity": virtualService.Name,
"identity": vSName,
"txId": uuid.New().String(),
})

defer logElapsedTimeForVirtualService("syncVirtualServiceToDependentCluster="+string(event), cluster, virtualService)()
rc := remoteRegistry.GetRemoteController(cluster)
if rc == nil {
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, virtualService.Name,
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, vSName,
cluster, "dependent controller not initialized for cluster")
}
ctxLogger.Infof(LogFormat, "Event", "VirtualService", virtualService.Name, cluster, "Processing")
ctxLogger.Infof(LogFormat, "Event", "VirtualService", vSName, cluster, "Processing")
if rc.VirtualServiceController == nil {
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, virtualService.Name, cluster, "VirtualService controller not initialized for cluster")
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, vSName, cluster, "VirtualService controller not initialized for cluster")
}

if event == common.Delete {
err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(ctx, virtualService.Name, metav1.DeleteOptions{})
// Best effort delete for existing virtual service with old name
_ = rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(ctx, virtualService.Name, metav1.DeleteOptions{})

err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(ctx, vSName, metav1.DeleteOptions{})
if err != nil {
if k8sErrors.IsNotFound(err) {
ctxLogger.Infof(LogFormat, "Delete", "VirtualService", virtualService.Name, cluster, "Either VirtualService was already deleted, or it never existed")
ctxLogger.Infof(LogFormat, "Delete", "VirtualService", vSName, cluster, "Either VirtualService was already deleted, or it never existed")
return nil
}
if isDeadCluster(err) {
ctxLogger.Warnf(LogErrFormat, "Create/Update", common.VirtualServiceResourceType, virtualService.Name, cluster, "dead cluster")
ctxLogger.Warnf(LogErrFormat, "Create/Update", common.VirtualServiceResourceType, vSName, cluster, "dead cluster")
return nil
}
return fmt.Errorf(LogErrFormat, "Delete", "VirtualService", virtualService.Name, cluster, err)
return fmt.Errorf(LogErrFormat, "Delete", "VirtualService", vSName, cluster, err)
}
ctxLogger.Infof(LogFormat, "Delete", "VirtualService", virtualService.Name, cluster, "Success")
ctxLogger.Infof(LogFormat, "Delete", "VirtualService", vSName, cluster, "Success")
return nil
}
exist, err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Get(ctx, virtualService.Name, metav1.GetOptions{})

oldVSname := virtualService.Name
//Update vs name to be unique per namespace
virtualService.Name = vSName

exist, err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Get(ctx, vSName, metav1.GetOptions{})
if k8sErrors.IsNotFound(err) {
ctxLogger.Infof(LogFormat, "Get", common.VirtualServiceResourceType, virtualService.Name, cluster, "VirtualService does not exist")
ctxLogger.Infof(LogFormat, "Get", common.VirtualServiceResourceType, vSName, cluster, "VirtualService does not exist")
exist = nil
}
if isDeadCluster(err) {
ctxLogger.Warnf(LogErrFormat, "Create/Update", common.VirtualServiceResourceType, virtualService.Name, cluster, "dead cluster")
ctxLogger.Warnf(LogErrFormat, "Create/Update", common.VirtualServiceResourceType, vSName, cluster, "dead cluster")
return nil
}
//change destination host for all http routes <service_name>.<ns>. to same as host on the virtual service
Expand All @@ -350,7 +370,12 @@ func syncVirtualServiceToDependentCluster(
}
}
// nolint
return addUpdateVirtualService(ctxLogger, ctx, virtualService, exist, syncNamespace, rc, remoteRegistry)
err = addUpdateVirtualService(ctxLogger, ctx, virtualService, exist, syncNamespace, rc, remoteRegistry)

// Best effort delete for existing virtual service with old name
_ = rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(ctx, oldVSname, metav1.DeleteOptions{})

return err
}

func syncVirtualServicesToAllRemoteClusters(
Expand All @@ -360,8 +385,12 @@ func syncVirtualServicesToAllRemoteClusters(
event common.Event,
remoteRegistry *RemoteRegistry,
sourceCluster string,
syncNamespace string) error {
syncNamespace string,
vSName string) error {
defer logElapsedTimeForVirtualService("syncVirtualServicesToAllRemoteClusters="+string(event), "*", virtualService)()
if vSName == "" {
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, "", sourceCluster, "VirtualService generated name is empty")
}
if virtualService == nil {
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, "", sourceCluster, "VirtualService is nil")
}
Expand All @@ -381,6 +410,7 @@ func syncVirtualServicesToAllRemoteClusters(
virtualServiceCopy,
event,
syncNamespace,
vSName,
)
if err != nil {
allClusterErrors = common.AppendError(allClusterErrors, err)
Expand All @@ -397,49 +427,62 @@ func syncVirtualServiceToRemoteCluster(
remoteRegistry *RemoteRegistry,
virtualService *v1alpha3.VirtualService,
event common.Event,
syncNamespace string) error {
syncNamespace string,
vSName string) error {

ctxLogger := log.WithFields(log.Fields{
"type": "syncVirtualServicesToAllRemoteClusters",
"identity": virtualService.Name,
"identity": vSName,
"txId": uuid.New().String(),
})

defer logElapsedTimeForVirtualService("syncVirtualServiceToRemoteCluster="+string(event), cluster, virtualService)()
rc := remoteRegistry.GetRemoteController(cluster)
if rc == nil {
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, virtualService.Name, cluster, "remote controller not initialized for cluster")
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, vSName, cluster, "remote controller not initialized for cluster")
}
if rc.VirtualServiceController == nil {
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, virtualService.Name, cluster, "VirtualService controller not initialized for cluster")
return fmt.Errorf(LogFormat, "Event", common.VirtualServiceResourceType, vSName, cluster, "VirtualService controller not initialized for cluster")
}

if event == common.Delete {
err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(ctx, virtualService.Name, metav1.DeleteOptions{})
// Best effort delete for existing virtual service with old name
_ = rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(ctx, virtualService.Name, metav1.DeleteOptions{})

err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(ctx, vSName, metav1.DeleteOptions{})
if err != nil {
if k8sErrors.IsNotFound(err) {
ctxLogger.Infof(LogFormat, "Delete", common.VirtualServiceResourceType, virtualService.Name, cluster, "Either VirtualService was already deleted, or it never existed")
ctxLogger.Infof(LogFormat, "Delete", common.VirtualServiceResourceType, vSName, cluster, "Either VirtualService was already deleted, or it never existed")
return nil
}
if isDeadCluster(err) {
ctxLogger.Warnf(LogErrFormat, "Delete", common.VirtualServiceResourceType, virtualService.Name, cluster, "dead cluster")
ctxLogger.Warnf(LogErrFormat, "Delete", common.VirtualServiceResourceType, vSName, cluster, "dead cluster")
return nil
}
return fmt.Errorf(LogErrFormat, "Delete", common.VirtualServiceResourceType, virtualService.Name, cluster, err)

return fmt.Errorf(LogErrFormat, "Delete", common.VirtualServiceResourceType, vSName, cluster, err)
}
ctxLogger.Infof(LogFormat, "Delete", common.VirtualServiceResourceType, virtualService.Name, cluster, "Success")
ctxLogger.Infof(LogFormat, "Delete", common.VirtualServiceResourceType, vSName, cluster, "Success")
return nil
}
exist, err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Get(ctx, virtualService.Name, metav1.GetOptions{})
oldVSname := virtualService.Name
//Update vs name to be unique per namespace
virtualService.Name = vSName
exist, err := rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Get(ctx, vSName, metav1.GetOptions{})
if k8sErrors.IsNotFound(err) {
ctxLogger.Infof(LogFormat, "Get", common.VirtualServiceResourceType, virtualService.Name, cluster, "VirtualService does not exist")
ctxLogger.Infof(LogFormat, "Get", common.VirtualServiceResourceType, vSName, cluster, "VirtualService does not exist")
exist = nil
}
if isDeadCluster(err) {
ctxLogger.Warnf(LogErrFormat, "Create/Update", common.VirtualServiceResourceType, virtualService.Name, cluster, "dead cluster")
ctxLogger.Warnf(LogErrFormat, "Create/Update", common.VirtualServiceResourceType, vSName, cluster, "dead cluster")
return nil
}
err = addUpdateVirtualService(ctxLogger, ctx, virtualService, exist, syncNamespace, rc, remoteRegistry)

// Best effort delete of existing virtual service with old name
_ = rc.VirtualServiceController.IstioClient.NetworkingV1alpha3().VirtualServices(syncNamespace).Delete(ctx, oldVSname, metav1.DeleteOptions{})
// nolint
return addUpdateVirtualService(ctxLogger, ctx, virtualService, exist, syncNamespace, rc, remoteRegistry)
return err
}

func matchRolloutCanaryStrategy(rolloutStrategy argo.RolloutStrategy, virtualServiceName string) bool {
Expand Down
Loading

0 comments on commit 48084dc

Please sign in to comment.