From 95f706aabebde3eaaa1c74c1a19dae555f0508b2 Mon Sep 17 00:00:00 2001 From: Chaim Lev-Ari Date: Mon, 27 Jun 2022 19:29:17 +0300 Subject: [PATCH] fix(analytics): load public settings [EE-3590] (#7128) --- api/http/handler/settings/settings_public.go | 20 +++++++++++++++++++ app/angulartics.matomo/analytics-services.ts | 6 ++++-- .../EnvironmentItem/EdgeIndicator.tsx | 13 +++++++----- .../KubeconfigButton/KubeconfigPrompt.tsx | 6 +++--- app/portainer/models/settings.js | 10 ++++++++++ app/portainer/settings/queries.ts | 11 +++++++--- app/react/sidebar/SettingsSidebar.tsx | 6 +++--- 7 files changed, 56 insertions(+), 16 deletions(-) diff --git a/api/http/handler/settings/settings_public.go b/api/http/handler/settings/settings_public.go index 9eac33878..76818743f 100644 --- a/api/http/handler/settings/settings_public.go +++ b/api/http/handler/settings/settings_public.go @@ -30,6 +30,19 @@ type publicSettingsResponse struct { KubeconfigExpiry string `example:"24h" default:"0"` // Whether team sync is enabled TeamSync bool `json:"TeamSync" example:"true"` + + Edge struct { + // Whether the device has been started in edge async mode + AsyncMode bool + // The ping interval for edge agent - used in edge async mode [seconds] + PingInterval int `json:"PingInterval" example:"60"` + // The snapshot interval for edge agent - used in edge async mode [seconds] + SnapshotInterval int `json:"SnapshotInterval" example:"60"` + // The command list interval for edge agent - used in edge async mode [seconds] + CommandInterval int `json:"CommandInterval" example:"60"` + // The check in interval for edge agent (in seconds) - used in non async mode [seconds] + CheckinInterval int `example:"60"` + } } // @id SettingsPublic @@ -61,6 +74,13 @@ func generatePublicSettings(appSettings *portainer.Settings) *publicSettingsResp KubeconfigExpiry: appSettings.KubeconfigExpiry, Features: appSettings.FeatureFlagSettings, } + + publicSettings.Edge.AsyncMode = appSettings.Edge.AsyncMode + publicSettings.Edge.PingInterval = appSettings.Edge.PingInterval + publicSettings.Edge.SnapshotInterval = appSettings.Edge.SnapshotInterval + publicSettings.Edge.CommandInterval = appSettings.Edge.CommandInterval + publicSettings.Edge.CheckinInterval = appSettings.EdgeAgentCheckinInterval + //if OAuth authentication is on, compose the related fields from application settings if publicSettings.AuthenticationMethod == portainer.AuthenticationOAuth { publicSettings.OAuthLogoutURI = appSettings.OAuthSettings.LogoutURI diff --git a/app/angulartics.matomo/analytics-services.ts b/app/angulartics.matomo/analytics-services.ts index dcc729630..c1202fd79 100644 --- a/app/angulartics.matomo/analytics-services.ts +++ b/app/angulartics.matomo/analytics-services.ts @@ -1,6 +1,6 @@ import _ from 'lodash'; -import { useSettings } from '@/portainer/settings/queries'; +import { usePublicSettings } from '@/portainer/settings/queries'; const categories = [ 'docker', @@ -64,7 +64,9 @@ export function push( } export function useAnalytics() { - const telemetryQuery = useSettings((settings) => settings.EnableTelemetry); + const telemetryQuery = usePublicSettings({ + select: (settings) => settings.EnableTelemetry, + }); return { trackEvent: handleTrackEvent }; diff --git a/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.tsx b/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.tsx index a6577c406..87cffc5cc 100644 --- a/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.tsx +++ b/app/portainer/home/EnvironmentList/EnvironmentItem/EdgeIndicator.tsx @@ -2,8 +2,8 @@ import clsx from 'clsx'; import { isoDateFromTimestamp } from '@/portainer/filters/filters'; import { Environment } from '@/portainer/environments/types'; -import { useSettings } from '@/portainer/settings/queries'; -import { Settings } from '@/portainer/settings/types'; +import { usePublicSettings } from '@/portainer/settings/queries'; +import { PublicSettingsViewModel } from '@/portainer/models/settings'; interface Props { showLastCheckInDate?: boolean; @@ -58,7 +58,7 @@ export function EdgeIndicator({ } function useHasHeartbeat(environment: Environment, associated: boolean) { - const settingsQuery = useSettings(undefined, associated); + const settingsQuery = usePublicSettings({ enabled: associated }); if (!associated) { return false; @@ -81,7 +81,10 @@ function useHasHeartbeat(environment: Environment, associated: boolean) { return false; } -function getCheckinInterval(environment: Environment, settings: Settings) { +function getCheckinInterval( + environment: Environment, + settings: PublicSettingsViewModel +) { const asyncMode = environment.Edge.AsyncMode; if (asyncMode) { @@ -104,7 +107,7 @@ function getCheckinInterval(environment: Environment, settings: Settings) { !environment.EdgeCheckinInterval || environment.EdgeCheckinInterval === 0 ) { - return settings.EdgeAgentCheckinInterval; + return settings.Edge.CheckinInterval; } return environment.EdgeCheckinInterval; diff --git a/app/portainer/home/EnvironmentList/KubeconfigButton/KubeconfigPrompt.tsx b/app/portainer/home/EnvironmentList/KubeconfigButton/KubeconfigPrompt.tsx index d26ed7a98..22fd9c13b 100644 --- a/app/portainer/home/EnvironmentList/KubeconfigButton/KubeconfigPrompt.tsx +++ b/app/portainer/home/EnvironmentList/KubeconfigButton/KubeconfigPrompt.tsx @@ -30,9 +30,9 @@ export function KubeconfigPrompt({ const [page, setPage] = useState(1); const [pageLimit, setPageLimit] = usePaginationLimitState(storageKey); - const expiryQuery = usePublicSettings((settings) => - expiryMessage(settings.KubeconfigExpiry) - ); + const expiryQuery = usePublicSettings({ + select: (settings) => expiryMessage(settings.KubeconfigExpiry), + }); const { selection, toggle: toggleSelection, selectionSize } = useSelection(); const { environments, totalCount } = useEnvironmentList({ diff --git a/app/portainer/models/settings.js b/app/portainer/models/settings.js index e61529b1e..613c7e5b0 100644 --- a/app/portainer/models/settings.js +++ b/app/portainer/models/settings.js @@ -34,6 +34,8 @@ export function PublicSettingsViewModel(settings) { this.EnableTelemetry = settings.EnableTelemetry; this.OAuthLogoutURI = settings.OAuthLogoutURI; this.KubeconfigExpiry = settings.KubeconfigExpiry; + this.Features = settings.Features; + this.Edge = new EdgeSettingsViewModel(settings.Edge); } export function InternalAuthSettingsViewModel(data) { @@ -75,3 +77,11 @@ export function OAuthSettingsViewModel(data) { this.SSO = data.SSO; this.LogoutURI = data.LogoutURI; } + +export function EdgeSettingsViewModel(data = {}) { + this.CheckinInterval = data.CheckinInterval; + this.PingInterval = data.PingInterval; + this.SnapshotInterval = data.SnapshotInterval; + this.CommandInterval = data.CommandInterval; + this.AsyncMode = data.AsyncMode; +} diff --git a/app/portainer/settings/queries.ts b/app/portainer/settings/queries.ts index e23d8693b..82b4324a2 100644 --- a/app/portainer/settings/queries.ts +++ b/app/portainer/settings/queries.ts @@ -15,12 +15,17 @@ import { } from './settings.service'; import { Settings } from './types'; -export function usePublicSettings( - select?: (settings: PublicSettingsViewModel) => T -) { +export function usePublicSettings({ + enabled, + select, +}: { + select?: (settings: PublicSettingsViewModel) => T; + enabled?: boolean; +} = {}) { return useQuery(['settings', 'public'], () => getPublicSettings(), { select, ...withError('Unable to retrieve public settings'), + enabled, }); } diff --git a/app/react/sidebar/SettingsSidebar.tsx b/app/react/sidebar/SettingsSidebar.tsx index 99832b9e5..63a04b0de 100644 --- a/app/react/sidebar/SettingsSidebar.tsx +++ b/app/react/sidebar/SettingsSidebar.tsx @@ -8,9 +8,9 @@ interface Props { } export function SettingsSidebar({ isAdmin }: Props) { - const teamSyncQuery = usePublicSettings( - (settings) => settings.TeamSync - ); + const teamSyncQuery = usePublicSettings({ + select: (settings) => settings.TeamSync, + }); const showUsersSection = !window.ddExtension && (isAdmin || teamSyncQuery.data);