Skip to content

Commit 3b2dcca

Browse files
authored
Merge pull request #1443 from snyk/staging
RELEASE
2 parents 4e64659 + eff54fb commit 3b2dcca

File tree

7 files changed

+125
-13
lines changed

7 files changed

+125
-13
lines changed

src/index.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,7 @@ async function setupSysdigIntegration(): Promise<void> {
7777
) &&
7878
!(config.SYSDIG_ENDPOINT && config.SYSDIG_TOKEN)
7979
) {
80-
console.log(
81-
config.SYSDIG_REGION_URL,
82-
config.SYSDIG_RISK_SPOTLIGHT_TOKEN,
83-
config.SYSDIG_CLUSTER_NAME,
84-
);
85-
console.log('Sysdig integration not enabled');
80+
logger.info({}, 'Sysdig integration not enabled');
8681
return;
8782
}
8883

src/supervisor/watchers/handlers/argo-rollout.ts

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,46 @@ export async function paginatedClusterArgoRolloutList(): Promise<{
101101
export async function argoRolloutWatchHandler(
102102
rollout: V1alpha1Rollout,
103103
): Promise<void> {
104+
if (rollout.spec?.workloadRef && rollout.metadata?.namespace) {
105+
// Attempt to load workloadRef if a template is not directly defined
106+
const workloadName = rollout.spec.workloadRef.name;
107+
const namespace = rollout.metadata.namespace;
108+
switch (rollout.spec.workloadRef.kind) {
109+
// Perform lookup for known supported kinds: https://github.com/argoproj/argo-rollouts/blob/master/rollout/templateref.go#L40-L52
110+
case 'Deployment': {
111+
const deployResult = await retryKubernetesApiRequest(() =>
112+
k8sApi.appsClient.readNamespacedDeployment(workloadName, namespace),
113+
);
114+
rollout.spec.template = deployResult.body.spec?.template;
115+
break;
116+
}
117+
case 'ReplicaSet': {
118+
const replicaSetResult = await retryKubernetesApiRequest(() =>
119+
k8sApi.appsClient.readNamespacedReplicaSet(workloadName, namespace),
120+
);
121+
rollout.spec.template = replicaSetResult.body.spec?.template;
122+
break;
123+
}
124+
case 'PodTemplate': {
125+
const podTemplateResult = await retryKubernetesApiRequest(() =>
126+
k8sApi.coreClient.readNamespacedPodTemplate(workloadName, namespace),
127+
);
128+
rollout.spec.template = podTemplateResult.body.template;
129+
break;
130+
}
131+
default:
132+
logger.debug(
133+
{ workloadKind: WorkloadKind.ArgoRollout },
134+
'Unsupported workloadRef kind specified',
135+
);
136+
}
137+
}
104138
rollout = trimWorkload(rollout);
105139

106140
if (
107141
!rollout.metadata ||
108-
!rollout.spec ||
109-
!rollout.spec.template.metadata ||
110-
!rollout.spec.template.spec ||
142+
!rollout.spec?.template?.metadata ||
143+
!rollout.spec?.template?.spec ||
111144
!rollout.status
112145
) {
113146
return;

src/supervisor/watchers/handlers/types.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,20 @@ export interface V1alpha1Rollout extends KubernetesObject {
8585
}
8686

8787
export interface V1alpha1RolloutSpec {
88-
template: V1PodTemplateSpec;
88+
template?: V1PodTemplateSpec;
89+
workloadRef?: V1alpha1RolloutWorkloadRef;
8990
}
9091

9192
export interface V1alpha1RolloutStatus {
9293
observedGeneration?: number;
9394
}
9495

96+
export interface V1alpha1RolloutWorkloadRef {
97+
apiVersion: string;
98+
kind: string;
99+
name: string;
100+
}
101+
95102
export type V1ClusterList<T> = (
96103
allowWatchBookmarks?: boolean,
97104
_continue?: string,

src/supervisor/workload-reader.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,11 +338,21 @@ const argoRolloutReader: IWorkloadReaderFunc = async (
338338
);
339339
const rollout: V1alpha1Rollout = trimWorkload(rolloutResult.body);
340340

341+
if (rollout.spec?.workloadRef && rollout.metadata?.namespace) {
342+
// Lookup child template metadata when a workloadRef is defined
343+
const workloadReader = getWorkloadReader(rollout.spec.workloadRef.kind);
344+
const workloadMetadata = await workloadReader(
345+
rollout.spec.workloadRef.name,
346+
rollout.metadata.namespace,
347+
);
348+
rollout.spec.template = {
349+
metadata: workloadMetadata?.specMeta,
350+
};
351+
}
352+
341353
if (
342354
!rollout.metadata ||
343-
!rollout.spec ||
344-
!rollout.spec.template.metadata ||
345-
!rollout.spec.template.spec ||
355+
!rollout.spec?.template?.metadata ||
346356
!rollout.status
347357
) {
348358
logIncompleteWorkload(workloadName, namespace);

test/fixtures/argo-rollout.yaml

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,53 @@ spec:
3131
requests:
3232
memory: 32Mi
3333
cpu: 5m
34+
---
35+
apiVersion: argoproj.io/v1alpha1
36+
kind: Rollout
37+
metadata:
38+
name: argo-rollout-workload-ref
39+
namespace: services
40+
spec:
41+
replicas: 1
42+
strategy:
43+
canary:
44+
steps:
45+
- setWeight: 100
46+
revisionHistoryLimit: 1
47+
selector:
48+
matchLabels:
49+
app: rollouts-workload-demo
50+
workloadRef:
51+
apiVersion: apps/v1
52+
kind: Deployment
53+
name: argo-rollout-workload-deployment
54+
---
55+
apiVersion: apps/v1
56+
kind: Deployment
57+
metadata:
58+
name: argo-rollout-workload-deployment
59+
namespace: services
60+
spec:
61+
replicas: 1
62+
revisionHistoryLimit: 1
63+
selector:
64+
matchLabels:
65+
app: rollouts-workload-demo
66+
template:
67+
metadata:
68+
labels:
69+
app: rollouts-workload-demo
70+
spec:
71+
imagePullSecrets:
72+
- name: docker-io
73+
containers:
74+
- name: rollouts-workload-demo
75+
image: argoproj/rollouts-demo:blue
76+
ports:
77+
- name: http
78+
containerPort: 8080
79+
protocol: TCP
80+
resources:
81+
requests:
82+
memory: 32Mi
83+
cpu: 5m

test/integration/kubernetes.spec.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,22 @@ test('snyk-monitor sends data to kubernetes-upstream', async () => {
299299
},
300300
expect.any(Object),
301301
]);
302+
303+
const scanResultsArgoRolloutWorkloadRef = await getUpstreamResponseBody(
304+
`api/v1/scan-results/${integrationId}/${clusterName}/services/Rollout/argo-rollout-workload-ref`,
305+
);
306+
expect(
307+
scanResultsArgoRolloutWorkloadRef.workloadScanResults[
308+
'argoproj/rollouts-demo'
309+
],
310+
).toEqual<ScanResult[]>([
311+
{
312+
identity: { type: 'linux', args: { platform: 'linux/amd64' } },
313+
facts: expect.any(Array),
314+
target: { image: 'docker-image|argoproj/rollouts-demo' },
315+
},
316+
expect.any(Object),
317+
]);
302318
}
303319
});
304320

test/unit/supervisor/workload-reader.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ describe('workload reader tests', () => {
1515
expect(
1616
SupportedWorkloadTypes.indexOf('ReplicationController') > -1,
1717
).toEqual(true);
18+
expect(SupportedWorkloadTypes.indexOf('Rollout') > -1).toEqual(true);
1819
});
1920

2021
test.concurrent('getSupportedWorkload()', async () => {

0 commit comments

Comments
 (0)