Skip to content

Commit 6c38f3e

Browse files
authored
Merge pull request #784 from snyk/feat/stable-agent-id
Feat/stable agent
2 parents 59631f6 + ae735a2 commit 6c38f3e

File tree

12 files changed

+91
-53
lines changed

12 files changed

+91
-53
lines changed

snyk-monitor-deployment.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,18 @@ spec:
4343
secretKeyRef:
4444
name: snyk-monitor
4545
key: integrationId
46-
- name: SNYK_NAMESPACE
46+
- name: SNYK_WATCH_NAMESPACE
4747
valueFrom:
4848
configMapKeyRef:
4949
name: snyk-monitor
5050
key: namespace
5151
optional: true
52+
- name: SNYK_DEPLOYMENT_NAMESPACE
53+
valueFrom:
54+
fieldRef:
55+
fieldPath: metadata.namespace
56+
- name: SNYK_DEPLOYMENT_NAME
57+
value: snyk-monitor
5258
- name: SNYK_INTEGRATION_API
5359
valueFrom:
5460
configMapKeyRef:

snyk-monitor/templates/deployment.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,14 @@ spec:
7070
secretKeyRef:
7171
name: {{ .Values.monitorSecrets }}
7272
key: integrationId
73-
- name: SNYK_NAMESPACE
73+
- name: SNYK_WATCH_NAMESPACE
7474
value: {{ include "snyk-monitor.scope" . }}
75+
- name: SNYK_DEPLOYMENT_NAMESPACE
76+
valueFrom:
77+
fieldRef:
78+
fieldPath: metadata.namespace
79+
- name: SNYK_DEPLOYMENT_NAME
80+
value: {{ include "snyk-monitor.name" . }}
7581
- name: SNYK_INTEGRATION_API
7682
value: {{ .Values.integrationApi }}
7783
- name: SNYK_CLUSTER_NAME

src/common/config.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ function loadExcludedNamespaces(): string[] | null {
1818
}
1919
}
2020

21+
// NOTE: The agent identifier is replaced with a stable identifier once snyk-monitor starts up
2122
config.AGENT_ID = uuidv4();
23+
2224
config.INTEGRATION_ID = config.INTEGRATION_ID.trim();
2325
config.CLUSTER_NAME = config.CLUSTER_NAME || 'Default cluster';
2426
config.IMAGE_STORAGE_ROOT = '/var/tmp';

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { currentClusterName } from './supervisor/cluster';
99
import { beginWatchingWorkloads } from './supervisor/watchers';
1010
import { loadAndSendWorkloadEventsPolicy } from './common/policy';
1111
import { sendClusterMetadata } from './transmitter';
12+
import { setSnykMonitorAgentId } from './supervisor/agent';
1213

