forked from kubernetes-sigs/node-feature-discovery
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
256 lines (211 loc) · 8.76 KB
/
Makefile
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
.PHONY: all test templates yamls build build-%
.FORCE:
GO_CMD ?= go
GO_FMT ?= gofmt
IMAGE_BUILD_CMD ?= docker build
IMAGE_BUILD_EXTRA_OPTS ?=
IMAGE_PUSH_CMD ?= docker push
CONTAINER_RUN_CMD ?= docker run
BUILDER_IMAGE ?= golang:1.22-bookworm
BASE_IMAGE_FULL ?= debian:bookworm-slim
BASE_IMAGE_MINIMAL ?= scratch
# Docker base command for working with html documentation.
# Use host networking because 'jekyll serve' is stupid enough to use the
# same site url than the "host" it binds to. Thus, all the links will be
# broken if we'd bind to 0.0.0.0
RUBY_IMAGE_VERSION := 3.1
JEKYLL_ENV ?= development
SITE_BUILD_CMD := $(CONTAINER_RUN_CMD) --rm -i -u "`id -u`:`id -g`" \
$(shell [ -t 0 ] && echo '-t') \
-e JEKYLL_ENV=$(JEKYLL_ENV) \
--volume="$$PWD/docs:/work" \
--volume="$$PWD/docs/vendor/bundle:/usr/local/bundle" \
-w /work \
--network=host ruby:$(RUBY_IMAGE_VERSION)
SITE_BASEURL ?=
SITE_DESTDIR ?= _site
JEKYLL_OPTS := -d '$(SITE_DESTDIR)' $(if $(SITE_BASEURL),-b '$(SITE_BASEURL)',)
VERSION := $(shell git describe --tags --dirty --always)
IMAGE_REGISTRY ?= registry.k8s.io/nfd
IMAGE_TAG_NAME ?= $(VERSION)
IMAGE_EXTRA_TAG_NAMES ?=
IMAGE_NAME := node-feature-discovery
IMAGE_REPO := $(IMAGE_REGISTRY)/$(IMAGE_NAME)
IMAGE_TAG := $(IMAGE_REPO):$(IMAGE_TAG_NAME)
IMAGE_EXTRA_TAGS := $(foreach tag,$(IMAGE_EXTRA_TAG_NAMES),$(IMAGE_REPO):$(tag))
K8S_NAMESPACE ?= node-feature-discovery
OPENSHIFT ?=
# We use different mount prefix for local and container builds.
# Take CONTAINER_HOSTMOUNT_PREFIX from HOSTMOUNT_PREFIX if only the latter is specified
ifdef HOSTMOUNT_PREFIX
CONTAINER_HOSTMOUNT_PREFIX := $(HOSTMOUNT_PREFIX)
else
CONTAINER_HOSTMOUNT_PREFIX := /host-
endif
HOSTMOUNT_PREFIX ?= /
KUBECONFIG ?= ${HOME}/.kube/config
E2E_TEST_CONFIG ?=
E2E_PULL_IF_NOT_PRESENT ?= false
E2E_TEST_FULL_IMAGE ?= false
E2E_GINKGO_LABEL_FILTER ?=
BUILD_FLAGS = -tags osusergo,netgo \
-ldflags "-s -w -extldflags=-static -X sigs.k8s.io/node-feature-discovery/pkg/version.version=$(VERSION) -X sigs.k8s.io/node-feature-discovery/pkg/utils/hostpath.pathPrefix=$(HOSTMOUNT_PREFIX)"
# multi-arch build with buildx
IMAGE_ALL_PLATFORMS ?= linux/amd64,linux/arm64
# enable buildx
ensure-buildx:
./hack/init-buildx.sh
IMAGE_BUILDX_CMD ?= DOCKER_CLI_EXPERIMENTAL=enabled docker buildx build --platform=${IMAGE_ALL_PLATFORMS} --progress=auto --pull
IMAGE_BUILD_ARGS = --build-arg VERSION=$(VERSION) \
--build-arg HOSTMOUNT_PREFIX=$(CONTAINER_HOSTMOUNT_PREFIX) \
--build-arg BUILDER_IMAGE=$(BUILDER_IMAGE) \
--build-arg BASE_IMAGE_FULL=$(BASE_IMAGE_FULL) \
--build-arg BASE_IMAGE_MINIMAL=$(BASE_IMAGE_MINIMAL)
IMAGE_BUILD_ARGS_FULL = --target full \
-t $(IMAGE_TAG)-full \
$(foreach tag,$(IMAGE_EXTRA_TAGS),-t $(tag)-full) \
$(IMAGE_BUILD_EXTRA_OPTS) ./
IMAGE_BUILD_ARGS_MINIMAL = --target minimal \
-t $(IMAGE_TAG) \
-t $(IMAGE_TAG)-minimal \
$(foreach tag,$(IMAGE_EXTRA_TAGS),-t $(tag) -t $(tag)-minimal) \
$(IMAGE_BUILD_EXTRA_OPTS) ./
all: image
BUILD_BINARIES := nfd-master nfd-worker nfd-topology-updater nfd-gc kubectl-nfd
build-%:
$(GO_CMD) build -v -o bin/ $(BUILD_FLAGS) ./cmd/$*
build: $(foreach bin, $(BUILD_BINARIES), build-$(bin))
install-%:
$(GO_CMD) install -v $(BUILD_FLAGS) ./cmd/$*
install: $(foreach bin, $(BUILD_BINARIES), install-$(bin))
image: yamls
$(IMAGE_BUILD_CMD) $(IMAGE_BUILD_ARGS) $(IMAGE_BUILD_ARGS_FULL)
$(IMAGE_BUILD_CMD) $(IMAGE_BUILD_ARGS) $(IMAGE_BUILD_ARGS_MINIMAL)
image-all: ensure-buildx yamls
# --load : not implemented yet, see: https://github.com/docker/buildx/issues/59
$(IMAGE_BUILDX_CMD) $(IMAGE_BUILD_ARGS) $(IMAGE_BUILD_ARGS_FULL)
$(IMAGE_BUILDX_CMD) $(IMAGE_BUILD_ARGS) $(IMAGE_BUILD_ARGS_MINIMAL)
# clean NFD labels on all nodes
# devel only
deploy-prune:
kubectl apply -k deployment/overlays/prune/
kubectl wait --for=condition=complete job -l app=nfd -n node-feature-discovery
kubectl delete -k deployment/overlays/prune/
yamls:
@./hack/kustomize.sh $(K8S_NAMESPACE) $(IMAGE_REPO) $(IMAGE_TAG_NAME)
deploy: yamls
kubectl apply -k .
templates:
@# Need to prepend each line in the sample config with spaces in order to
@# fit correctly in the configmap spec.
@sed s'/^/ /' deployment/components/worker-config/nfd-worker.conf.example > nfd-worker.conf.tmp
@sed s'/^/ /' deployment/components/master-config/nfd-master.conf.example > nfd-master.conf.tmp
@sed s'/^/ /' deployment/components/topology-updater-config/nfd-topology-updater.conf.example > nfd-topology-updater.conf.tmp
@# The sed magic below replaces the block of text between the lines with start and end markers
@start=NFD-MASTER-CONF-START-DO-NOT-REMOVE; \
end=NFD-MASTER-CONF-END-DO-NOT-REMOVE; \
sed -e "/$$start/,/$$end/{ /$$start/{ p; r nfd-master.conf.tmp" \
-e "}; /$$end/p; d }" -i deployment/helm/node-feature-discovery/values.yaml
@start=NFD-WORKER-CONF-START-DO-NOT-REMOVE; \
end=NFD-WORKER-CONF-END-DO-NOT-REMOVE; \
sed -e "/$$start/,/$$end/{ /$$start/{ p; r nfd-worker.conf.tmp" \
-e "}; /$$end/p; d }" -i deployment/helm/node-feature-discovery/values.yaml
@start=NFD-TOPOLOGY-UPDATER-CONF-START-DO-NOT-REMOVE; \
end=NFD-TOPOLOGY-UPDATER-CONF-END-DO-NOT-REMOVE; \
sed -e "/$$start/,/$$end/{ /$$start/{ p; r nfd-topology-updater.conf.tmp" \
-e "}; /$$end/p; d }" -i deployment/helm/node-feature-discovery/values.yaml
@rm nfd-master.conf.tmp
@rm nfd-worker.conf.tmp
@rm nfd-topology-updater.conf.tmp
.generator.image.stamp: Dockerfile_generator
$(IMAGE_BUILD_CMD) \
--build-arg BUILDER_IMAGE=$(BUILDER_IMAGE) \
-t nfd-generator \
-f Dockerfile_generator .
generate: .generator.image.stamp
$(CONTAINER_RUN_CMD) --rm \
-v "`pwd`:/go/node-feature-discovery" \
-v "`go env GOCACHE`:/.cache" \
-v "`go env GOMODCACHE`:/go/pkg/mod" \
--user=`id -u`:`id -g`\
nfd-generator \
./hack/update_codegen.sh
gofmt:
@$(GO_FMT) -w -l $$(find . -name '*.go')
gofmt-verify:
@out=`$(GO_FMT) -w -l -d $$(find . -name '*.go')`; \
if [ -n "$$out" ]; then \
echo "$$out"; \
exit 1; \
fi
ci-lint:
golangci-lint run --timeout 10m
lint:
golint -set_exit_status ./...
mdlint:
${CONTAINER_RUN_CMD} \
--rm \
--volume "${PWD}:/workdir:ro,z" \
--workdir /workdir \
ruby:slim \
/workdir/scripts/test-infra/mdlint.sh
helm-lint:
helm lint --strict deployment/helm/node-feature-discovery/
test:
$(GO_CMD) test -covermode=atomic -coverprofile=coverage.out ./cmd/... ./pkg/... ./source/...
e2e-test:
@if [ -z ${KUBECONFIG} ]; then echo "[ERR] KUBECONFIG missing, must be defined"; exit 1; fi
$(GO_CMD) test -timeout=1h -v ./test/e2e/ -args \
-nfd.repo=$(IMAGE_REPO) -nfd.tag=$(IMAGE_TAG_NAME) \
-kubeconfig=$(KUBECONFIG) \
-nfd.e2e-config=$(E2E_TEST_CONFIG) \
-nfd.pull-if-not-present=$(E2E_PULL_IF_NOT_PRESENT) \
-ginkgo.focus="\[k8s-sigs\/node-feature-discovery\]" \
-ginkgo.label-filter=$(E2E_GINKGO_LABEL_FILTER) \
-ginkgo.v \
$(if $(OPENSHIFT),-nfd.openshift,)
if [ "$(E2E_TEST_FULL_IMAGE)" = "true" ]; then \
$(GO_CMD) test -timeout=1h -v ./test/e2e/ -args \
-nfd.repo=$(IMAGE_REPO) -nfd.tag=$(IMAGE_TAG_NAME)-full \
-kubeconfig=$(KUBECONFIG) \
-nfd.e2e-config=$(E2E_TEST_CONFIG) \
-nfd.pull-if-not-present=$(E2E_PULL_IF_NOT_PRESENT) \
-ginkgo.focus="\[k8s-sigs\/node-feature-discovery\]" \
-ginkgo.label-filter=$(E2E_GINKGO_LABEL_FILTER) \
-ginkgo.v \
$(if $(OPENSHIFT),-nfd.openshift,); \
fi
push:
$(IMAGE_PUSH_CMD) $(IMAGE_TAG)
$(IMAGE_PUSH_CMD) $(IMAGE_TAG)-minimal
$(IMAGE_PUSH_CMD) $(IMAGE_TAG)-full
for tag in $(IMAGE_EXTRA_TAGS); do \
$(IMAGE_PUSH_CMD) $$tag; \
$(IMAGE_PUSH_CMD) $$tag-minimal; \
$(IMAGE_PUSH_CMD) $$tag-full; \
done
push-all: ensure-buildx yamls
$(IMAGE_BUILDX_CMD) --push $(IMAGE_BUILD_ARGS) $(IMAGE_BUILD_ARGS_FULL)
$(IMAGE_BUILDX_CMD) --push $(IMAGE_BUILD_ARGS) $(IMAGE_BUILD_ARGS_MINIMAL)
poll-images:
set -e; \
tags="$(foreach tag,$(IMAGE_TAG_NAME) $(IMAGE_EXTRA_TAG_NAMES),$(tag) $(tag)-minimal $(tag)-full)" \
base_url=`echo $(IMAGE_REPO) | sed -e s'!\([^/]*\)!\1/v2!'`; \
for tag in $$tags; do \
image=$(IMAGE_REPO):$$tag \
errors=`curl -fsS -X GET https://$$base_url/manifests/$$tag|jq .errors`; \
if [ "$$errors" = "null" ]; then \
echo Image $$image found; \
else \
echo Image $$image not found; \
exit 1; \
fi; \
done
site-build:
@mkdir -p docs/vendor/bundle
$(SITE_BUILD_CMD) sh -c "bundle install && jekyll build $(JEKYLL_OPTS)"
site-serve:
@mkdir -p docs/vendor/bundle
$(SITE_BUILD_CMD) sh -c "bundle install && jekyll serve $(JEKYLL_OPTS) -H 127.0.0.1"
benchmark:
go test -bench=./pkg/nfd-master -run=^# ./pkg/nfd-master