-
Notifications
You must be signed in to change notification settings - Fork 21
Expand file tree
/
Copy pathMakefile
More file actions
1908 lines (1615 loc) · 97.8 KB
/
Makefile
File metadata and controls
1908 lines (1615 loc) · 97.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#
#Copyright 2024 NVIDIA
#
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing, software
#distributed under the License is distributed on an "AS IS" BASIS,
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#See the License for the specific language governing permissions and
#limitations under the License.
# Get the directory of this Makefile, regardless of where make was invoked
# This must be done BEFORE including other Makefiles
# Get the Makefile's directory as an absolute path while preserving symlinks
PROJECT_DIR := $(shell cd $(dir $(lastword $(MAKEFILE_LIST))) && pwd -L)
# Remove any trailing slash for consistency
# Example: $(dir ...) returns "/path/to/project/" but we want "/path/to/project"
PROJECT_DIR := $(patsubst %/,%,$(PROJECT_DIR))
## Include Make modules which are split up in this repo for better structure.
include hack/tools/tools.mk
PROJECT_NAME="DOCA Platform Framework"
PROJECT_REPO="https://github.com/NVIDIA/doca-platform"
export DATE="$(shell date --rfc-3339=seconds)"
export FULL_COMMIT ?= $(shell git rev-parse HEAD 2>/dev/null || echo "unknown")
# Export is needed here so that the envsubst used in make targets has access to those variables even when they are not
# explicitly set when calling make.
# The tag must have three digits with a leading v - i.e. v9.9.1
export TAG ?= v0.1.0
# Note: Registry defaults to non-existing registry intentionally to avoid overriding useful images.
export REGISTRY ?= example.com
# This variable should be overwritten with the registry of the upstream artifacts. Needed when making a release upstream.
# This variable ensures that the values injected in the operator and charts point to the upstream artifacts.
export UPSTREAM_REGISTRY ?= $(REGISTRY)
# The latest stable tag is used in various places to refer to the latest stable release of DPF.
LATEST_STABLE_TAG = v25.10.1
# If V is set to 1 the output will be verbose.
Q = $(if $(filter 1,$V),,@)
# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary.
ENVTEST_K8S_VERSION = 1.32.0
# Get the current OS and Architecture
ARCH ?= $(shell go env GOARCH)
OS ?= $(shell go env GOOS)
# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
ifeq (,$(shell go env GOBIN))
GOBIN=$(shell go env GOPATH)/bin
else
GOBIN=$(shell go env GOBIN)
endif
GO_VERSION ?= $(shell awk '/^toolchain /{print $$2}' go.mod | awk -F 'go' '{print $$2}')
# Allows for defining additional Go test args, e.g. '-tags integration'.
# The linkmode=internal flag is used to force using Go linker to do the linking.
# This suppresses warnings like ".../00NNNN.o has malformed LC_DYSYMTAB".
# See the following issue for more details: https://github.com/golang/go/issues/61229#issuecomment-1988965927
GO_TEST_ARGS ?= -race -ldflags=-linkmode=internal
# Setting SHELL to bash allows bash commands to be executed by recipes.
# Options are set to exit when a recipe line exits non-zero or a piped command fails.
SHELL = /usr/bin/env bash -o pipefail
.SHELLFLAGS = -ec
# Contains all image references we expect to push.
ALL_CONTAINER_IMAGES ?= $(shell awk '/Image:/{print $$2}' < $(RELEASE_FILE))
##@ General
# The help target prints out all targets with their descriptions organized
# beneath their categories. The categories are represented by '##@' and the
# target descriptions by '##'. The awk command is responsible for reading the
# entire set of makefiles included in this invocation, looking for lines of the
# file as xyz: ## something, and then pretty-format the target and help. Then,
# if there's a line with ##@ something, that gets pretty-printed as a category.
# More info on the usage of ANSI control characters for terminal formatting:
# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters
# More info on the awk command:
# http://linuxcommand.org/lc3_adv_awk.php
.PHONY: help
help: ## Display this help.
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
LOCALBIN ?= $(PROJECT_DIR)/bin
export CHARTSDIR ?= $(PROJECT_DIR)/hack/charts
DPUSERVICESDIR ?= $(PROJECT_DIR)/dpuservices
REPOSDIR ?= $(PROJECT_DIR)/hack/repos
HELMDIR ?= $(PROJECT_DIR)/deploy/charts
CRDDIR ?= $(HELMDIR)/dpf-operator/templates/crds
THIRDPARTYDIR ?= $(PROJECT_DIR)/third_party/forked
EXAMPLE ?= $(PROJECT_DIR)/example
$(LOCALBIN) $(CHARTSDIR) $(DPUSERVICESDIR) $(REPOSDIR):
@mkdir -p $@
.PHONY: clean
clean: ; $(info Cleaning...) @ ## Clean non-essential files from the repo
@rm -rf $(CHARTSDIR)
@rm -rf $(TOOLSDIR)
@rm -rf $(REPOSDIR)
# Note: This helps resolve errors with `docker manifest create`
.PHONY: clean-images-for-registry
clean-images-for-registry: ## Clean release deletes local images with the $REGISTRY
for image in $$(docker images $$REGISTRY/* --format "{{.ID}}"); do \
docker rmi -f $$image ; \
done
##@ Dependencies
# OVS CNI
# A third party import to the repo. In future this will be further integrated.
OVS_CNI_DIR=$(THIRDPARTYDIR)/ovs-cni
DOCA_SOSREPORT_REPO_URL=https://github.com/NVIDIA/doca-sosreport/archive/$(DOCA_SOSREPORT_REF).tar.gz
DOCA_SOSREPORT_REF=6b4289b9f0d9f26af177b0d1c4c009ca74bb514a
SOS_REPORT_DIR=$(REPOSDIR)/doca-sosreport-$(DOCA_SOSREPORT_REF)
$(SOS_REPORT_DIR): | $(REPOSDIR)
curl -sL ${DOCA_SOSREPORT_REPO_URL} | tar -xz -C ${REPOSDIR}
# nvidia-external-attacher dependencies to be able to build its docker image
EXTERNAL_ATTACHER_BRANCH=release-4.9
NVIDIA_EXTERNAL_ATTACHER_DIR=third_party/forked/nvidia-external-attacher
# Image for the SR-IOV device plugin, deployed by the NodeSRIOVDevicePlugin controller in the host cluster
export NODE_SRIOV_DEVICE_PLUGIN_IMAGE=nvcr.io/nvidia/mellanox/sriov-network-device-plugin
export NODE_SRIOV_DEVICE_PLUGIN_TAG=network-operator-v25.10.0
# VPC dependencies to be able to build/push images and charts
VPC_REF=6952d0d082c349293b5c945f5c1a1b5c0634c66e
VPC_DIR=$(REPOSDIR)/ovn-vpc/ovn-vpc-$(VPC_REF)
# Token used for gitlab reporistory access, usually needed for CI/CD pipelines.
# dev envs usually have those set in git credentials.
GITLAB_CLONE_TOKEN?=
$(VPC_DIR): | $(REPOSDIR)
if [ -z "$(GITLAB_CLONE_TOKEN)" ]; then \
git clone https://gitlab-master.nvidia.com/doca-platform-foundation/dpf-vpc.git $(VPC_DIR)-tmp; \
else \
git clone https://token:$(GITLAB_CLONE_TOKEN)@gitlab-master.nvidia.com/doca-platform-foundation/dpf-vpc.git $(VPC_DIR)-tmp; \
fi
cd $(VPC_DIR)-tmp && git reset --hard $(VPC_REF)
mv $(VPC_DIR)-tmp $(VPC_DIR)
# delete old ovn-vpc directories.
find $(REPOSDIR)/ovn-vpc/ -mindepth 1 -maxdepth 1 -not -name ovn-vpc-$(VPC_REF) -exec rm -rf '{}' \;
##@ GRPC
# go package for generated code
API_PKG_GO_MOD ?= github.com/nvidia/doca-platform/api/grpc
## Temporary location for GRPC files
GRPC_TMP_DIR ?= $(PROJECT_DIR)/_tmp
$(GRPC_TMP_DIR):
@mkdir -p $@
# GRPC DIRs
GRPC_DIR ?= $(PROJECT_DIR)/api/grpc
PROTO_DIR ?= $(GRPC_DIR)/proto
GENERATED_CODE_DIR ?= $(GRPC_DIR)
.PHONY: grpc-generate
grpc-generate: protoc protoc-gen-go protoc-gen-go-grpc ## Generate GO client and server GRPC code
@echo "generate GRPC API"; \
echo " go module: $(API_PKG_GO_MOD)"; \
echo " output dir: $(GENERATED_CODE_DIR) "; \
echo " proto dir: $(PROTO_DIR) "; \
cd $(PROTO_DIR) && \
TARGET_FILES=""; \
PROTOC_OPTIONS="--plugin=protoc-gen-go=$(PROTOC_GEN_GO) \
--plugin=protoc-gen-go-grpc=$(PROTOC_GEN_GO_GRPC) \
--go_out=$(GENERATED_CODE_DIR) \
--go_opt=module=$(API_PKG_GO_MOD) \
--proto_path=$(PROTO_DIR) \
--go-grpc_out=$(GENERATED_CODE_DIR) \
--go-grpc_opt=module=$(API_PKG_GO_MOD)"; \
echo "discovered proto files:"; \
for proto_file in $$(find . -name "*.proto"); do \
proto_file=$$(echo $$proto_file | cut -d'/' -f2-); \
proto_dir=$$(dirname $$proto_file); \
pkg_name=M$$proto_file=$(API_PKG_GO_MOD)/$$proto_dir; \
echo " $$proto_file"; \
TARGET_FILES="$$TARGET_FILES $$proto_file"; \
PROTOC_OPTIONS="$$PROTOC_OPTIONS \
--go_opt=$$pkg_name \
--go-grpc_opt=$$pkg_name" ; \
done; \
$(PROTOC) $$PROTOC_OPTIONS $$TARGET_FILES
.PHONY: grpc-check
grpc-check: grpc-format grpc-lint protoc protoc-gen-go protoc-gen-go-grpc $(GRPC_TMP_DIR) ## Check that generated GO client code match proto files
@rm -rf $(GRPC_TMP_DIR)/nvidia/
@$(MAKE) GENERATED_CODE_DIR=$(GRPC_TMP_DIR) grpc-generate
@diff -Naur $(GRPC_TMP_DIR)/nvidia/ $(GENERATED_CODE_DIR)/nvidia/ || \
(printf "\n\nOutdated files detected!\nPlease, run 'make generate' to regenerate GO code\n\n" && exit 1)
@echo "generated files are up to date"
.PHONY: grpc-lint
grpc-lint: buf ## Lint GRPC files
@echo "lint protobuf files";
cd $(PROTO_DIR) && \
$(BUF) lint --config ../buf.yaml .
.PHONY: grpc-format
grpc-format: buf ## Format GRPC files
@echo "format protobuf files";
cd $(PROTO_DIR) && \
$(BUF) format -w --exit-code
##@ Development
GENERATE_TARGETS ?= dpuservice provisioning servicechainset sfc-controller vpc-crds operator \
operator-embedded release-defaults kamaji-cluster-manager static-cluster-manager \
storage mock-dms nodesriovdeviceplugin
.PHONY: generate
generate: ## Run all generate-* targets: generate-modules generate-manifests-* and generate-go-deepcopy-*.
$(MAKE) generate-mocks generate-modules generate-manifests generate-go-deepcopy generate-docs generate-client-for-storage-nvidia-external-attacher
.PHONY: generate-mocks
generate-mocks: mockgen ## Generate mocks
## Prepend the TOOLSDIR to the path for this command as `mockgen` is called from the $PATH inline in the code.
## The DPF TOOLSDIR should be first in the path to ensure user tools are not used.
## See go:generate comments for examples.
export PATH="$(TOOLSDIR):$(PATH)"; go generate $$(go list ./...)
.PHONY: generate-modules
generate-modules: ## Run go mod tidy to update go modules
go mod tidy
.PHONY: generate-manifests
generate-manifests: $(addprefix generate-manifests-,$(GENERATE_TARGETS)) ## Run all generate-manifests-* targets
.PHONY: generate-manifests-operator
generate-manifests-operator: controller-gen kustomize ## Generate manifests e.g. CRD, RBAC. for the operator controller.
$(MAKE) clean-generated-yaml SRC_DIRS=$(CRDDIR)
$(CONTROLLER_GEN) \
paths="./cmd/operator/..." \
paths="./cmd/kamaji-cluster-manager/..." \
paths="./cmd/static-cluster-manager/..." \
paths="./internal/operator/..." \
paths="./internal/clustermanager/..." \
paths="./internal/provisioning/..." \
paths="./api/operator/..." \
crd:crdVersions=v1 \
rbac:roleName="dpf-operator-manager-role" \
output:crd:dir=./config/operator-crds \
output:rbac:dir=./deploy/charts/dpf-operator/templates
## Copy CRD definitions to the operator helm directory
$(KUSTOMIZE) build config/operator-crds -o $(CRDDIR);
.PHONE: generate-manifests-mock-dms
generate-manifests-mock-dms: controller-gen
$(CONTROLLER_GEN) \
paths="./test/mock/dms/..." \
rbac:roleName=mock-dms-manager-role \
output:rbac:dir=./test/mock/dms/chart/templates/
.PHONY: generate-manifests-dpuservice
generate-manifests-dpuservice: controller-gen ## Generate manifests e.g. CRD, RBAC. for the dpuservice controller.
$(MAKE) clean-generated-yaml SRC_DIRS="./config/dpuservice/crd/bases"
$(CONTROLLER_GEN) \
paths="./cmd/dpuservice/..." \
paths="./internal/dpuservice/..." \
paths="./internal/dpuservicechain/..." \
paths="./api/dpuservice/..." \
crd:crdVersions=v1 \
rbac:roleName=manager-role \
output:crd:dir=./config/dpuservice/crd/bases \
output:rbac:dir=./config/dpuservice/rbac \
output:webhook:dir=./config/dpuservice/webhook \
webhook
.PHONY: generate-manifests-servicechainset
generate-manifests-servicechainset: controller-gen kustomize envsubst ## Generate manifests e.g. CRD, RBAC. for the servicechainset controller.
# TODO: Clean up pod-ipam-injector generation
$(CONTROLLER_GEN) \
paths="./cmd/servicechainset/..." \
paths="./internal/servicechainset/..." \
paths="./internal/pod-ipam-injector/..." \
rbac:roleName=servicechainset-controller-manager \
output:rbac:dir=deploy/charts/dpu-networking/charts/servicechainset-controller/templates;
find config/dpuservice/crd/bases/ -type f -not -name '*_dpu*' -exec cp {} deploy/charts/dpu-networking/charts/servicechainset-controller/templates/crds/ \;
# Make the role.yaml compatible with the chart design so that multiple charts can be deployed and the manifest is skipped in specific cases.
sed -i 's/name: servicechainset-controller-manager/name: {{ include "servicechain.fullname" . }}/g' deploy/charts/dpu-networking/charts/servicechainset-controller/templates/role.yaml
sed -i '1i{{ if .Values.deployDPUManifests }}' deploy/charts/dpu-networking/charts/servicechainset-controller/templates/role.yaml
echo '{{- end }}' >> deploy/charts/dpu-networking/charts/servicechainset-controller/templates/role.yaml
.PHONY: generate-manifests-storage
generate-manifests-storage: controller-gen kustomize embedmd yq ## Generate CRDs for SNAP storage in DPU cluster
$(MAKE) clean-generated-yaml SRC_DIRS="./config/storage/crd/bases"
$(CONTROLLER_GEN) \
paths="./api/storage/..." \
crd:crdVersions=v1,generateEmbeddedObjectMeta=true \
output:crd:dir=./config/storage/crd/bases
rm -rf $(STORAGE_CHART)/templates/crd && mkdir -p $(STORAGE_CHART)/templates/crd
@for f in config/storage/crd/bases/*.yaml; do \
if echo $$(basename "$$f") | grep -qv "nvidia.com_dpu"; then \
cp "$$f" $(STORAGE_CHART)/templates/crd/; \
fi \
done
@for f in $(STORAGE_CHART)/templates/crd/*.yaml; do \
(echo "{{- if .Values.dpu.deployCrds }}" && cat "$$f" && echo "{{- end }}") > "$$f.tmp" && mv "$$f.tmp" "$$f"; \
done
## Set the image names and tags for storage-related charts
$(ENVSUBST) < $(STORAGE_CHART)/values.yaml.tmpl > $(STORAGE_CHART)/values.yaml
cd $(DPUSERVICESDIR)/storage/examples/_src/ && ./update.sh
grep -rl --include \*.md -e '\[embedmd\]' $(DPUSERVICESDIR)/storage/examples | xargs $(EMBEDMD) -w
RELEASE_FILE = ./internal/release/manifests/defaults.yaml
.PHONY: generate-manifests-release-defaults
generate-manifests-release-defaults: envsubst ## Generates manifests that contain the default values that should be used by the operators
mkdir -p ./build
$(ENVSUBST) < ./internal/release/templates/defaults.yaml.tmpl > $(RELEASE_FILE)
## Copy the generated release defaults to the build directory to be able to copy them during docker build.
## This is needed as the internal/release directory is not in the docker build context.
cp $(RELEASE_FILE) ./build/defaults.yaml
TEMPLATES_DIR ?= $(PROJECT_DIR)/internal/operator/inventory/templates
EMBEDDED_MANIFESTS_DIR ?= $(PROJECT_DIR)/internal/operator/inventory/manifests
.PHONY: generate-manifests-operator-embedded
generate-manifests-operator-embedded: kustomize envsubst generate-manifests-dpuservice generate-manifests-provisioning generate-manifests-release-defaults generate-manifests-kamaji-cluster-manager generate-manifests-static-cluster-manager generate-manifests-nodesriovdeviceplugin ## Generates manifests that are embedded into the operator binary.
# Reorder none here ensure that we generate the kustomize files in a specific order to be consumed by the DPF Operator.
$(KUSTOMIZE) build --reorder=none config/provisioning/default > $(EMBEDDED_MANIFESTS_DIR)/provisioning-controller.yaml
$(KUSTOMIZE) build --reorder=none config/dpu-detector > $(EMBEDDED_MANIFESTS_DIR)/dpu-detector.yaml
$(KUSTOMIZE) build --reorder=none config/dpuservice/default > $(EMBEDDED_MANIFESTS_DIR)/dpuservice-controller.yaml
$(KUSTOMIZE) build --reorder=none config/kamaji-cluster-manager/default > $(EMBEDDED_MANIFESTS_DIR)/kamaji-cluster-manager.yaml
$(KUSTOMIZE) build --reorder=none config/static-cluster-manager/default > $(EMBEDDED_MANIFESTS_DIR)/static-cluster-manager.yaml
$(KUSTOMIZE) build --reorder=none config/bfb_registry > $(EMBEDDED_MANIFESTS_DIR)/bfb-registry.yaml
$(KUSTOMIZE) build --reorder=none config/nodesriovdeviceplugin/default > $(EMBEDDED_MANIFESTS_DIR)/nodesriovdeviceplugin-controller.yaml
.PHONY: generate-manifests-sfc-controller
generate-manifests-sfc-controller: envsubst generate-manifests-servicechainset
cp deploy/charts/dpu-networking/charts/servicechainset-controller/templates/crds/svc.dpu.nvidia.com_servicechains.yaml deploy/charts/dpu-networking/charts/sfc-controller/templates/crds/
cp deploy/charts/dpu-networking/charts/servicechainset-controller/templates/crds/svc.dpu.nvidia.com_serviceinterfaces.yaml deploy/charts/dpu-networking/charts/sfc-controller/templates/crds/
.PHONY: generate-manifests-provisioning
generate-manifests-provisioning: controller-gen kustomize ## Generate manifests e.g. CRD, RBAC. for the DPF provisioning controller.
$(MAKE) clean-generated-yaml SRC_DIRS="./config/provisioning/crd/bases"
$(CONTROLLER_GEN) \
paths="./cmd/provisioning/..." \
paths="./internal/provisioning/..." \
paths="./api/provisioning/..." \
crd:crdVersions=v1,generateEmbeddedObjectMeta=true \
rbac:roleName=manager-role \
output:crd:dir=./config/provisioning/crd/bases \
output:rbac:dir=./config/provisioning/rbac \
output:webhook:dir=./config/provisioning/webhook \
webhook
.PHONY: generate-manifests-kamaji-cluster-manager
generate-manifests-kamaji-cluster-manager: controller-gen kustomize ## Generate manifests e.g. CRD, RBAC. for the DPF provisioning controller.
$(CONTROLLER_GEN) \
paths="./cmd/kamaji-cluster-manager/..." \
paths="./internal/clustermanager/controller/..." \
paths="./internal/clustermanager/kamaji/..." \
rbac:roleName=manager-role \
output:rbac:dir=./config/kamaji-cluster-manager/rbac
.PHONY: generate-manifests-static-cluster-manager
generate-manifests-static-cluster-manager: controller-gen kustomize ## Generate manifests e.g. CRD, RBAC. for the DPF provisioning controller.
$(CONTROLLER_GEN) \
paths="./cmd/static-cluster-manager/..." \
paths="./internal/clustermanager/controller/..." \
paths="./internal/clustermanager/static/..." \
rbac:roleName=manager-role \
output:rbac:dir=./config/static-cluster-manager/rbac
.PHONY: generate-manifests-vpc-crds
generate-manifests-vpc-crds: controller-gen kustomize ## Generate manifests for VPC (CRDs)
$(MAKE) clean-generated-yaml SRC_DIRS="./config/vpc/crd/bases"
$(CONTROLLER_GEN) \
paths="./api/vpc/..." \
crd:crdVersions=v1 \
output:crd:dir=./config/vpc/crd/bases
.PHONY: generate-manifests-nodesriovdeviceplugin
generate-manifests-nodesriovdeviceplugin: controller-gen kustomize ## Generate manifests e.g. CRD, RBAC for nodesriovdeviceplugin controller.
$(MAKE) clean-generated-yaml SRC_DIRS="./config/nodesriovdeviceplugin/crd/bases"
$(CONTROLLER_GEN) \
paths="./cmd/nodesriovdeviceplugin/controller/..." \
paths="./internal/nodesriovdeviceplugin/controllers/..." \
paths="./internal/nodesriovdeviceplugin/webhooks/..." \
paths="./api/noderesources/..." \
crd:crdVersions=v1,generateEmbeddedObjectMeta=true \
rbac:roleName=manager-role \
output:crd:dir=./config/nodesriovdeviceplugin/crd/bases \
output:rbac:dir=./config/nodesriovdeviceplugin/rbac \
output:webhook:dir=./config/nodesriovdeviceplugin/webhook \
webhook
.PHONY: clean-generated-yaml
clean-generated-yaml: ## Remove files generated by controller-tools from the mentioned dirs.
(IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name '*.yaml' -exec rm -f {} \;; done)
.PHONY: generate-go-deepcopy
generate-go-deepcopy: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
$(MAKE) clean-generated-deepcopy SRC_DIRS="./api"
$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./api/..."
.PHONY: clean-generated-deepcopy
clean-generated-deepcopy: ## Remove files generated by golang from the mentioned dirs.
(IFS=','; for i in $(SRC_DIRS); do find $$i -type f -name 'zz_generated.deepcopy*' -exec rm -f {} \;; done)
##@ Documentation
GENERATE_DOC_TARGETS ?= mdtoc api helm embedmd
.PHONY: generate-docs
generate-docs: $(addprefix generate-docs-,$(GENERATE_DOC_TARGETS))
$(MAKE)
generate-docs-mdtoc: mdtoc ## Generate table of contents for our documentation.
@files=$$(grep -rl -e '<!-- toc -->' docs | grep '\.md$$' || true); \
if [ -n "$$files" ]; then \
echo "$$files" | xargs $(MDTOC) --inplace; \
else \
echo "No files with TOC markers found, skipping mdtoc"; \
fi
.PHONY: generate-docs-api
generate-docs-api: gen-crd-api-reference-docs ## Generate docs for the API.
$(GEN_CRD_API_REFERENCE_DOCS) --renderer=markdown --source-path=api --config=hack/tools/api-docs/config.yaml --output-path=docs/public/developer-guides/api/api.md.tmp
@echo '---' > docs/public/developer-guides/api/api.md
@echo 'title: "API reference"' >> docs/public/developer-guides/api/api.md
@echo '---' >> docs/public/developer-guides/api/api.md
@echo '' >> docs/public/developer-guides/api/api.md
@cat docs/public/developer-guides/api/api.md.tmp >> docs/public/developer-guides/api/api.md
@rm docs/public/developer-guides/api/api.md.tmp
.PHONY: generate-docs-helm
generate-docs-helm: helm-docs yq ## Generate helm chart documentation.
## Generate helm docs for all charts in the helm directory.
$(HELM_DOCS) --ignore-file=.helmdocsignore
.PHONY: generate-docs-embedmd
generate-docs-embedmd: embedmd ## Embed additional files into markdown docs.
grep -rl --include \*.md -e '\[embedmd\]' docs | xargs $(EMBEDMD) -w
.PHONY: init-external-attacher-submodule
init-external-attacher-submodule: ## Initialize external-attacher submodule if needed
## Initialize git repo as we don't copy .git into our docker build context.
@if ! git rev-parse --git-dir >/dev/null 2>&1; then \
echo "Not a functional git repo, initializing for submodule..."; \
git init; \
git config user.email "docker@build.local" && git config user.name "Docker Build"; \
git add .; \
git commit -m "Initial commit for submodule" &>/dev/null || true; \
git submodule update --init --recursive 2>/dev/null || echo "Submodule initialization skipped"; \
else \
echo "Git repo present, updating submodules..."; \
git submodule update --init --recursive; \
fi
.PHONY: generate-client-for-storage-nvidia-external-attacher
generate-client-for-storage-nvidia-external-attacher: init-external-attacher-submodule client-gen lister-gen informer-gen deepcopy-gen # Generate client/lister/informer for sv-volumeattachment
rm -rf $(NVIDIA_EXTERNAL_ATTACHER_DIR)/api/storage/v1alpha1/zz_generated.deepcopy.go
rm -rf $(NVIDIA_EXTERNAL_ATTACHER_DIR)/client
$(DEEPCOPY_GEN) --go-header-file hack/boilerplate.go.txt \
--output-file zz_generated.deepcopy.go \
github.com/nvidia/doca-platform/third_party/forked/nvidia-external-attacher/api/storage/v1alpha1
$(CLIENT_GEN) --clientset-name versioned \
--input-base $(PROJECT_DIR) --input third_party/forked/nvidia-external-attacher/api/storage/v1alpha1 \
--output-dir $(NVIDIA_EXTERNAL_ATTACHER_DIR)/client/clientset \
--output-pkg github.com/nvidia/doca-platform/third_party/forked/nvidia-external-attacher/client/clientset \
--go-header-file hack/boilerplate.go.txt
$(LISTER_GEN) $(PROJECT_DIR)/third_party/forked/nvidia-external-attacher/api/storage/v1alpha1 \
--output-dir $(NVIDIA_EXTERNAL_ATTACHER_DIR)/client/listers \
--output-pkg github.com/nvidia/doca-platform/third_party/forked/nvidia-external-attacher/client/listers \
--go-header-file hack/boilerplate.go.txt
$(INFORMER_GEN) $(PROJECT_DIR)/third_party/forked/nvidia-external-attacher/api/storage/v1alpha1 \
--versioned-clientset-package github.com/nvidia/doca-platform/third_party/forked/nvidia-external-attacher/client/clientset/versioned \
--listers-package github.com/nvidia/doca-platform/third_party/forked/nvidia-external-attacher/client/listers \
--output-dir $(NVIDIA_EXTERNAL_ATTACHER_DIR)/client/informers \
--output-pkg github.com/nvidia/doca-platform/third_party/forked/nvidia-external-attacher/client/informers \
--go-header-file hack/boilerplate.go.txt
.PHONY: verify-shfmt
verify-shfmt: $(SHFMT) ## Check shell scripts are formatted
@find . -name '*.sh' \
-not -path './hack/repos/*' \
-not -path './third_party/*' \
-not -path './.gocache/*' \
-exec $(SHFMT) -l -bn -sr {} + | \
{ \
files=$$(cat); \
[ -z "$$files" ] && echo "All shell scripts are properly formatted" && exit 0; \
echo "ERROR: The following shell scripts require formatting:"; \
echo "$$files"; \
echo "$$files" | xargs -n1 $(SHFMT) -w -bn -sr; \
echo "Files have been formatted. Please commit the changes."; \
exit 1; \
}
##@ Testing
TESTPKGS ?= $$(go list ./... | grep -v /e2e | grep -v /third_party) ./test/e2e/cleanup/...
COVERPKGS ?= $$(go list ./... | grep -v /e2e | grep -v /third_party | tr '\n' ',')
.PHONY: test
test: envtest ## Run tests.
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(TOOLSDIR) -p path)" go test $(TESTPKGS) $(GO_TEST_ARGS)
.PHONY: test-report
test-report: envtest gotestsum ## Run tests and generate a junit style report
set +o errexit; GOTOOLCHAIN=$(shell go version | awk '{print $$3}')+auto KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(TOOLSDIR) -p path)" go test -count 1 -race -json $(TESTPKGS) -coverprofile cover.out -coverpkg=$(COVERPKGS) > junit.stdout; echo $$? > junit.exitcode;
$(GOTESTSUM) --junitfile junit.xml --raw-command cat junit.stdout
exit $$(cat junit.exitcode)
.PHONY: test-release-e2e-quick
test-release-e2e-quick: # Build images required for the quick DPF e2e test.
$(MAKE) docker-build-dpf-system-for-$(ARCH) docker-push-dpf-system-for-$(ARCH)
$(MAKE) docker-build-dummydpuservice docker-push-dummydpuservice
$(MAKE) docker-build-mock-dms docker-push-mock-dms
# Build and push all the helm charts
$(MAKE) helm-package-all helm-push-all
$(MAKE) helm-package-dummydpuservice helm-push-dummydpuservice
.PHONY: test-release-e2e-slow
test-release-e2e-slow: release # Build images required for the slow DPF e2e tests.
$(MAKE) docker-build-dummydpuservice \
docker-build-netutils \
helm-package-dummydpuservice
# Push operations should wait for builds to complete
$(MAKE) docker-push-dummydpuservice \
docker-push-netutils \
helm-push-dummydpuservice
TEST_CLUSTER_NAME := dpf-test
ADD_CONTROL_PLANE_TAINTS ?= true
.PHONY: test-env-e2e
test-env-e2e: kind helm ## Setup a Kind Kubernetes environment to run tests.
# Create a kind cluster to host the test.
CLUSTER_NAME=$(TEST_CLUSTER_NAME) KIND_BIN=$(KIND) ADD_CONTROL_PLANE_TAINTS=$(ADD_CONTROL_PLANE_TAINTS) $(CURDIR)/hack/scripts/kind-install.sh
$(KUBECTL) get namespace dpf-operator-system || $(KUBECTL) create namespace dpf-operator-system
# Create secrets required for using artefacts if required.
$(CURDIR)/hack/scripts/create-artefact-secrets.sh
.PHONY: clean-test-env
clean-test-env: kind ## Clean Kind test environment (delete Kind cluster)
$(KIND) delete cluster --name $(TEST_CLUSTER_NAME)
OPERATOR_NAMESPACE ?= dpf-operator-system
HELMFILE_ENV ?=
.PHONY: test-deploy-operator-helm
test-deploy-operator-helm: helm helm-package-operator ## Deploy the DPF Operator using helm
# Deploy the DPF Operator prerequisites.
$(MAKE) HELMFILE_FILE=$(CURDIR)/deploy/helmfiles/prereqs.yaml test-deploy-helmfile
# Deploy the DPF Operator.
$(HELM) upgrade --install --create-namespace --namespace $(OPERATOR_NAMESPACE) \
--set controllerManager.image.repository=$(DPF_SYSTEM_IMAGE)\
--set controllerManager.image.tag=$(TAG) \
--set imagePullSecrets[0].name=dpf-pull-secret \
dpf-operator $(OPERATOR_HELM_CHART)
# Deploy monitoring tools.
$(MAKE) test-deploy-helmfile \
HELMFILE_FILE=$(CURDIR)/deploy/helmfiles/monitoring.yaml \
HELMFILE_ENV=
.PHONY: test-deploy-mock-dms
test-deploy-mock-dms: helm # Deploy mock-dms to the kind test cluster.
## Add the test cluster node IPs to the cert generated for mock-dms.
$(HELM) upgrade --install --create-namespace --namespace $(OPERATOR_NAMESPACE) \
--set controllerManager.manager.image.repository=$(MOCK_DMS_IMAGE)\
--set controllerManager.manager.image.tag=$(TAG) \
--set imagePullSecrets[0].name=dpf-pull-secret \
--set certIPAddresses=[$(shell kubectl get nodes $(TEST_CLUSTER_NAME)-control-plane -o yaml | $(YQ) .status.addresses | $(YQ) 'filter(.type == "InternalIP")' | $(YQ) .0.address)]\
mock-dms $(MOCK_DMS_HELM_CHART)
HELMFILE_FILE ?= $(CURDIR)/deploy/helmfiles/prereqs.yaml
HELMFILE_SELECTOR ?=
.PHONY: test-deploy-helmfile
test-deploy-helmfile: helmfile helm helm-diff helm-git ## Deploy helm dependencies from local helmfile
@$(CURDIR)/hack/scripts/deploy-helmfile.sh \
--file "$(HELMFILE_FILE)" \
--helmfile-bin "$(HELMFILE)" \
$(if $(strip $(HELMFILE_ENV)),--environment "$(HELMFILE_ENV)") \
$(if $(strip $(HELMFILE_SELECTOR)),--selector "$(HELMFILE_SELECTOR)") \
--helm-bin "$(HELM)"
ARTIFACTS_DIR ?= $(CURDIR)/artifacts
$(ARTIFACTS_DIR):
@mkdir -p $(ARTIFACTS_DIR)
E2E_TEST_DEFAULTS ?= -v -ginkgo.v -ginkgo.fail-fast -ginkgo.timeout=2h
E2E_TEST_ARGS ?= -ginkgo.label-filter="DPFSystem && !SDN && !DPFVPCOVN" -e2e.config=./config-quick.yaml
# Utilize Kind or modify the e2e tests to load the image locally, enabling compatibility with other vendors.
.PHONY: test-e2e ## Run the e2e tests against a Kind k8s instance that is spun up.
test-e2e: stern ## Run e2e tests
STERN=$(STERN) $(CURDIR)/hack/scripts/log-collector.sh \
go test -timeout 0 ./test/e2e/ $(E2E_TEST_DEFAULTS) $(E2E_TEST_ARGS)
##@ validate commit
.PHONY: commit-check
commit-check: conform ## Run conform to validate commit message
$(CONFORM) enforce
##@ lint and verify
GOLANGCI_LINT_GOGC ?= "100"
.PHONY: lint
lint: golangci-lint ## Run golangci-lint linter & yamllint
GOOS=linux GOGC=$(GOLANGCI_LINT_GOGC) $(GOLANGCI_LINT) run --timeout 5m
.PHONY: lint-fix
lint-fix: golangci-lint ## Run golangci-lint linter and perform fixes
GOOS=linux $(GOLANGCI_LINT) run --fix
VERIFY_TARGETS ?= generate copyright md-links shfmt crdify manifests-all
.PHONY: verify
verify: $(addprefix verify-,$(VERIFY_TARGETS)) ## Run all verify-* targets
.PHONY: verify-generate
verify-generate: generate ## Verify auto-generated code did not change
$(info checking for git diff after running 'make generate')
# Use intent-to-add to check for untracked files after generation.
git add -N .
$Q git diff --quiet ; if [ $$? -eq 1 ] ; then echo "Please, commit manifests after running 'make generate'"; exit 1 ; fi
.PHONY: verify-copyright
verify-copyright: ## Verify copyrights for project files
$Q $(CURDIR)/hack/scripts/copyright-validation.sh
# Setting this variable to true, turns the very-md-links command into noop
IGNORE_VERIFY_MD_LINKS ?= false
.PHONY: verify-md-links
verify-md-links: $(LYCHEE) ## Check links in markdown docs are working
@if [ "$$IGNORE_VERIFY_MD_LINKS" == true ]; then \
echo "Ignoring verify-md-links since IGNORE_VERIFY_MD_LINKS is set to true"; \
exit 0; \
fi; \
$(LYCHEE) --accept 200,429 . *.md --exclude-path third_party --exclude-path ./deploy --exclude-path docs/do_not_publish # Exclude the external `third_party` docs and the generated `charts` docs.
export CRDIFY_BASE_REF ?= $(LATEST_STABLE_TAG)
export CRDIFY_COMPARE_REF ?= HEAD
export CRDIFY_CONFIG ?= $(PROJECT_DIR)/crdify.yaml
export CRDIFY_CRD_DIR = $(patsubst $(PROJECT_DIR)/%,%,$(CRDDIR))
.PHONY: verify-crdify
verify-crdify: binary-dpfdev ## Verify that the CRDs are valid
hack/scripts/crd-validation.sh
ARTIFACTS_RENDERED_MANIFESTS_DIR ?= $(ARTIFACTS_DIR)/rendered-manifests
$(ARTIFACTS_RENDERED_MANIFESTS_DIR): $(ARTIFACTS_DIR)
@mkdir -p $(ARTIFACTS_RENDERED_MANIFESTS_DIR)
# Not yet enabled charts: dpu-networking ovn-kubernetes ovn-kubernetes-resource-injector
VERIFY_MANIFEST_TARGETS ?= operator kamaji-keepalived vpc-ovn-host vpc-ovn-dpu vpc-ovs-flow-controllers vpc-ovs-dhcp-agent storage-host-snap-csi-plugin storage-host-snap-host-controller storage-dpu-snap-node-driver storage-dpu-block-storage-vendor-dpu-plugin storage-dpu-fs-storage-vendor-dpu-plugin storage-dpu-nfs-storage-vendor-dpu-plugin storage-dpu-doca-snap
verify-manifests-all: $(addprefix verify-manifest-,$(VERIFY_MANIFEST_TARGETS)) verify-manifests-dpu-networking-all verify-manifests-operator-embedded-all ## Run all verify-manifest-* targets
# Note: This simulates setting the correct digest for the image by using the @sha256:X syntax which is requirement to comply with CKV_K8S_15 and CKV_K8S_43.
.PHONY: verify-manifest-operator
verify-manifest-operator: helm-package-operator helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for dpf-operator
$Q $(HELM) template dpf-operator $(CHARTSDIR)/dpf-operator-$(TAG).tgz -n dpf-operator \
--set controllerManager.image.tag=$(TAG)@sha256:A \
--set controllerManager.resources.limits.cpu=200m \
--set controllerManager.resources.limits.memory=256Mi \
--set kamajiEtcdDefrag.resources.limits.cpu=200m \
--set kamajiEtcdDefrag.resources.limits.memory=256Mi \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpf-operator-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpf-operator-$(TAG).yaml" \
MANIFEST_NAME="dpf-operator" \
hack/scripts/validate-manifest-checkov.sh
VERIFY_DPU_NETWORKING_MANIFESTS ?= flannel multus sriov-device-plugin nvidia-k8s-ipam ovs-cni servicechainset-controller sfc-controller cni-installer node-problem-detector kube-state-metrics opentelemetry-collector
verify-manifests-dpu-networking-all: $(addprefix verify-manifest-dpu-networking-,$(VERIFY_DPU_NETWORKING_MANIFESTS)) ## Run manifest verification for manifests embedded into dpf-operator
.PHONY: verify-manifest-dpu-networking-flannel
verify-manifest-dpu-networking-flannel: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking flannel subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set flannel.enabled=true \
--set flannel.flannel.resources.limits.cpu=1m \
--set flannel.flannel.resources.limits.memory=1Mi \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-flannel-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-flannel-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-flannel" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-multus
verify-manifest-dpu-networking-multus: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking multus subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set multus.enabled=true \
--set multus.kubeMultusDs.installMultusBinary.resources.limits.cpu=10m \
--set multus.kubeMultusDs.installMultusBinary.resources.limits.memory=15Mi \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-multus-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-multus-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-multus" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-sriov-device-plugin
verify-manifest-dpu-networking-sriov-device-plugin: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking sriov-device-plugin subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set sriov-device-plugin.enabled=true \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-sriov-device-plugin-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-sriov-device-plugin-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-sriov-device-plugin" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-nvidia-k8s-ipam
verify-manifest-dpu-networking-nvidia-k8s-ipam: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking nvidia-k8s-ipam subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set nvidia-k8s-ipam.enabled=true \
--set nvidia-k8s-ipam.nvIpam.controller.resources.limits.cpu=1m \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-nvidia-k8s-ipam-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-nvidia-k8s-ipam-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-nvidia-k8s-ipam" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-ovs-cni
verify-manifest-dpu-networking-ovs-cni: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking ovs-cni subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set ovs-cni.enabled=true \
--set ovs-cni.arm64.ovsCniMarker.resources.limits.cpu=1m \
--set ovs-cni.arm64.ovsCniMarker.resources.limits.memory=1Mi \
--set ovs-cni.arm64.ovsCniPlugin.resources.limits.cpu=1m \
--set ovs-cni.arm64.ovsCniPlugin.resources.limits.memory=1Mi \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-ovs-cni-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-ovs-cni-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-ovs-cni" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-servicechainset-controller
verify-manifest-dpu-networking-servicechainset-controller: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking servicechainset-controller subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set servicechainset-controller.enabled=true \
--set servicechainset-controller.deployDPUManifests=true \
--set servicechainset-controller.deployHostManifests=true \
--set servicechainset-controller.controllerManager.manager.image.tag=$(TAG)@sha256:A \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-servicechainset-controller-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-servicechainset-controller-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-servicechainset-controller" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-sfc-controller
verify-manifest-dpu-networking-sfc-controller: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking sfc-controller subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set sfc-controller.enabled=true \
--set sfc-controller.controllerManager.manager.resources.limits.cpu=1m \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-sfc-controller-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-sfc-controller-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-sfc-controller" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-cni-installer
verify-manifest-dpu-networking-cni-installer: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking cni-installer subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set cni-installer.enabled=true \
--set cni-installer.cniInstaller.resources.limits.cpu=1m \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-cni-installer-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-cni-installer-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-cni-installer" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-node-problem-detector
verify-manifest-dpu-networking-node-problem-detector: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking node-problem-detector subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set node-problem-detector.enabled=true \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-node-problem-detector-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-node-problem-detector-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-node-problem-detector" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-kube-state-metrics
verify-manifest-dpu-networking-kube-state-metrics: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking kube-state-metrics subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set kube-state-metrics.enabled=true \
--set kube-state-metrics.deployDPUManifests=true \
--set kube-state-metrics.deployHostManifests=true \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-kube-state-metrics-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-kube-state-metrics-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-kube-state-metrics" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-opentelemetry-collector
verify-manifest-dpu-networking-opentelemetry-collector: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking opentelemetry-collector subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set opentelemetry-collector.enabled=true \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-opentelemetry-collector-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-opentelemetry-collector-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-opentelemetry-collector" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-vpc-ovn-host
verify-manifest-vpc-ovn-host: $(VPC_DIR) helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the vpc-ovn chart's controller
$Q @cd $(VPC_DIR); $(MAKE) helm-package-all-vpc-ovn
$Q $(HELM) template $(CHARTSDIR)/dpf-vpc-ovn-$(TAG).tgz \
--set host.vpcOVNController.enabled=true \
--set host.vpcOVNController.resources.limits.cpu=1m \
--set host.vpcOVNController.resources.limits.memory=1Mi \
--set host.vpcOVNController.image.tag=c@sha256:d \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/vpc-ovn-host-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/vpc-ovn-host-$(TAG).yaml" \
MANIFEST_NAME="vpc-ovn-host" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-vpc-ovn-dpu
verify-manifest-vpc-ovn-dpu: $(VPC_DIR) helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the vpc-ovn chart's node
$Q @cd $(VPC_DIR); $(MAKE) helm-package-all-vpc-ovn
$Q $(HELM) template $(CHARTSDIR)/dpf-vpc-ovn-$(TAG).tgz \
--set dpu.vpcOVNNode.enabled=true \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set dpu.vpcOVNNode.initContainers.allocator.resources.limits.cpu=1m \
--set dpu.vpcOVNNode.initContainers.allocator.resources.limits.memory=1Mi \
--set dpu.vpcOVNNode.initContainers.vpcOVNDpuProvisioner.resources.limits.cpu=1m \
--set dpu.vpcOVNNode.initContainers.vpcOVNDpuProvisioner.resources.limits.memory=1Mi \
--set dpu.vpcOVNNode.containers.dhcpCNIDaemon.resources.limits.cpu=1m \
--set dpu.vpcOVNNode.containers.dhcpCNIDaemon.resources.limits.memory=1Mi \
--set dpu.vpcOVNNode.initContainers.allocator.image.tag=c@sha256:d \
--set dpu.vpcOVNNode.initContainers.vpcOVNDpuProvisioner.image.tag=c@sha256:d \
--set dpu.vpcOVNNode.containers.vpcOVNNodeController.image.tag=c@sha256:d \
--set dpu.vpcOVNNode.containers.dhcpCNIDaemon.image.tag=c@sha256:d \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/vpc-ovn-dpu-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/vpc-ovn-dpu-$(TAG).yaml" \
MANIFEST_NAME="vpc-ovn-dpu" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-vpc-ovs-flow-controllers
verify-manifest-vpc-ovs-flow-controllers: $(VPC_DIR) helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the vpc-ovs chart's flow controllers
$Q @cd $(VPC_DIR); $(MAKE) helm-package-all-vpc-ovs
$Q $(HELM) template $(CHARTSDIR)/dpf-vpc-ovs-$(TAG).tgz \
--set vpcOVSFlowController.enabled=true \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set vpcOVSFlowController.containers.vpcOVSFlowController.image.tag=c@sha256:d \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/vpc-ovs-flow-controllers-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/vpc-ovs-flow-controllers-$(TAG).yaml" \
MANIFEST_NAME="vpc-ovs-flow-controllers" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-vpc-ovs-dhcp-agent
verify-manifest-vpc-ovs-dhcp-agent: $(VPC_DIR) helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the vpc-ovs chart's dhcp agent
$Q @cd $(VPC_DIR); $(MAKE) helm-package-all-vpc-ovs
$Q $(HELM) template $(CHARTSDIR)/dpf-vpc-ovs-$(TAG).tgz \
--set vpcOVSDHCPAgent.enabled=true \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set vpcOVSDHCPAgent.containers.vpcOVSDHCPAgent.image.tag=c@sha256:d \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/vpc-ovs-dhcp-agent-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/vpc-ovs-dhcp-agent-$(TAG).yaml" \
MANIFEST_NAME="vpc-ovs-dhcp-agent" \
hack/scripts/validate-manifest-checkov.sh
# Note: The sed strip Go template variables from the embedded controller manifest to allow Checkov scanning.
# If this gets too complex we should do a go templating approach.
.PHONY: verify-manifest-kamaji-keepalived
verify-manifest-kamaji-keepalived: $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for kamaji-keepalived
$Q sed -E -e 's/\{\{\.[^}]+\}\}/placeholder/g' -e '/\{\{[^}]+\}\}/d' \
internal/clustermanager/kamaji/manifests/keepalived.yaml > $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/kamaji-keepalived.yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/kamaji-keepalived.yaml" \
MANIFEST_NAME="kamaji-keepalived" \
hack/scripts/validate-manifest-checkov.sh
VERIFY_OPERATOR_EMBEDDED_MANIFESTS ?= cni-installer dpu-detector dpuservice-controller flannel kamaji-cluster-manager multus nv-k8s-ipam ovs-cni provisioning-controller servicefunctionchainset-controller sfc-controller sriov-device-plugin static-cluster-manager
verify-manifests-operator-embedded-all: $(addprefix verify-manifest-operator-embedded-,$(VERIFY_OPERATOR_EMBEDDED_MANIFESTS)) ## Run manifest verification for manifests embedded into dpf-operator
.PHONY: verify-manifest-operator-embedded-%
verify-manifest-operator-embedded-%: helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev
$Q RENDERED_MANIFEST="$(PROJECT_DIR)/internal/operator/inventory/manifests/$*.yaml" \
MANIFEST_NAME="$*" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-storage-host-snap-csi-plugin
verify-manifest-storage-host-snap-csi-plugin: helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the storage chart's host snap-csi-plugin component
$Q $(HELM) template dpuservices/storage/chart \
--set host.snapCsiPlugin.enabled=true \
--set host.snapCsiPlugin.controller.plugin.resources.limits.cpu=1m \
--set host.snapCsiPlugin.controller.plugin.resources.limits.memory=1Mi \
--set host.snapCsiPlugin.controller.externalProvisioner.resources.limits.cpu=1m \
--set host.snapCsiPlugin.controller.externalProvisioner.resources.limits.memory=1Mi \
--set host.snapCsiPlugin.controller.externalAttacher.resources.limits.cpu=1m \
--set host.snapCsiPlugin.controller.externalAttacher.resources.limits.memory=1Mi \
--set host.snapCsiPlugin.controller.livenessProbe.resources.limits.cpu=1m \
--set host.snapCsiPlugin.controller.livenessProbe.resources.limits.memory=1Mi \
--set host.snapCsiPlugin.node.plugin.resources.limits.cpu=1m \
--set host.snapCsiPlugin.node.plugin.resources.limits.memory=1Mi \
--set host.snapCsiPlugin.node.livenessProbe.resources.limits.cpu=1m \
--set host.snapCsiPlugin.node.livenessProbe.resources.limits.memory=1Mi \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set host.snapCsiPlugin.controller.plugin.image.tag=c@sha256:d \
--set host.snapCsiPlugin.controller.externalProvisioner.image.tag=c@sha256:d \
--set host.snapCsiPlugin.controller.externalAttacher.image.tag=c@sha256:d \
--set host.snapCsiPlugin.controller.livenessProbe.image.tag=c@sha256:d \
--set host.snapCsiPlugin.node.plugin.image.tag=c@sha256:d \
--set host.snapCsiPlugin.node.livenessProbe.image.tag=c@sha256:d \
--set host.snapCsiPlugin.node.nodeDriverRegistrar.image.tag=c@sha256:d \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-host-snap-csi-plugin-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-host-snap-csi-plugin-$(TAG).yaml" \
MANIFEST_NAME="storage-host-snap-csi-plugin" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-storage-host-snap-host-controller
verify-manifest-storage-host-snap-host-controller: helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the storage chart's host snap-host-controller component
$Q $(HELM) template dpuservices/storage/chart \
--set host.snapHostController.enabled=true \
--set host.snapHostController.config.targetNamespace=storage-system \
--set host.snapHostController.resources.limits.cpu=1m \
--set host.snapHostController.resources.limits.memory=1Mi \
--set host.snapHostController.image.tag=c@sha256:d \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-host-snap-host-controller-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-host-snap-host-controller-$(TAG).yaml" \
MANIFEST_NAME="storage-host-snap-host-controller" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-storage-dpu-snap-node-driver
verify-manifest-storage-dpu-snap-node-driver: helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the storage chart's dpu snap-node-driver component
$Q $(HELM) template dpuservices/storage/chart \
--set dpu.snapNodeDriver.enabled=true \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set dpu.snapNodeDriver.image.tag=c@sha256:d \
--set dpu.snapNodeDriver.podSecurityContext.runAsNonRoot=false \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-snap-node-driver-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-snap-node-driver-$(TAG).yaml" \
MANIFEST_NAME="storage-dpu-snap-node-driver" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-storage-dpu-block-storage-vendor-dpu-plugin
verify-manifest-storage-dpu-block-storage-vendor-dpu-plugin: helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the storage chart's dpu block-storage-vendor-dpu-plugin component
$Q $(HELM) template dpuservices/storage/chart \
--set dpu.blockStorageVendorDpuPlugin.enabled=true \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set dpu.blockStorageVendorDpuPlugin.image.tag=c@sha256:d \
--set dpu.blockStorageVendorDpuPlugin.podSecurityContext.runAsNonRoot=false \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-block-storage-vendor-dpu-plugin-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-block-storage-vendor-dpu-plugin-$(TAG).yaml" \
MANIFEST_NAME="storage-dpu-block-storage-vendor-dpu-plugin" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-storage-dpu-fs-storage-vendor-dpu-plugin
verify-manifest-storage-dpu-fs-storage-vendor-dpu-plugin: helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the storage chart's dpu fs-storage-vendor-dpu-plugin component
$Q $(HELM) template dpuservices/storage/chart \
--set dpu.fsStorageVendorDpuPlugin.enabled=true \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set dpu.fsStorageVendorDpuPlugin.image.tag=c@sha256:d \
--set dpu.fsStorageVendorDpuPlugin.podSecurityContext.runAsNonRoot=false \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-fs-storage-vendor-dpu-plugin-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-fs-storage-vendor-dpu-plugin-$(TAG).yaml" \
MANIFEST_NAME="storage-dpu-fs-storage-vendor-dpu-plugin" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-storage-dpu-nfs-storage-vendor-dpu-plugin
verify-manifest-storage-dpu-nfs-storage-vendor-dpu-plugin: helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the storage chart's dpu nfs-storage-vendor-dpu-plugin component
$Q $(HELM) template dpuservices/storage/chart \
--set dpu.nfsStorageVendorDpuPlugin.enabled=true \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set dpu.nfsStorageVendorDpuPlugin.image.repository=a/b:c@sha256:d \
--set dpu.nfsStorageVendorDpuPlugin.podSecurityContext.runAsNonRoot=false \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-nfs-storage-vendor-dpu-plugin-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-nfs-storage-vendor-dpu-plugin-$(TAG).yaml" \
MANIFEST_NAME="storage-dpu-nfs-storage-vendor-dpu-plugin" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-storage-dpu-doca-snap
verify-manifest-storage-dpu-doca-snap: helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the storage chart's dpu doca-snap component
$Q $(HELM) template dpuservices/storage/chart \
--set dpu.docaSnap.enabled=true \
--set dpu.docaSnap.podSecurityContext.runAsNonRoot=false \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-doca-snap-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/storage-dpu-doca-snap-$(TAG).yaml" \
MANIFEST_NAME="storage-dpu-doca-snap" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-container-images
verify-container-images: generate-manifests-release-defaults $(TRIVY) ## Verify container images
$Q TRIVY=$(TRIVY) hack/scripts/verify-container-images.sh \
$(ALL_CONTAINER_IMAGES)
.PHONY: lint-helm
lint-helm: lint-helm-dpu-networking lint-helm-dummydpuservice lint-helm-storage