1314
process.on('uncaughtException', (err) => {
1415
if (state.shutdownInProgress) {
@@ -63,6 +64,7 @@ cleanUpTempStorage();
6364

6465
// Allow running in an async context
6566
setImmediate(async function setUpAndMonitor(): Promise<void> {
67+
await setSnykMonitorAgentId();
6668
await sendClusterMetadata();
6769
await loadAndSendWorkloadEventsPolicy();
6870
await monitor();

src/supervisor/agent.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { config } from '../common/config';
2+
import { logger } from '../common/logger';
3+
import { k8sApi } from './cluster';
4+
import { retryKubernetesApiRequest } from './kuberenetes-api-wrappers';
5+
6+
export async function setSnykMonitorAgentId(): Promise<void> {
7+
const name = config.DEPLOYMENT_NAME;
8+
const namespace = config.DEPLOYMENT_NAMESPACE;
9+
10+
const agentId = await getSnykMonitorDeploymentUid(name, namespace);
11+
if (agentId === undefined) {
12+
return;
13+
}
14+
15+
config.AGENT_ID = agentId;
16+
}
17+
18+
async function getSnykMonitorDeploymentUid(
19+
name: string,
20+
namespace: string,
21+
): Promise<string | undefined> {
22+
try {
23+
const attemptedApiCall = await retryKubernetesApiRequest(() =>
24+
k8sApi.appsClient.readNamespacedDeployment(name, namespace),
25+
);
26+
return attemptedApiCall.body.metadata?.uid;
27+
} catch (error) {
28+
logger.error(
29+
{ error, namespace, name },
30+
'could not read the snyk-monitor deployment unique id',
31+
);
32+
return undefined;
33+
}
34+
}

src/supervisor/watchers/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,12 @@ async function setupWatchesForCluster(): Promise<void> {
116116
}
117117

118118
export async function beginWatchingWorkloads(): Promise<void> {
119-
if (config.NAMESPACE) {
119+
if (config.WATCH_NAMESPACE) {
120120
logger.info(
121-
{ namespace: config.NAMESPACE },
121+
{ namespace: config.WATCH_NAMESPACE },
122122
'kubernetes-monitor restricted to specific namespace',
123123
);
124-
await setupWatchesForNamespace(config.NAMESPACE);
124+
await setupWatchesForNamespace(config.WATCH_NAMESPACE);
125125
return;
126126
}
127127

src/transmitter/payload.ts

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
IWorkloadMetadataPayload,
1010
IWorkloadMetadata,
1111
IWorkloadLocator,
12-
IKubernetesMonitorMetadata,
1312
ScanResultsPayload,
1413
IDependencyGraphPayload,
1514
IWorkloadEventsPolicyPayload,
@@ -38,17 +37,10 @@ export function constructDepGraph(
3837
name,
3938
};
4039

41-
const monitorMetadata: IKubernetesMonitorMetadata = {
42-
agentId: config.AGENT_ID,
43-
namespace: config.NAMESPACE,
44-
version: config.MONITOR_VERSION,
45-
};
46-
4740
return {
4841
imageLocator,
4942
agentId: config.AGENT_ID,
5043
dependencyGraph: JSON.stringify(scannedImage.pluginResult),
51-
metadata: monitorMetadata,
5244
};
5345
});
5446

@@ -78,17 +70,10 @@ export function constructScanResults(
7870
name,
7971
};
8072

81-
const monitorMetadata: IKubernetesMonitorMetadata = {
82-
agentId: config.AGENT_ID,
83-
namespace: config.NAMESPACE,
84-
version: config.MONITOR_VERSION,
85-
};
86-
8773
return {
8874
imageLocator,
8975
agentId: config.AGENT_ID,
9076
scanResults: scannedImage.scanResults,
91-
metadata: monitorMetadata,
9277
};
9378
});
9479
}

src/transmitter/types.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,25 +31,16 @@ export interface IImageLocator extends IWorkloadLocator {
3131
imageWithDigest?: string;
3232
}
3333

34-
export interface IKubernetesMonitorMetadata {
35-
agentId: string;
36-
version: string;
37-
namespace?: string;
38-
}
39-
4034
export interface IDependencyGraphPayload {
4135
imageLocator: IImageLocator;
4236
agentId: string;
4337
dependencyGraph?: string;
44-
metadata: IKubernetesMonitorMetadata;
4538
}
4639

4740
export interface ScanResultsPayload {
4841
imageLocator: IImageLocator;
4942
agentId: string;
5043
scanResults: ScanResult[];
51-
/** @deprecated TODO: This should be sent in a separate API. */
52-
metadata: IKubernetesMonitorMetadata;
5344
}
5445

5546
export interface IWorkloadMetadataPayload {

test/fixtures/pod-spec.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
}
1313
},
1414
{
15-
"name": "SNYK_NAMESPACE"
15+
"name": "SNYK_WATCH_NAMESPACE"
1616
},
1717
{
1818
"name": "SNYK_INTEGRATION_API"

test/setup/deployers/yaml.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,18 @@ function createTestYamlDeployment(
3434
);
3535
const deployment = parse(originalDeploymentYaml);
3636

37-
deployment.spec.template.spec.containers[0].image = imageNameAndTag;
38-
deployment.spec.template.spec.containers[0].imagePullPolicy = imagePullPolicy;
37+
const container = deployment.spec.template.spec.containers.find(
38+
(container) => container.name === 'snyk-monitor',
39+
);
40+
container.image = imageNameAndTag;
41+
container.imagePullPolicy = imagePullPolicy;
3942

4043
// Inject the baseUrl of kubernetes-upstream that snyk-monitor container use to send metadata
41-
deployment.spec.template.spec.containers[0].env[2] = {
42-
name: 'SNYK_INTEGRATION_API',
43-
value: 'https://kubernetes-upstream.dev.snyk.io',
44-
};
44+
const envVar = container.env.find(
45+
(env) => env.name === 'SNYK_INTEGRATION_API',
46+
);
47+
envVar.value = 'https://kubernetes-upstream.dev.snyk.io';
48+
delete envVar.valueFrom;
4549

4650
writeFileSync(newYamlPath, stringify(deployment));
4751
console.log('Created YAML snyk-monitor deployment');

0 commit comments

Comments
 (0)