Skip to content

Commit

Permalink
prevent panic when cluster does not contain rollout OR deployment for…
Browse files Browse the repository at this point in the history
… given asset (#286)

* prevent panic when cluster does not contain rollout OR deployment for given asset
Signed-off-by: Anubhav Aeron <anubhav_aeron@intuit.com>
Co-authored-by: Anubhav Aeron <anubhav_aeron@intuit.com>
  • Loading branch information
nirvanagit committed Mar 13, 2023
1 parent 1313ef0 commit ff28f5f
Show file tree
Hide file tree
Showing 4 changed files with 203 additions and 48 deletions.
2 changes: 1 addition & 1 deletion admiral/pkg/clusters/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -758,7 +758,7 @@ func getServiceForDeployment(rc *RemoteController, deployment *k8sAppsV1.Deploym
var match = common.IsServiceMatch(service.Spec.Selector, deployment.Spec.Selector)
//make sure the service matches the deployment Selector and also has a mesh port in the port spec
if match {
ports := GetMeshPorts(rc.ClusterID, service, deployment)
ports := GetMeshPortsForDeployment(rc.ClusterID, service, deployment)
if len(ports) > 0 {
matchedService = service
break
Expand Down
38 changes: 19 additions & 19 deletions admiral/pkg/clusters/serviceentry.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ func modifyServiceEntryForNewServiceOrPod(
continue
}
namespace = deployment.Namespace
localMeshPorts := GetMeshPorts(rc.ClusterID, serviceInstance, deployment)
localMeshPorts := GetMeshPortsForDeployment(rc.ClusterID, serviceInstance, deployment)

cname = common.GetCname(deployment, common.GetWorkloadIdentifier(), common.GetHostnameSuffix())
sourceDeployments[rc.ClusterID] = deployment
Expand Down Expand Up @@ -189,24 +189,24 @@ func modifyServiceEntryForNewServiceOrPod(
start = time.Now()

for sourceCluster, serviceInstance := range sourceServices {
localFqdn := serviceInstance.Name + common.Sep + serviceInstance.Namespace + common.DotLocalDomainSuffix
rc := remoteRegistry.GetRemoteController(sourceCluster)
var meshPorts map[string]uint32
blueGreenStrategy := isBlueGreenStrategy(sourceRollouts[sourceCluster])

var deploymentRolloutLabels map[string]string
if len(sourceDeployments) > 0 {
meshPorts = GetMeshPorts(sourceCluster, serviceInstance, sourceDeployments[sourceCluster])
deployment = sourceDeployments[sourceCluster]
deploymentRolloutLabels = deployment.Labels
} else {
meshPorts = GetMeshPortsForRollout(sourceCluster, serviceInstance, sourceRollouts[sourceCluster])
rollout := sourceRollouts[sourceCluster]
deploymentRolloutLabels = rollout.Labels
var (
meshPorts map[string]uint32
localFqdn = serviceInstance.Name + common.Sep + serviceInstance.Namespace + common.DotLocalDomainSuffix
rc = remoteRegistry.GetRemoteController(sourceCluster)
blueGreenStrategy = isBlueGreenStrategy(sourceRollouts[sourceCluster])
)

meshPorts, labels := GetMeshPortAndLabelsFromDeploymentOrRollout(
sourceCluster, serviceInstance, sourceDeployments, sourceRollouts,
)
if meshPorts == nil {
log.Infof("Unable to determine mesh ports for service=%s in cluster=%s", serviceInstance.Name, sourceCluster)
continue
}
if labels != nil {
// check if additional endpoint generation is required
isAdditionalEndpointGenerationEnabled = doGenerateAdditionalEndpoints(labels)
}

// check if additional endpoint generation is required
isAdditionalEndpointGenerationEnabled = doGenerateAdditionalEndpoints(deploymentRolloutLabels)

for key, serviceEntry := range serviceEntries {
if len(serviceEntry.Endpoints) == 0 {
Expand All @@ -216,7 +216,7 @@ func modifyServiceEntryForNewServiceOrPod(
}
clusterIngress, _ := rc.ServiceController.Cache.GetLoadBalancer(common.GetAdmiralParams().LabelSet.GatewayApp, common.NamespaceIstioSystem)
for _, ep := range serviceEntry.Endpoints {
//replace istio ingress-gateway address with local fqdn, note that ingress-gateway can be empty (not provisoned, or is not up)
//replace istio ingress-gateway address with local fqdn, note that ingress-gateway can be empty (not provisioned, or is not up)
if ep.Address == clusterIngress || ep.Address == "" {
// Update endpoints with locafqdn for active and preview se of bluegreen rollout
if blueGreenStrategy {
Expand Down
28 changes: 25 additions & 3 deletions admiral/pkg/clusters/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,38 @@ import (
k8sV1 "k8s.io/api/core/v1"
)

func GetMeshPorts(clusterName string, destService *k8sV1.Service,
func GetMeshPortAndLabelsFromDeploymentOrRollout(
cluster string, serviceInstance *k8sV1.Service,
deploymentsByCluster map[string]*k8sAppsV1.Deployment,
rolloutsByCluster map[string]*argo.Rollout,
) (portsByProtocol map[string]uint32, labels map[string]string) {
if len(deploymentsByCluster) > 0 && deploymentsByCluster[cluster] != nil {
deployment := deploymentsByCluster[cluster]
return GetMeshPortsForDeployment(cluster, serviceInstance, deployment), deployment.Labels
}
if len(rolloutsByCluster) > 0 && rolloutsByCluster[cluster] != nil {
rollout := rolloutsByCluster[cluster]
return GetMeshPortsForRollout(cluster, serviceInstance, rollout), rollout.Labels
}
return nil, nil
}

func GetMeshPortsForDeployment(clusterName string, destService *k8sV1.Service,
destDeployment *k8sAppsV1.Deployment) map[string]uint32 {
var meshPorts = destDeployment.Spec.Template.Annotations[common.SidecarEnabledPorts]
var meshPorts string
if destDeployment != nil {
meshPorts = destDeployment.Spec.Template.Annotations[common.SidecarEnabledPorts]
}
ports := getMeshPortsHelper(meshPorts, destService, clusterName)
return ports
}

func GetMeshPortsForRollout(clusterName string, destService *k8sV1.Service,
destRollout *argo.Rollout) map[string]uint32 {
var meshPorts = destRollout.Spec.Template.Annotations[common.SidecarEnabledPorts]
var meshPorts string
if destRollout != nil {
meshPorts = destRollout.Spec.Template.Annotations[common.SidecarEnabledPorts]
}
ports := getMeshPortsHelper(meshPorts, destService, clusterName)
return ports
}
Expand Down
Loading

0 comments on commit ff28f5f

Please sign in to comment.