diff --git a/api/datastore/test_data/output_24_to_latest.json b/api/datastore/test_data/output_24_to_latest.json index ecdc3b0e7..2652252e8 100644 --- a/api/datastore/test_data/output_24_to_latest.json +++ b/api/datastore/test_data/output_24_to_latest.json @@ -64,6 +64,7 @@ "UseServerMetrics": false }, "Flags": { + "IsServerIngressClassDetected": false, "IsServerMetricsDetected": false, "IsServerStorageDetected": false }, diff --git a/api/internal/endpointutils/endpointutils.go b/api/internal/endpointutils/endpointutils.go index 163f785c7..918217ff3 100644 --- a/api/internal/endpointutils/endpointutils.go +++ b/api/internal/endpointutils/endpointutils.go @@ -76,6 +76,16 @@ func EndpointSet(endpointIDs []portainer.EndpointID) map[portainer.EndpointID]bo } func InitialIngressClassDetection(endpoint *portainer.Endpoint, endpointService dataservices.EndpointService, factory *cli.ClientFactory) { + if endpoint.Kubernetes.Flags.IsServerIngressClassDetected { + return + } + defer func() { + endpoint.Kubernetes.Flags.IsServerIngressClassDetected = true + endpointService.UpdateEndpoint( + portainer.EndpointID(endpoint.ID), + endpoint, + ) + }() cli, err := factory.GetKubeClient(endpoint) if err != nil { log.Debug().Err(err).Msg("unable to create kubernetes client for ingress class detection") @@ -107,6 +117,16 @@ func InitialIngressClassDetection(endpoint *portainer.Endpoint, endpointService } func InitialMetricsDetection(endpoint *portainer.Endpoint, endpointService dataservices.EndpointService, factory *cli.ClientFactory) { + if endpoint.Kubernetes.Flags.IsServerMetricsDetected { + return + } + defer func() { + endpoint.Kubernetes.Flags.IsServerMetricsDetected = true + endpointService.UpdateEndpoint( + portainer.EndpointID(endpoint.ID), + endpoint, + ) + }() cli, err := factory.GetKubeClient(endpoint) if err != nil { log.Debug().Err(err).Msg("unable to create kubernetes client for initial metrics detection") @@ -118,11 +138,6 @@ func InitialMetricsDetection(endpoint *portainer.Endpoint, endpointService datas return } endpoint.Kubernetes.Configuration.UseServerMetrics = true - endpoint.Kubernetes.Flags.IsServerMetricsDetected = true - err = endpointService.UpdateEndpoint( - portainer.EndpointID(endpoint.ID), - endpoint, - ) if err != nil { log.Debug().Err(err).Msg("unable to enable UseServerMetrics inside the database") return @@ -158,6 +173,16 @@ func storageDetect(endpoint *portainer.Endpoint, endpointService dataservices.En } func InitialStorageDetection(endpoint *portainer.Endpoint, endpointService dataservices.EndpointService, factory *cli.ClientFactory) { + if endpoint.Kubernetes.Flags.IsServerStorageDetected { + return + } + defer func() { + endpoint.Kubernetes.Flags.IsServerStorageDetected = true + endpointService.UpdateEndpoint( + portainer.EndpointID(endpoint.ID), + endpoint, + ) + }() log.Info().Msg("attempting to detect storage classes in the cluster") err := storageDetect(endpoint, endpointService, factory) if err == nil { diff --git a/api/portainer.go b/api/portainer.go index f9aa9d9a7..36a054182 100644 --- a/api/portainer.go +++ b/api/portainer.go @@ -588,9 +588,12 @@ type ( Flags KubernetesFlags `json:"Flags"` } + // KubernetesFlags are used to detect if we need to run initial cluster + // detection again. KubernetesFlags struct { - IsServerMetricsDetected bool `json:"IsServerMetricsDetected"` - IsServerStorageDetected bool `json:"IsServerStorageDetected"` + IsServerMetricsDetected bool `json:"IsServerMetricsDetected"` + IsServerIngressClassDetected bool `json:"IsServerIngressClassDetected"` + IsServerStorageDetected bool `json:"IsServerStorageDetected"` } // KubernetesSnapshot represents a snapshot of a specific Kubernetes environment(endpoint) at a specific time