| # -*- makefile -*- |
| # ----------------------------------------------------------------------- |
| # Copyright 2017-2024 Open Networking Foundation (ONF) and the ONF Contributors |
| # |
| # 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. |
| # ----------------------------------------------------------------------- |
| |
| $(if $(DEBUG),$(warning ENTER)) |
| |
| .DEFAULT_GOAL := help |
| MAKECMDGOALS ?= help |
| |
| ##-------------------## |
| ##---] GLOBALS [---## |
| ##-------------------## |
| TOP ?=$(strip \ |
| $(dir \ |
| $(abspath $(lastword $(MAKEFILE_LIST)))\ |
| )\ |
| ) |
| |
| ##--------------------## |
| ##---] INCLUDES [---## |
| ##--------------------## |
| include $(TOP)/config.mk |
| include $(TOP)/makefiles/include.mk |
| include $(ONF_MAKEDIR)/release/include.mk |
| |
| ##--------------------## |
| ##---] INCLUDES [---## |
| ##--------------------## |
| help-targets := help-all help HELP |
| $(if $(filter $(help-targets),$(MAKECMDGOALS))\ |
| ,$(eval include $(MAKEDIR)/help.mk)) |
| |
| ##-------------------## |
| ##---] GLOBALS [---## |
| ##-------------------## |
| VERSION ?= $(shell cat ./VERSION) |
| DIFF ?= $(git diff --shortstat 2> /dev/null | tail -n1) |
| GIT_STATUS ?= $(shell [ -z "$DIFF" ] && echo "Dirty" || echo "Clean") |
| |
| include $(MAKEDIR)/tools.mk # Command macros for DOCKER_*, GO_* |
| |
| ## use local vars to shorten paths |
| bbsim-tag = ${DOCKER_REGISTRY}${DOCKER_REPOSITORY}bbsim:${DOCKER_TAG} |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| |
| # Public targets |
| all: help |
| |
| protos: api/bbsim/bbsim.pb.go api/bbsim/bbsim.pb.gw.go api/legacy/bbsim.pb.go api/legacy/bbsim.pb.gw.go api/bbsim/bbsim_dmi.pb.go # @HELP Build proto files |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Build tools for use on localhost |
| ## ----------------------------------------------------------------------- |
| build-target-deps += build-bbsim |
| build-target-deps += build-bbsimctl |
| build-target-deps += build-bbr |
| |
| .PHONY: build $(build-target-deps) |
| build: protos $(build-target-deps) |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Cross-compile binaries for release |
| ## ----------------------------------------------------------------------- |
| release-target-deps += release-bbr |
| release-target-deps += release-bbsim |
| release-target-deps += release-bbsimctl |
| |
| .PHONY: release $(release-target-deps) |
| release: $(release-target-deps) |
| |
| ## lint and unit tests |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| lint-dockerfile: |
| @echo "Running Dockerfile lint check..." |
| @${HADOLINT} $$(find ./build -name "Dockerfile*") |
| @echo "Dockerfile lint check OK" |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| lint-mod: |
| $(call banner-enter,Target $@) |
| @echo "Running dependency check..." |
| @${GO} mod verify |
| @echo "Dependency check OK. Running vendor check..." |
| @git status > /dev/null |
| @git diff-index --quiet HEAD -- go.mod go.sum vendor || (echo "ERROR: Staged or modified files must be committed before running this test" && git status -- go.mod go.sum vendor && exit 1) |
| @[[ `git ls-files --exclude-standard --others go.mod go.sum vendor` == "" ]] || (echo "ERROR: Untracked files must be cleaned up before running this test" && git status -- go.mod go.sum vendor && exit 1) |
| |
| $(HIDE)$(MAKE) --no-print-directory mod-update |
| |
| @git status > /dev/null |
| @git diff-index --quiet HEAD -- go.mod go.sum vendor || (echo "ERROR: Modified files detected after running go mod tidy / go mod vendor" && git status -- go.mod go.sum vendor && git checkout -- go.mod go.sum vendor && exit 1) |
| @[[ `git ls-files --exclude-standard --others go.mod go.sum vendor` == "" ]] || (echo "ERROR: Untracked files detected after running go mod tidy / go mod vendor" && git status -- go.mod go.sum vendor && git checkout -- go.mod go.sum vendor && exit 1) |
| @echo "Vendor check OK." |
| $(call banner-enter,Target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| lint: lint-mod lint-dockerfile |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Generate a static code analysis report |
| ## ----------------------------------------------------------------------- |
| sca-report-dir := ./sca-report |
| sca-report-xml := $(sca-report-dir)/sca-report.xml |
| sca: |
| $(call begin-enter,Target $@) |
| @$(RM) -r $(sca-report-dir) |
| @mkdir -p $(sca-report-dir) |
| @echo "Running static code analysis..." |
| @${GOLANGCI_LINT} run -vv --deadline=6m --out-format junit-xml ./... \ |
| | tee ./sca-report/sca-report.xml |
| @echo "" |
| @echo "Static code analysis OK" |
| $(call begin-leave,Target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| test: docs-lint test-unit test-bbr |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| coverage-out := ./tests/results/go-test-coverage.out |
| coverage-xml := ./tests/results/go-test-coverage.xml |
| |
| results-out := ./tests/results/go-test-results.out |
| results-xml := ./tests/results/go-test-results.xml |
| |
| test-unit: clean local-omci-lib-go # @HELP Execute unit tests |
| |
| $(call banner-enter,Target $@) |
| |
| @mkdir -p $(dir $(results-out)) |
| |
| $(call banner,Running unit tests...) |
| |
| $(if $(LOCAL_FIX_PERMS),\ |
| chmod o+w $(dir $(results-out) $(results-out))) |
| set -euo pipefail \ |
| && ${GO} test -mod=vendor -bench=. -v \ |
| -coverprofile $(coverage-out) \ |
| -covermode count ./... \ |
| 2>&1 | tee "$(results-out)" |
| $(if $(LOCAL_FIX_PERMS),\ |
| chmod o-w $(dir $(results-out) $(results-out))) |
| |
| $(call banner,Coverage report: junit) |
| $(if $(LOCAL_FIX_PERMS),\ |
| chmod o+w $(dir $(results-xml) $(results-xml))) |
| ${GO_JUNIT_REPORT} < $(results-out) > $(results-xml) |
| $(if $(LOCAL_FIX_PERMS),\ |
| chmod o-w $(dir $(results-xml) $(results-xml))) |
| |
| $(call banner,Coverage report: Cobertura) |
| $(if $(LOCAL_FIX_PERMS),\ |
| chmod o+w $(dir $(results-xml) $(coverage-xml))) |
| ${GOCOVER_COBERTURA} < $(coverage-out) > $(coverage-xml) |
| $(if $(LOCAL_FIX_PERMS),\ |
| chmod o-w $(dir $(results-xml) $(coverage-xml))) |
| |
| $(call banner,Coverage report directory perms:) |
| |
| @echo |
| @/bin/ls -ld tests tests/results |
| |
| @echo |
| @find $(dir $(results-out)) -print0 | xargs -0 ls -l |
| # chown -R $$(id -u):$$(id -g) $(dir $(results-xml) |
| |
| $(call banner,Locally modified files: git status) |
| git status |
| |
| $(call banner-leave,Target $@) |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| test-bbr: release-bbr docker-build # @HELP Validate that BBSim and BBR are working together |
| DOCKER_RUN_ARGS="-pon 2 -onu 2" $(MAKE) docker-run |
| sleep 5 |
| ./$(RELEASE_DIR)/$(RELEASE_BBR_NAME)-linux-amd64 -pon 2 -onu 2 -logfile tmp.logs |
| docker $(RM) -f bbsim |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| docker-build: local-omci-lib-go local-protos# @HELP Build the BBSim docker container (contains BBSimCtl too) |
| docker build \ |
| -t "$(bbsim-tag)" \ |
| -f build/package/Dockerfile . |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| docker-push: # @HELP Push the docker container to a registry |
| docker push "$(bbsim-tag)" |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| docker-kind-load: |
| @if [ "`kind get clusters | grep voltha-$(TYPE)`" = '' ]; then echo "no voltha-$(TYPE) cluster found" && exit 1; fi |
| kind load docker-image "$(bbsim-tag)" --name=voltha-$(TYPE) --nodes $(shell kubectl get nodes --template='{{range .items}}{{.metadata.name}},{{end}}' | sed 's/,$$//') |
| |
| ## ----------------------------------------------------------------------- |
| ## docker-run |
| ## ----------------------------------------------------------------------- |
| |
| # % docker run --detach unless dev-mode |
| is-docker-run := $(filter-out %-dev,$(MAKECMDGOALS)) |
| is-docker-run := $(findstring docker-run,$(is-docker-run)) |
| |
| docker-run-cmd = docker run |
| $(if $(is-docker-run),$(eval docker-run-cmd += --detach)) |
| docker-run-cmd += ${DOCKER_PORTS} |
| docker-run-cmd += --privileged |
| docker-run-cmd += --rm |
| docker-run-cmd += --name bbsim |
| docker-run-cmd += "$(bbsim-tag)" /app/bbsim |
| docker-run-cmd += ${DOCKER_RUN_ARGS} |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| docker-run: # @HELP Runs the container locally (available options: DOCKER_RUN_ARGS="-pon 2 -onu 2" make docker-run) |
| docker ps |
| $(docker-run-cmd) |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| docker-run-dev: # @HELP Runs the container locally (intended for development purposes, not in detached mode) |
| $(docker-run-cmd) |
| |
| ## ----------------------------------------------------------------------- |
| ## docker-run |
| ## ----------------------------------------------------------------------- |
| .PHONY: docs docs-lint |
| docs: swagger # @HELP Generate docs and opens them in the browser |
| |
| $(call begin-enter,Target $@) |
| -$(MAKE) -C docs html |
| $(call begin-leave,Target $@) |
| |
| @echo -e "\nBBSim documentation generated in file://${PWD}/docs/build/html/index.html" |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| docs-lint: |
| $(MAKE) -C docs lint-doc8 |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| swagger-deps += docs/swagger/bbsim/bbsim.swagger.json |
| swagger-deps += docs/swagger/leagacy/bbsim.swagger.json |
| .PHONY: $(swagger-deps) |
| swagger: $(swagger-deps) # @HELP Generate swagger documentation for BBSim API |
| |
| ## ----------------------------------------------------------------------- |
| ## Local Development Helpers |
| ## ----------------------------------------------------------------------- |
| local-omci-lib-go: |
| ifdef LOCAL_OMCI_LIB_GO |
| mkdir -p vendor/github.com/opencord/omci-lib-go |
| cp -r ${LOCAL_OMCI_LIB_GO}/* vendor/github.com/opencord/omci-lib-go |
| endif |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| local-protos: ## Copies a local version of the voltha-protos dependency into the vendor directory |
| ifdef LOCAL_PROTOS |
| $(RM) -r vendor/github.com/opencord/voltha-protos/v5/go |
| mkdir -p vendor/github.com/opencord/voltha-protos/v5/go |
| cp -r ${LOCAL_PROTOS}/go/* vendor/github.com/opencord/voltha-protos/v5/go |
| $(RM) -r vendor/github.com/opencord/voltha-protos/v5/go/vendor |
| endif |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| clean :: |
| @$(RM) -f bbsim |
| @$(RM) -f bbsimctl |
| @$(RM) -f bbr |
| @$(RM) -r tools/bin |
| @$(RM) -r release |
| |
| @$(RM) $(coverage-out) |
| @$(RM) $(coverage-xml) |
| |
| @$(RM) $(results-out) |
| @$(RM) $(results-xml) |
| |
| @$(RM) $(sca-report-xml) |
| |
| sterile :: clean |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| setup_tools: |
| @echo "Downloading dependencies..." |
| @${GO} mod download github.com/grpc-ecosystem/grpc-gateway github.com/opencord/voltha-protos/v5 |
| @echo "Dependencies downloaded OK" |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| VOLTHA_PROTOS ?= $(shell ${GO} list -f '{{ .Dir }}' -m github.com/opencord/voltha-protos/v5) |
| GOOGLEAPI ?= $(shell ${GO} list -f '{{ .Dir }}' -m github.com/grpc-ecosystem/grpc-gateway) |
| |
| .PHONY: api/openolt/openolt.pb.go api/bbsim/bbsim.pb.go api/bbsim/bbsim.pb.gw.go api/legacy/bbsim.pb.go api/legacy/bbsim.pb.gw.go |
| api/openolt/openolt.pb.go: api/openolt/openolt.proto setup_tools |
| @echo $@ |
| @${PROTOC} -I. \ |
| -I${GOOGLEAPI}/third_party/googleapis \ |
| --go_out=plugins=grpc:./ --go_opt=paths=source_relative \ |
| $< |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| api/bbsim/bbsim_dmi.pb.go: api/bbsim/bbsim_dmi.proto setup_tools |
| @echo $@ |
| @${PROTOC} -I. \ |
| -I${GOOGLEAPI}/third_party/googleapis \ |
| --go_out=plugins=grpc:./ --go_opt=paths=source_relative \ |
| $< |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| api/bbsim/bbsim.pb.go api/bbsim/bbsim.pb.gw.go: api/bbsim/bbsim.proto api/bbsim/bbsim.yaml setup_tools |
| @echo $@ |
| @${PROTOC} -I. \ |
| -I${GOOGLEAPI}/third_party/googleapis \ |
| -I${VOLTHA_PROTOS}/protos/ \ |
| --go_out=plugins=grpc:./ --go_opt=paths=source_relative \ |
| --grpc-gateway_out=logtostderr=true,paths=source_relative,grpc_api_configuration=api/bbsim/bbsim.yaml,allow_delete_body=true:./ \ |
| $< |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| api/legacy/bbsim.pb.go api/legacy/bbsim.pb.gw.go: api/legacy/bbsim.proto setup_tools |
| @echo $@ |
| @${PROTOC} -I. \ |
| -I${GOOGLEAPI}/third_party/googleapis/ \ |
| -I${GOOGLEAPI}/ \ |
| -I${VOLTHA_PROTOS}/protos/ \ |
| --go_out=plugins=grpc:./ \ |
| --grpc-gateway_out=logtostderr=true,paths=source_relative,allow_delete_body=true:./ \ |
| $< |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| docs/swagger/bbsim/bbsim.swagger.json: api/bbsim/bbsim.yaml setup_tools |
| @echo $@ |
| @${PROTOC} -I ./api \ |
| -I${GOOGLEAPI}/ \ |
| -I${VOLTHA_PROTOS}/protos/ \ |
| --swagger_out=logtostderr=true,allow_delete_body=true,disable_default_errors=true,grpc_api_configuration=$<:docs/swagger/ \ |
| api/bbsim/bbsim.proto |
| |
| ## ----------------------------------------------------------------------- |
| ## ----------------------------------------------------------------------- |
| docs/swagger/leagacy/bbsim.swagger.json: api/legacy/bbsim.proto setup_tools |
| @echo $@ |
| @${PROTOC} -I ./api \ |
| -I${GOOGLEAPI}/ \ |
| -I${VOLTHA_PROTOS}/protos/ \ |
| --swagger_out=logtostderr=true,allow_delete_body=true,disable_default_errors=true:docs/swagger/ \ |
| $< |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: |
| ## ----------------------------------------------------------------------- |
| clean :: |
| $(RM) -r "docs/$(venv-name)" |
| |
| ## ----------------------------------------------------------------------- |
| ## Intent: Helper target used to exercise release script changes |
| ## ----------------------------------------------------------------------- |
| include $(MAKEDIR)/release/onf-publish.mk |
| |
| $(if $(DEBUG),$(warning LEAVE)) |
| |
| # [EOF] x 2 |