diff --git a/src/components/Agents/Add/AddAgentForm.tsx b/src/components/Agents/Add/AddAgentForm.tsx index 4ae8fb256..7fde2da0b 100644 --- a/src/components/Agents/Add/AddAgentForm.tsx +++ b/src/components/Agents/Add/AddAgentForm.tsx @@ -1,6 +1,7 @@ import { useAgentQuery } from "@flanksource-ui/api/query-hooks/useAgentsQuery"; import FormikSwitchField from "@flanksource-ui/components/Forms/Formik/FormikSwitchField"; import { AuthorizationAccessCheck } from "@flanksource-ui/components/Permissions/AuthorizationAccessCheck"; +import { useUser } from "@flanksource-ui/context"; import { tables } from "@flanksource-ui/context/UserAccessContext/permissions"; import FormSkeletonLoader from "@flanksource-ui/ui/SkeletonLoader/FormSkeletonLoader"; import clsx from "clsx"; @@ -23,6 +24,10 @@ import DeleteAgentButton from "../DeleteAgentButton"; export type AgentFormValues = GenerateAgent & { kubernetes?: Record; + pushTelemetry?: { + enabled?: boolean; + topologyName?: string; + }; }; type Props = { @@ -40,6 +45,7 @@ export default function AgentForm({ onSuccess = () => {}, onUpdated = () => {} }: Props) { + const { backendUrl } = useUser(); const [formValues, setFormValues] = useState(); const { data, isLoading: isLoadingAgent } = useAgentQuery(id!, { @@ -103,6 +109,10 @@ export default function AgentForm({ kubernetes: { interval: "30m", enabled: false + }, + pushTelemetry: { + enabled: false, + topologyName: backendUrl ?? "" } }} onSubmit={handleSubmit} @@ -169,6 +179,27 @@ export default function AgentForm({ hint="How often to perform a full reconciliation of changes (in addition to real-time changes from Kubernetes events), set higher for larger clusters." /> )} + + + Telemetry + + } + /> + {Boolean(values.pushTelemetry?.enabled) === true && ( + + )} diff --git a/src/components/Agents/InstalAgentInstruction/CLIInstallAgent.tsx b/src/components/Agents/InstalAgentInstruction/CLIInstallAgent.tsx index 11ae755b9..b260919be 100644 --- a/src/components/Agents/InstalAgentInstruction/CLIInstallAgent.tsx +++ b/src/components/Agents/InstalAgentInstruction/CLIInstallAgent.tsx @@ -1,4 +1,5 @@ import { GeneratedAgent } from "@flanksource-ui/api/services/agents"; +import { useUser } from "@flanksource-ui/context"; import CodeBlock from "@flanksource-ui/ui/Code/CodeBlock"; import Handlebars from "handlebars"; import { useMemo } from "react"; @@ -15,6 +16,10 @@ helm install mc-agent flanksource/mission-control-agent -n "mission-control-agen --set upstream.username=token \\ --set upstream.password={{generatedAgent.access_token}} \\ --set upstream.agentName={{agentFormValues.name}} \\ +{{#if pushTelemetry}} + --set pushTelemetry.enabled=true \\ + --set pushTelemetry.topologyName={{pushTelemetry.topologyName}} +{{/if}} --create-namespace {{#if kubeOptions}} @@ -35,16 +40,27 @@ export default function CLIInstallAgent({ generatedAgent, agentFormValues }: Props) { - const kubeOptions = agentFormValues?.kubernetes; - const baseUrl = useAgentsBaseURL(); + const { backendUrl, orgSlug } = useUser(); const helmCommandTemplate = useMemo(() => { + const kubeOptions = agentFormValues?.kubernetes; + const pushTelemetry = agentFormValues?.pushTelemetry; + return template( { generatedAgent, baseUrl, agentFormValues, + pushTelemetry: pushTelemetry?.enabled + ? { + ...pushTelemetry, + topologyName: orgSlug + ? `${orgSlug}-${pushTelemetry.topologyName}` + : pushTelemetry.topologyName + } + : undefined, + backendUrl, kubeOptions: kubeOptions ? { interval: kubeOptions?.interval, @@ -54,7 +70,7 @@ export default function CLIInstallAgent({ }, {} ); - }, [agentFormValues, baseUrl, generatedAgent, kubeOptions]); + }, [agentFormValues, backendUrl, baseUrl, generatedAgent, orgSlug]); return (
diff --git a/src/components/Agents/InstalAgentInstruction/FluxInstallAgent.tsx b/src/components/Agents/InstalAgentInstruction/FluxInstallAgent.tsx index fb2495304..944ede344 100644 --- a/src/components/Agents/InstalAgentInstruction/FluxInstallAgent.tsx +++ b/src/components/Agents/InstalAgentInstruction/FluxInstallAgent.tsx @@ -1,4 +1,5 @@ import { GeneratedAgent } from "@flanksource-ui/api/services/agents"; +import { useUser } from "@flanksource-ui/context"; import { JSONViewer } from "@flanksource-ui/ui/Code/JSONViewer"; import Handlebars from "handlebars"; import { useMemo } from "react"; @@ -40,6 +41,11 @@ spec: username: token agentName: {{agentFormValues.name}} password: {{generatedAgent.access_token}} +{{#if pushTelemetry}} + pushTelemetry: + enabled: true + topologyName: {{pushTelemetry.topologyName}} +{{/if}} {{#if kubeOptions}} --- apiVersion: helm.toolkit.fluxcd.io/v2beta1 @@ -72,16 +78,27 @@ export default function FluxInstallAgent({ generatedAgent, agentFormValues }: Props) { - const kubeOptions = agentFormValues?.kubernetes; - const baseUrl = useAgentsBaseURL(); + const { backendUrl, orgSlug } = useUser(); const yaml = useMemo(() => { + const kubeOptions = agentFormValues?.kubernetes; + const pushTelemetry = agentFormValues?.pushTelemetry ?? undefined; + return template( { generatedAgent, baseUrl, agentFormValues, + pushTelemetry: pushTelemetry?.enabled + ? { + ...pushTelemetry, + topologyName: orgSlug + ? `${orgSlug}-${pushTelemetry.topologyName}` + : pushTelemetry.topologyName + } + : undefined, + backendUrl, kubeOptions: kubeOptions ? { interval: kubeOptions?.interval, @@ -91,7 +108,7 @@ export default function FluxInstallAgent({ }, {} ); - }, [agentFormValues, baseUrl, generatedAgent, kubeOptions]); + }, [agentFormValues, backendUrl, baseUrl, generatedAgent, orgSlug]); return (
diff --git a/src/components/Authentication/Clerk/ClerkAuthContextProvider.tsx b/src/components/Authentication/Clerk/ClerkAuthContextProvider.tsx index 21d4d44f7..dfcf986da 100644 --- a/src/components/Authentication/Clerk/ClerkAuthContextProvider.tsx +++ b/src/components/Authentication/Clerk/ClerkAuthContextProvider.tsx @@ -70,7 +70,8 @@ export default function ClerkAuthContextProvider({ {children} diff --git a/src/context/index.ts b/src/context/index.ts index cee77f14c..45952abc5 100644 --- a/src/context/index.ts +++ b/src/context/index.ts @@ -4,6 +4,7 @@ import { User } from "../api/types/users"; interface IAuthContext { user?: User; backendUrl?: string; + orgSlug?: string; } export const AuthContext = createContext({});