2019-04-03 08:46:15 +00:00
# Copyright 2018 The Ceph-CSI Authors.
2018-01-09 18:59:50 +00:00
#
# 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.
2020-08-18 07:34:27 +00:00
.PHONY : all cephcsi check -env
2018-01-09 18:59:50 +00:00
2020-11-03 07:33:15 +00:00
CONTAINERIZED ?= no
2020-08-18 11:23:51 +00:00
CONTAINER_CMD ?= $( shell podman version >/dev/null 2>& 1 && echo podman)
2020-04-26 10:56:19 +00:00
i f e q ( $( CONTAINER_CMD ) , )
2020-08-18 11:23:51 +00:00
CONTAINER_CMD = $( shell docker version >/dev/null 2>& 1 && echo docker)
2020-04-26 10:56:19 +00:00
e n d i f
2020-12-22 07:58:06 +00:00
# Recent versions of Podman do not allow non-root to use --cpuset options.
# Set HAVE_CPUSET to 1 when cpuset support is available.
i f e q ( $( UID ) , 0 )
HAVE_CPUSET ?= $( shell grep -c -w cpuset /sys/fs/cgroup/cgroup.controllers 2>/dev/null)
e l s e
HAVE_CPUSET ?= $( shell grep -c -w cpuset /sys/fs/cgroup/user.slice/user-$( UID) .slice/cgroup.controllers 2>/dev/null)
e n d i f
i f e q ( $( HAVE_CPUSET ) , 1 )
CPUS ?= $( shell nproc --ignore= 1)
CPUSET ?= --cpuset-cpus= 0-${ CPUS }
e n d i f
2019-03-13 19:21:48 +00:00
2019-05-24 11:03:33 +00:00
CSI_IMAGE_NAME = $( if $( ENV_CSI_IMAGE_NAME) ,$( ENV_CSI_IMAGE_NAME) ,quay.io/cephcsi/cephcsi)
2020-12-09 07:50:10 +00:00
CSI_IMAGE_VERSION = $( shell . $( CURDIR) /build.env ; echo $$ { CSI_IMAGE_VERSION} )
2019-11-07 09:55:12 +00:00
CSI_IMAGE = $( CSI_IMAGE_NAME) :$( CSI_IMAGE_VERSION)
2018-01-09 18:59:50 +00:00
2020-11-02 15:57:19 +00:00
# Pass USE_PULLED_IMAGE=yes to skip building a new :test or :devel image.
USE_PULLED_IMAGE ?= no
2019-05-24 11:03:33 +00:00
$(info cephcsi image settings : $( CSI_IMAGE_NAME ) version $( CSI_IMAGE_VERSION ) )
2020-04-21 13:31:25 +00:00
i f n d e f G I T _ C O M M I T
2019-07-12 10:18:00 +00:00
GIT_COMMIT = $( shell git rev-list -1 HEAD)
2020-04-21 06:39:03 +00:00
e n d i f
2019-07-12 10:18:00 +00:00
GO_PROJECT = github.com/ceph/ceph-csi
# go build flags
LDFLAGS ?=
2020-04-17 09:23:49 +00:00
LDFLAGS += -X $( GO_PROJECT) /internal/util.GitCommit= $( GIT_COMMIT)
2019-07-12 10:18:00 +00:00
# CSI_IMAGE_VERSION will be considered as the driver version
2020-04-17 09:23:49 +00:00
LDFLAGS += -X $( GO_PROJECT) /internal/util.DriverVersion= $( CSI_IMAGE_VERSION)
2019-07-12 10:18:00 +00:00
2020-06-22 13:54:18 +00:00
BASE_IMAGE ?= $( shell . $( CURDIR) /build.env ; echo $$ { BASE_IMAGE} )
2020-04-22 12:00:34 +00:00
2020-06-24 12:28:02 +00:00
i f n d e f C E P H _ V E R S I O N
CEPH_VERSION = $( shell . $( CURDIR) /build.env ; echo $$ { CEPH_VERSION} )
e n d i f
i f d e f C E P H _ V E R S I O N
# pass -tags to go commands (for go-ceph build constraints)
GO_TAGS = -tags= $( CEPH_VERSION)
e n d i f
2020-05-28 12:32:38 +00:00
# passing TARGET=static-check on the 'make containerized-test' or 'make
# containerized-build' commandline will run the selected target instead of
# 'make test' in the container. Obviously other targets can be passed as well,
# making it easier for developers to run single tests or build different
# executables.
#
# Defaults:
# make containerized-build TARGET=cephcsi -> runs 'make cephcsi'
# make containerized-test TARGET=test -> runs 'make test'
#
# Other options:
# make containerized-build TARGET=e2e.test -> runs 'make e2e.test'
# make containerized-test TARGET=static-check -> runs 'make static-check'
2020-04-21 09:23:22 +00:00
2020-05-13 13:20:05 +00:00
# Pass GIT_SINCE for the range of commits to test. Used with the commitlint
# target.
2021-02-25 08:20:22 +00:00
GIT_SINCE := origin/devel
2020-05-13 13:20:05 +00:00
2019-12-30 19:47:02 +00:00
SELINUX := $( shell getenforce 2>/dev/null)
i f e q ( $( SELINUX ) , E n f o r c i n g )
SELINUX_VOL_FLAG = :z
e n d i f
2019-05-07 11:39:02 +00:00
all : cephcsi
2018-01-09 18:59:50 +00:00
2021-08-11 05:03:37 +00:00
.PHONY : go -test static -check mod -check go -lint lint -extras gosec commitlint codespell
2020-11-03 07:33:15 +00:00
i f e q ( $( CONTAINERIZED ) , n o )
# include mod-check in non-containerized runs
2020-02-17 12:15:57 +00:00
test : go -test static -check mod -check
2020-11-03 07:33:15 +00:00
e l s e
# exclude mod-check for containerized runs (CI runs it separately)
test : go -test static -check
e n d i f
2021-08-11 05:03:37 +00:00
static-check : check -env codespell go -lint lint -extras gosec
2019-02-07 10:56:20 +00:00
2020-06-22 14:48:41 +00:00
go-test : TEST_COVERAGE ?= $( shell . $ ( CURDIR ) /build .env ; echo $ $ {TEST_COVERAGE })
go-test : GO_COVER_DIR ?= $( shell . $ ( CURDIR ) /build .env ; echo $ $ {GO_COVER_DIR })
2020-05-04 08:28:40 +00:00
go-test : check -env
2020-06-24 12:28:02 +00:00
TEST_COVERAGE = " $( TEST_COVERAGE) " GO_COVER_DIR = " $( GO_COVER_DIR) " GO_TAGS = " $( GO_TAGS) " ./scripts/test-go.sh
2019-02-07 10:56:20 +00:00
2021-09-30 09:42:14 +00:00
go-test-api : check -env
@pushd api/deploy/ocp && go test -v ./... && popd
2020-05-04 08:28:40 +00:00
mod-check : check -env
2020-04-20 09:46:01 +00:00
@echo 'running: go mod verify'
@go mod verify && [ " $( shell sha512sum go.mod) " = "`sha512sum go.mod`" ] || ( echo "ERROR: go.mod was modified by 'go mod verify'" && false )
2019-07-18 12:12:12 +00:00
2021-03-17 12:14:05 +00:00
scripts/golangci.yml : build .env scripts /golangci .yml .in
2020-07-02 12:05:42 +00:00
sed " s/@@CEPH_VERSION@@/ $( CEPH_VERSION) /g " < scripts/golangci.yml.in > scripts/golangci.yml
go-lint : scripts /golangci .yml
2019-03-01 17:45:27 +00:00
./scripts/lint-go.sh
2020-04-17 10:23:44 +00:00
2020-05-14 10:28:14 +00:00
lint-extras :
./scripts/lint-extras.sh lint-all
lint-shell :
./scripts/lint-extras.sh lint-shell
lint-markdown :
./scripts/lint-extras.sh lint-markdown
lint-yaml :
./scripts/lint-extras.sh lint-yaml
lint-helm :
./scripts/lint-extras.sh lint-helm
2020-04-17 10:23:44 +00:00
2020-06-28 18:01:01 +00:00
lint-py :
./scripts/lint-extras.sh lint-py
2020-04-17 10:23:44 +00:00
gosec :
2020-06-24 12:28:02 +00:00
GO_TAGS = " $( GO_TAGS) " ./scripts/gosec.sh
2018-01-09 18:59:50 +00:00
2019-05-29 10:02:16 +00:00
func-test :
2020-06-24 12:28:02 +00:00
go test $( GO_TAGS) -mod= vendor github.com/ceph/ceph-csi/e2e $( TESTOPTIONS)
2019-05-29 10:02:16 +00:00
2020-05-04 08:28:40 +00:00
check-env :
@./scripts/check-env.sh
2021-08-11 05:03:37 +00:00
codespell :
codespell --config scripts/codespell.conf
2020-08-18 08:10:12 +00:00
#
# commitlint will do a rebase on top of GIT_SINCE when REBASE=1 is passed.
#
# Usage: make commitlint REBASE=1
#
commitlint : REBASE ?= 0
2020-05-13 13:20:05 +00:00
commitlint :
2020-08-10 09:20:28 +00:00
git fetch -v $( shell cut -d/ -f1 <<< " $( GIT_SINCE) " ) $( shell cut -d/ -f2- <<< " $( GIT_SINCE) " )
2020-08-18 11:18:08 +00:00
@test $( REBASE) -eq 0 || git -c user.name= commitlint -c user.email= commitline@localhost rebase FETCH_HEAD
2021-06-07 08:40:26 +00:00
commitlint --verbose --from $( GIT_SINCE)
2020-05-13 13:20:05 +00:00
2019-03-20 19:16:15 +00:00
.PHONY : cephcsi
2020-05-04 08:28:40 +00:00
cephcsi : check -env
2020-02-17 12:15:57 +00:00
if [ ! -d ./vendor ] ; then ( go mod tidy && go mod vendor) ; fi
2020-06-24 12:28:02 +00:00
GOOS = linux go build $( GO_TAGS) -mod vendor -a -ldflags '$(LDFLAGS)' -o _output/cephcsi ./cmd/
2018-01-09 18:59:50 +00:00
2020-05-28 12:32:38 +00:00
e2e.test : check -env
2020-06-24 12:28:02 +00:00
go test $( GO_TAGS) -mod= vendor -c ./e2e
2020-05-28 12:32:38 +00:00
2021-10-01 12:08:56 +00:00
#
# Update the generated deploy/ files when the template changed. This requires
# running 'go mod vendor' so update the API files under the vendor/ directory.
.PHONY : generate -deploy
generate-deploy :
go mod vendor
$( MAKE) -C deploy
2021-09-30 09:42:14 +00:00
2020-07-30 13:48:42 +00:00
#
# e2e testing by compiling e2e.test in case it does not exist and running the
# executable. The e2e.test executable is not checked as a dependency in the
# make rule, as the phony check-env causes rebuilds for each run.
#
# Usage: make run-e2e E2E_ARGS="--test-cephfs=false --test-rbd=true"
#
.PHONY : run -e 2e
run-e2e : E 2E_TIMEOUT ?= $( shell . $ ( CURDIR ) /build .env ; echo $ $ {E 2E_TIMEOUT })
run-e2e : DEPLOY_TIMEOUT ?= $( shell . $ ( CURDIR ) /build .env ; echo $ $ {DEPLOY_TIMEOUT })
run-e2e : NAMESPACE ?= cephcsi -e 2e -$( shell uuidgen | cut -d - -f 1)
run-e2e :
@test -e e2e.test || $( MAKE) e2e.test
cd e2e && \
../e2e.test -test.v -test.timeout= " ${ E2E_TIMEOUT } " --deploy-timeout= " ${ DEPLOY_TIMEOUT } " --cephcsi-namespace= $( NAMESPACE) $( E2E_ARGS)
2020-08-18 07:34:27 +00:00
.container-cmd :
2020-07-06 15:20:38 +00:00
@test -n " $( shell which $( CONTAINER_CMD) 2>/dev/null) " || { echo "Missing container support, install Podman or Docker" ; exit 1; }
2020-08-18 07:34:27 +00:00
@echo " $( CONTAINER_CMD) " > .container-cmd
2020-07-06 15:20:38 +00:00
2020-04-18 14:55:23 +00:00
.PHONY : containerized -build containerized -test
2020-05-28 12:32:38 +00:00
containerized-build : TARGET = cephcsi
2020-08-18 07:34:27 +00:00
containerized-build : .container -cmd .devel -container -id
2020-11-03 07:33:15 +00:00
$( CONTAINER_CMD) run --rm -v $( CURDIR) :/go/src/github.com/ceph/ceph-csi$( SELINUX_VOL_FLAG) $( CSI_IMAGE_NAME) :devel make $( TARGET) CONTAINERIZED = yes
2019-12-30 19:47:02 +00:00
2020-05-28 12:32:38 +00:00
containerized-test : TARGET = test
2020-08-18 08:10:12 +00:00
containerized-test : REBASE ?= 0
2020-08-18 07:34:27 +00:00
containerized-test : .container -cmd .test -container -id
2020-11-03 07:33:15 +00:00
$( CONTAINER_CMD) run --rm -v $( CURDIR) :/go/src/github.com/ceph/ceph-csi$( SELINUX_VOL_FLAG) $( CSI_IMAGE_NAME) :test make $( TARGET) GIT_SINCE = $( GIT_SINCE) REBASE = $( REBASE) CONTAINERIZED = yes
2020-04-18 14:55:23 +00:00
2020-11-02 15:57:19 +00:00
i f e q ( $( USE_PULLED_IMAGE ) , n o )
2020-11-24 11:54:29 +00:00
# create a (cached) container image with dependencies for building cephcsi
2020-08-18 07:34:27 +00:00
.devel-container-id : .container -cmd scripts /Dockerfile .devel
2019-12-30 19:47:02 +00:00
[ ! -f .devel-container-id ] || $( CONTAINER_CMD) rmi $( CSI_IMAGE_NAME) :devel
2020-06-22 13:54:18 +00:00
$( CONTAINER_CMD) build $( CPUSET) --build-arg BASE_IMAGE = $( BASE_IMAGE) -t $( CSI_IMAGE_NAME) :devel -f ./scripts/Dockerfile.devel .
2019-12-30 19:47:02 +00:00
$( CONTAINER_CMD) inspect -f '{{.Id}}' $( CSI_IMAGE_NAME) :devel > .devel-container-id
2020-11-02 15:57:19 +00:00
e l s e
# create the .devel-container-id file based on pulled image
.devel-container-id : .container -cmd
$( CONTAINER_CMD) inspect -f '{{.Id}}' $( CSI_IMAGE_NAME) :devel > .devel-container-id
e n d i f
2019-12-30 19:47:02 +00:00
2020-11-02 15:57:19 +00:00
i f e q ( $( USE_PULLED_IMAGE ) , n o )
2020-11-24 11:54:29 +00:00
# create a (cached) container image with dependencies for testing cephcsi
2020-08-18 07:34:27 +00:00
.test-container-id : .container -cmd build .env scripts /Dockerfile .test
2020-04-18 14:55:23 +00:00
[ ! -f .test-container-id ] || $( CONTAINER_CMD) rmi $( CSI_IMAGE_NAME) :test
2020-04-26 10:56:19 +00:00
$( CONTAINER_CMD) build $( CPUSET) -t $( CSI_IMAGE_NAME) :test -f ./scripts/Dockerfile.test .
2020-04-18 14:55:23 +00:00
$( CONTAINER_CMD) inspect -f '{{.Id}}' $( CSI_IMAGE_NAME) :test > .test-container-id
2020-11-02 15:57:19 +00:00
e l s e
# create the .test-container-id file based on the pulled image
.test-container-id : .container -cmd
$( CONTAINER_CMD) inspect -f '{{.Id}}' $( CSI_IMAGE_NAME) :test > .test-container-id
e n d i f
2020-04-18 14:55:23 +00:00
2020-06-22 14:58:56 +00:00
image-cephcsi : GOARCH ?= $( shell go env GOARCH 2>/dev /null )
2020-08-18 07:34:27 +00:00
image-cephcsi : .container -cmd
2020-06-22 13:54:18 +00:00
$( CONTAINER_CMD) build $( CPUSET) -t $( CSI_IMAGE) -f deploy/cephcsi/image/Dockerfile . --build-arg CSI_IMAGE_NAME = $( CSI_IMAGE_NAME) --build-arg CSI_IMAGE_VERSION = $( CSI_IMAGE_VERSION) --build-arg GIT_COMMIT = $( GIT_COMMIT) --build-arg GO_ARCH = $( GOARCH) --build-arg BASE_IMAGE = $( BASE_IMAGE)
2018-03-05 11:59:47 +00:00
2020-06-22 14:58:56 +00:00
push-image-cephcsi : GOARCH ?= $( shell go env GOARCH 2>/dev /null )
2020-08-18 07:34:27 +00:00
push-image-cephcsi : .container -cmd image -cephcsi
2019-11-07 09:55:12 +00:00
$( CONTAINER_CMD) tag $( CSI_IMAGE) $( CSI_IMAGE) -$( GOARCH)
$( CONTAINER_CMD) push $( CSI_IMAGE) -$( GOARCH)
2020-07-16 06:03:06 +00:00
create-manifest : GOARCH ?= $( shell go env GOARCH 2>/dev /null )
2020-08-18 07:34:27 +00:00
create-manifest : .container -cmd
2020-07-16 06:03:06 +00:00
$( CONTAINER_CMD) manifest create $( CSI_IMAGE) --amend $( CSI_IMAGE) -$( GOARCH)
2020-08-18 07:34:27 +00:00
push-manifest : .container -cmd
2020-07-16 06:03:06 +00:00
$( CONTAINER_CMD) manifest push $( CSI_IMAGE)
2018-03-09 16:00:53 +00:00
2018-01-09 18:59:50 +00:00
clean :
2020-04-18 14:55:23 +00:00
go clean -mod= vendor -r -x
2019-05-24 11:03:33 +00:00
rm -f deploy/cephcsi/image/cephcsi
rm -f _output/cephcsi
2020-07-02 12:05:42 +00:00
$( RM) scripts/golangci.yml
2020-05-28 12:32:38 +00:00
$( RM) e2e.test
2019-12-30 19:47:02 +00:00
[ ! -f .devel-container-id ] || $( CONTAINER_CMD) rmi $( CSI_IMAGE_NAME) :devel
$( RM) .devel-container-id
2020-04-18 14:55:23 +00:00
[ ! -f .test-container-id ] || $( CONTAINER_CMD) rmi $( CSI_IMAGE_NAME) :test
$( RM) .test-container-id