-
Notifications
You must be signed in to change notification settings - Fork 40
Expand file tree
/
Copy pathMakefile
More file actions
2138 lines (1848 loc) · 115 KB
/
Copy pathMakefile
File metadata and controls
2138 lines (1848 loc) · 115 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))
GO_VERSION ?= $(shell awk '/^toolchain /{print $$2}' go.mod | awk -F 'go' '{print $$2}')
GOTOOLCHAIN ?= go$(GO_VERSION)+auto
## 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
# 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
##@ 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
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.12
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-v26.1.0
# Kata Containers kata-deploy image, deployed as a dpu-networking subchart
export KATA_DEPLOY_IMAGE=quay.io/kata-containers/kata-deploy
export KATA_DEPLOY_TAG=3.32.0@sha256:47c4cf29c9e8cf9bb7debab58761b672e1d4c93ee5e92db7b442ee00e7d561cc
# VPC dependencies to be able to build/push images and charts
VPC_REF=e7ec7942c9271b5496c27fe0f57d6fc76385e900
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 generate-deprecation-warnings
.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/controllers/..." \
paths="./internal/provisioning/bfbregistry/..." \
paths="./internal/provisioning/webhooks/..." \
paths="./internal/provisioning/utils/..." \
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;
# Make the CRDs to only be deployed if the deployDPUManifests flag is set.
find config/dpuservice/crd/bases/ -type f -not -name '*_dpu*' -exec cp {} deploy/charts/dpu-networking/charts/servicechainset-controller/templates/crds/ \;
sed -i -e '1i{{- if .Values.deployDPUManifests }}' -e '$$a{{- end }}' deploy/charts/dpu-networking/charts/servicechainset-controller/templates/crds/*.yaml
# 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 -e '1i{{ if .Values.deployDPUManifests }}' -e '$$a{{- 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-hostagent 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 config/dpuservice/crd/bases/svc.dpu.nvidia.com_servicechains.yaml deploy/charts/dpu-networking/charts/sfc-controller/templates/crds/
cp config/dpuservice/crd/bases/svc.dpu.nvidia.com_serviceinterfaces.yaml deploy/charts/dpu-networking/charts/sfc-controller/templates/crds/
cp config/dpuservice/crd/bases/svc.dpu.nvidia.com_nodeserviceinterfaces.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/controllers/..." \
paths="./internal/provisioning/bfbregistry/..." \
paths="./internal/provisioning/webhooks/..." \
paths="./internal/provisioning/utils/..." \
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-hostagent
generate-manifests-hostagent: controller-gen ## Generate RBAC for the hostagent.
@rm -rf /tmp/hostagent-rbac && mkdir -p /tmp/hostagent-rbac
$(CONTROLLER_GEN) \
paths="./internal/provisioning/hostagent/..." \
rbac:roleName=hostagent-role \
output:rbac:dir=/tmp/hostagent-rbac
mv /tmp/hostagent-rbac/role.yaml ./config/provisioning/rbac/hostagent_role.yaml
.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
DEPRECATION_WARNINGS_DIR = deploy/charts/dpf-operator/templates/deprecation-warnings
.PHONY: generate-deprecation-warnings
generate-deprecation-warnings: binary-dpfdev ## Generate ValidatingAdmissionPolicy resources for deprecated CRD fields
rm -rf $(DEPRECATION_WARNINGS_DIR)
$(LOCALBIN)/dpfdev generate-deprecation-warnings \
--crd-dir deploy/charts/dpf-operator/templates/crds \
--output-dir $(DEPRECATION_WARNINGS_DIR)
.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.
## --chart-search-root uses the resolved path because PROJECT_DIR keeps the symlink (pwd -L).
$(HELM_DOCS) --chart-search-root=$(realpath $(PROJECT_DIR)) --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
@if ! git rev-parse --git-dir >/dev/null 2>&1; then \
echo "Not a functional git repo, initializing an empty git repo for the external-attacher submodule..."; \
git -C $(NVIDIA_EXTERNAL_ATTACHER_DIR)/external-attacher init; \
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' ',')
# Packages that contain build-tagged (`//go:build benchmark`) benchmark specs.
# Normalized to a leading ./ so `go test` treats them as directories, not import paths.
BENCHMARK_PKGS ?= $$(grep -rl 'go:build benchmark' --include='*_test.go' . | grep -v '/third_party/' | xargs -n1 dirname | sort -u | sed 's|^\./||;s|^|./|')
.PHONY: test
test: envtest test-benchmark ## Run tests (incl. benchmarks).
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(TOOLSDIR) -p path)" go test -timeout 0 $(TESTPKGS) $(GO_TEST_ARGS)
.PHONY: test-report
test-report: envtest gotestsum test-benchmark ## Run tests and generate a junit style report
set +o errexit; GOTOOLCHAIN=$(GOTOOLCHAIN) KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(TOOLSDIR) -p path)" go test -timeout 0 -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-benchmark
test-benchmark: envtest ## Run the build-tagged gmeasure benchmarks only
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(TOOLSDIR) -p path)" go test -timeout 0 -count 1 -tags benchmark $(BENCHMARK_PKGS) -args -ginkgo.focus='benchmarks' -ginkgo.v
.PHONY: test-release-e2e-quick
test-release-e2e-quick: # Build images required for the quick DPF e2e test.
# Only the local architecture is needed here, so override the image's
# architecture list to keep the build single-arch.
$(MAKE) docker-build-and-push-dpf-system DPF_SYSTEM_ARCH=$(ARCH)
$(MAKE) docker-build-and-push-dummydpuservice
$(MAKE) docker-build-and-push-mock-dms
$(MAKE) docker-build-and-push-bfb-registry DPF_SYSTEM_ARCH=$(ARCH)
$(MAKE) docker-build-and-push-keepalived DPF_SYSTEM_ARCH=$(ARCH)
# Build and push all the helm charts
$(MAKE) helm-package-all helm-push-all
$(MAKE) helm-package-dummydpuservice helm-push-dummydpuservice
.PHONY: test-helper-images
test-helper-images: # Build and push the e2e test-helper images and charts.
$(MAKE) docker-build-and-push-dummydpuservice \
docker-build-and-push-netutils \
docker-build-and-push-fake-fs-storage \
docker-build-and-push-rshim-console-collector \
docker-build-and-push-fake-block-storage \
helm-package-dummydpuservice
# The chart push has to wait for the packaging above to complete.
$(MAKE) helm-push-dummydpuservice
.PHONY: test-release-e2e-slow
test-release-e2e-slow: ## Build images required for the slow DPF e2e tests.
$(MAKE) release
# release already records scope=release artifacts; also record test helpers.
$(MAKE) RELEASE_MANIFEST_ENABLED=true test-helper-images
TEST_CLUSTER_NAME := dpf-test
ADD_CONTROL_PLANE_TAINTS ?= true
TEST_DEPLOY_PREREQS_NAMESPACE ?= dpf-operator-system
.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 ?=
NFD_WAIT ?= true
# Enable dependencies required by the default test-e2e label filter so the tests
# can be deployed and run directly through the documented Makefile workflow.
# HELMFILE_STATE_VALUES_SET remains a full override for other test configurations.
# The argo-cd and kamaji namespaces come from a state value instead of the release definition,
# so the sed below cannot move them. They are appended after any override to keep all
# prerequisites in TEST_DEPLOY_PREREQS_NAMESPACE.
TEST_DEPLOY_OPERATOR_HELMFILE_STATE_VALUES_SET = $(if $(HELMFILE_STATE_VALUES_SET),$(HELMFILE_STATE_VALUES_SET),openbao.enabled=true,external-secrets.enabled=true),namespaces.argoCD=$(TEST_DEPLOY_PREREQS_NAMESPACE),namespaces.kamaji=$(TEST_DEPLOY_PREREQS_NAMESPACE)
.PHONY: test-deploy-operator-helm
test-deploy-operator-helm: helm helm-package-operator ## Deploy the DPF Operator using helm
# Deploy the DPF Operator prerequisites.
sed "s/dpf-operator-system/$(TEST_DEPLOY_PREREQS_NAMESPACE)/g" $(CURDIR)/deploy/helmfiles/prereqs.yaml > $(CURDIR)/deploy/helmfiles/prereqs.yaml.tmp
ifeq ($(NFD_WAIT),false)
# When NFD_WAIT=false, deploy all prereqs except NFD first, then deploy NFD without waiting.
# This is needed when OVN Kubernetes is the CNI because NFD cannot become ready without a functioning CNI.
$(MAKE) HELMFILE_FILE=$(CURDIR)/deploy/helmfiles/prereqs.yaml.tmp HELMFILE_SELECTOR="app!=node-feature-discovery" HELMFILE_STATE_VALUES_SET="$(TEST_DEPLOY_OPERATOR_HELMFILE_STATE_VALUES_SET)" test-deploy-helmfile
$(MAKE) HELMFILE_FILE=$(CURDIR)/deploy/helmfiles/prereqs.yaml.tmp HELMFILE_WAIT=false HELMFILE_SELECTOR="app=node-feature-discovery" HELMFILE_STATE_VALUES_SET="$(TEST_DEPLOY_OPERATOR_HELMFILE_STATE_VALUES_SET)" test-deploy-helmfile
else
$(MAKE) HELMFILE_FILE=$(CURDIR)/deploy/helmfiles/prereqs.yaml.tmp HELMFILE_STATE_VALUES_SET="$(TEST_DEPLOY_OPERATOR_HELMFILE_STATE_VALUES_SET)" test-deploy-helmfile
endif
# 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 \
--set kamajiEtcdDefrag.namespaceOverride=$(TEST_DEPLOY_PREREQS_NAMESPACE) \
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 ?=
HELMFILE_STATE_VALUES_SET ?=
HELMFILE_COLLECT_RESOURCES_ON_FAIL ?= true
HELMFILE_CLEANUP_ON_FAIL ?= false
HELMFILE_WAIT ?= true
.PHONY: test-deploy-helmfile
test-deploy-helmfile: helmfile helm helm-diff helm-git yq binary-dpfdev ## Deploy helm dependencies from local helmfile
@DPFDEV_BIN=$(LOCALBIN)/dpfdev $(CURDIR)/hack/scripts/deploy-helmfile.sh \
--file "$(HELMFILE_FILE)" \
--wait "$(HELMFILE_WAIT)" \
--cleanup-on-fail "$(HELMFILE_CLEANUP_ON_FAIL)" \
--collect-resources-on-fail "$(HELMFILE_COLLECT_RESOURCES_ON_FAIL)" \
--helm-bin "$(HELM)" \
--helmfile-bin "$(HELMFILE)" \
$(if $(strip $(HELMFILE_ENV)),--environment "$(HELMFILE_ENV)") \
$(if $(strip $(HELMFILE_SELECTOR)),--selector "$(HELMFILE_SELECTOR)") \
$(if $(strip $(HELMFILE_STATE_VALUES_SET)),--state-values-set "$(HELMFILE_STATE_VALUES_SET)")
ARTIFACTS_DIR ?= $(CURDIR)/artifacts
RELEASE_MANIFEST ?= $(ARTIFACTS_DIR)/release-manifest.yaml
# Set to true by release (and test-helper push targets) to record each pushed image/chart in RELEASE_MANIFEST.
RELEASE_MANIFEST_ENABLED ?= false
$(ARTIFACTS_DIR):
@mkdir -p $(ARTIFACTS_DIR)
.PHONY: release-manifest-init
release-manifest-init: $(ARTIFACTS_DIR) ## Initialize the release manifest for the current build.
@echo "registry: $(REGISTRY)" > $(RELEASE_MANIFEST)
@echo "tag: $(TAG)" >> $(RELEASE_MANIFEST)
@echo "commit: $(FULL_COMMIT)" >> $(RELEASE_MANIFEST)
@echo "built_at: $$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> $(RELEASE_MANIFEST)
@echo "artifacts:" >> $(RELEASE_MANIFEST)
# Append one pushed artifact to RELEASE_MANIFEST when RELEASE_MANIFEST_ENABLED=true.
# Usage: $(call record_release_artifact,type,name,ref,scope)
define record_release_artifact
if [ "$(RELEASE_MANIFEST_ENABLED)" = "true" ]; then \
printf ' - type: %s\n name: %s\n ref: %s\n scope: %s\n' \
"$(1)" "$(2)" "$(3)" "$(4)" >> "$(RELEASE_MANIFEST)"; \
fi;
endef
# This is the default registry used for e2e tests, it can be overridden by setting the DOCKER_IO_REGISTRY environment variable.
# This is useful for testing with a local registry or a registry mirror.
export DOCKER_IO_REGISTRY ?= docker.io
E2E_TEST_DEFAULTS ?= -v -ginkgo.v -ginkgo.fail-fast -ginkgo.timeout=2h30m
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
PREREQS_NAMESPACE=$(TEST_DEPLOY_PREREQS_NAMESPACE) \
STERN=$(STERN) $(CURDIR)/hack/scripts/log-collector.sh \
go test -timeout 0 ./test/e2e/ $(E2E_TEST_DEFAULTS) $(E2E_TEST_ARGS)
.PHONY: generate-htmlreports
generate-htmlreports: binary-dpfdev ## Generate HTML artifact viewers for all resource dumps under ARTIFACTS_DIR
$(LOCALBIN)/dpfdev htmlreport "$(ARTIFACTS_DIR)"
##@ 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 kube-api-linter golangci-lint-custom ## Run golangci-lint, kube-api-linter and golangci-lint-custom
GOOS=linux GOTOOLCHAIN=$(GOTOOLCHAIN) GOGC=$(GOLANGCI_LINT_GOGC) $(GOLANGCI_LINT) run --timeout 5m $(GOLANGCI_LINT_EXTRA_ARGS)
GOOS=linux GOTOOLCHAIN=$(GOTOOLCHAIN) GOGC=$(GOLANGCI_LINT_GOGC) $(KUBE_API_LINTER) run --config $(PROJECT_DIR)/.golangci-kal.yml --timeout 5m $(GOLANGCI_LINT_EXTRA_ARGS)
GOOS=linux GOTOOLCHAIN=$(GOTOOLCHAIN) GOGC=$(GOLANGCI_LINT_GOGC) $(GOLANGCI_LINT_CUSTOM) run --config $(PROJECT_DIR)/.golangci-custom.yml --timeout 5m $(GOLANGCI_LINT_EXTRA_ARGS)
.PHONY: lint-fix
lint-fix: ## Run golangci-lint and kube-api-linter and perform fixes
GOLANGCI_LINT_EXTRA_ARGS=--fix $(MAKE) lint
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 --exclude '^https?://host(:|/|$$)' . *.md --exclude-path third_party --exclude-path ./deploy --exclude-path docs/do_not_publish # Exclude the external `third_party` docs, the generated `charts` docs and `host` placeholder URLs from the API 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 weave-flow-controllers weave-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
# Manifest verification runs checkov in a container, so it needs a working docker daemon.
# Setting this to false turns the verify-manifests-all command into a noop.
VERIFY_MANIFESTS ?= true
.PHONY: verify-manifests-all
verify-manifests-all: ## Run all verify-manifest-* targets
@if [ "$(VERIFY_MANIFESTS)" != true ]; then \
echo "Skipping verify-manifests-all since VERIFY_MANIFESTS is not set to true"; \
exit 0; \
fi; \
$(MAKE) $(addprefix verify-manifest-,$(VERIFY_MANIFEST_TARGETS)) verify-manifests-dpu-networking-all verify-manifests-operator-embedded-all
# 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 servicechainset-controller sfc-controller cni-installer node-problem-detector kube-state-metrics dpu-monitoring opentelemetry-collector kata-containers coredns spire-agent-rbac
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.deployDPUManifests=true \
--set nvidia-k8s-ipam.deployHostManifests=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-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-dpu-monitoring
verify-manifest-dpu-networking-dpu-monitoring: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking dpu-monitoring subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set dpu-monitoring.enabled=true \
--set dpu-monitoring.deployDPUManifests=true \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-dpu-monitoring-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-dpu-monitoring-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-dpu-monitoring" \
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-dpu-networking-kata-containers
verify-manifest-dpu-networking-kata-containers: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking kata-containers subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set kata-containers.enabled=true \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-kata-containers-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-kata-containers-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-kata-containers" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-dpu-networking-spire-agent-rbac
verify-manifest-dpu-networking-spire-agent-rbac: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking spire-agent-rbac subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set spire-agent-rbac.enabled=true \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-spire-agent-rbac-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-spire-agent-rbac-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-spire-agent-rbac" \
hack/scripts/validate-manifest-checkov.sh
# Note: The host and DPU manifests are rendered together, the DPU side is the RBAC the host side
# CoreDNS uses to read the DPU cluster. The service account name and the image digest are set here
# because the operator sets them when it renders the chart.
.PHONY: verify-manifest-dpu-networking-coredns
verify-manifest-dpu-networking-coredns: helm-package-dpu-networking helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the dpu-networking coredns subchart
$Q $(HELM) template $(CHARTSDIR)/$(DPU_NETWORKING_HELM_CHART_NAME)-$(DPU_NETWORKING_HELM_CHART_VER).tgz \
--set coredns.enabled=true \
--set coredns.deployDPUManifests=true \
--set coredns.deployHostManifests=true \
--set coredns.serviceAccount.name=coredns \
--set coredns.rbac.serviceAccounts[0].name=coredns \
--set coredns.rbac.serviceAccounts[0].namespace=dpf-operator-system \
--set coredns.image.tag=v1.12.1@sha256:A \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-coredns-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/dpu-networking-coredns-$(TAG).yaml" \
MANIFEST_NAME="dpu-networking-coredns" \
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-weave-flow-controllers
verify-manifest-weave-flow-controllers: $(VPC_DIR) helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the weave chart's flow controllers
$Q @cd $(VPC_DIR); $(MAKE) helm-package-all-weave
$Q $(HELM) template $(CHARTSDIR)/dpf-weave-$(TAG).tgz \
--set weaveFlowController.enabled=true \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set weaveFlowController.containers.weaveFlowController.image.tag=c@sha256:d \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/weave-flow-controllers-$(TAG).yaml
$Q RENDERED_MANIFEST="$(ARTIFACTS_RENDERED_MANIFESTS_DIR)/weave-flow-controllers-$(TAG).yaml" \
MANIFEST_NAME="weave-flow-controllers" \
hack/scripts/validate-manifest-checkov.sh
.PHONY: verify-manifest-weave-dhcp-agent
verify-manifest-weave-dhcp-agent: $(VPC_DIR) helm $(ARTIFACTS_RENDERED_MANIFESTS_DIR) binary-dpfdev ## Run manifest verification for the weave chart's dhcp agent
$Q @cd $(VPC_DIR); $(MAKE) helm-package-all-weave
$Q $(HELM) template $(CHARTSDIR)/dpf-weave-$(TAG).tgz \
--set weaveDHCPAgent.enabled=true \
--set serviceDaemonSet.resources.cpu=1m \
--set serviceDaemonSet.resources.memory=1Mi \
--set weaveDHCPAgent.containers.weaveDHCPAgent.image.tag=c@sha256:d \
> $(ARTIFACTS_RENDERED_MANIFESTS_DIR)/weave-dhcp-agent-$(TAG).yaml