-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: initial implementation of evpn gw cni
Signed-off-by: Dimitrios Markou <dimitrios.markou@ericsson.com>
- Loading branch information
Showing
18 changed files
with
3,106 additions
and
89 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,26 @@ | ||
# SPDX-License-Identifier: Apache-2.0 | ||
# Copyright (c) 2022-2023 Dell Inc, or its subsidiaries. | ||
# Copyright (C) 2023 Network Plumping Working Group | ||
# Copyright (C) 2023 Nordix Foundation. | ||
|
||
FROM docker.io/library/golang:1.21.6-alpine as builder | ||
FROM golang:1.20-alpine3.19 as builder | ||
Check warning Code scanning / Scorecard Pinned-Dependencies Medium
score is 0: containerImage not pinned by hash
Click Remediation section below to solve this issue |
||
|
||
WORKDIR /app | ||
COPY . /usr/src/evpn-gw-cni | ||
|
||
# Download necessary Go modules | ||
COPY go.mod ./ | ||
COPY go.sum ./ | ||
RUN go mod download | ||
ENV HTTP_PROXY $http_proxy | ||
ENV HTTPS_PROXY $https_proxy | ||
|
||
# build an app | ||
COPY cmd/ cmd/ | ||
# COPY pkg/ pkg/ | ||
RUN go build -v -o /opi-gateway-evpn-cni /app/cmd/... | ||
WORKDIR /usr/src/evpn-gw-cni | ||
RUN apk add --no-cache --virtual build-dependencies build-base=~0.5 && \ | ||
make clean && \ | ||
make build | ||
|
||
# second stage to reduce image size | ||
FROM alpine:3.19 | ||
RUN apk add --no-cache --no-check-certificate hwdata && rm -rf /var/cache/apk/* | ||
COPY --from=builder /opi-gateway-evpn-cni / | ||
COPY --from=docker.io/fullstorydev/grpcurl:v1.8.9-alpine /bin/grpcurl /usr/local/bin/ | ||
EXPOSE 50051 8082 | ||
CMD [ "/opi-gateway-evpn-cni", "-grpc_port=50051", "-http_port=8082" ] | ||
HEALTHCHECK CMD grpcurl -plaintext localhost:50051 list || exit 1 | ||
COPY --from=builder /usr/src/evpn-gw-cni/build/evpn-gw /usr/bin/ | ||
WORKDIR / | ||
|
||
LABEL io.k8s.display-name="EVPN GW CNI" | ||
|
||
COPY ./images/entrypoint.sh / | ||
|
||
ENTRYPOINT ["/entrypoint.sh"] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,51 +1,168 @@ | ||
# SPDX-License-Identifier: Apache-2.0 | ||
# Copyright (c) 2023 Dell Inc, or its subsidiaries. | ||
# Copyright (C) 2023 Network Plumping Working Group | ||
# Copyright (C) 2023 Nordix Foundation. | ||
# Copyright (c) 2024 Ericsson AB. | ||
|
||
ROOT_DIR='.' | ||
PROJECTNAME=$(shell basename "$(PWD)") | ||
# | ||
# Credit: | ||
# This makefile was adapted from: https://github.com/vincentbernat/hellogopher/blob/feature/glide/Makefile | ||
# | ||
|
||
# Make is verbose in Linux. Make it silent. | ||
MAKEFLAGS += --silent | ||
# This Makefile is based on: https://github.com/k8snetworkplumbingwg/sriov-cni/tree/v2.7.0 | ||
|
||
compile: get build | ||
# Package related | ||
BINARY_NAME=evpn-gw | ||
PACKAGE=opi-gateway-evpn-cni | ||
ORG_PATH=github.com/opiproject | ||
REPO_PATH=$(ORG_PATH)/$(PACKAGE) | ||
GOPATH=$(CURDIR)/.gopath | ||
GOBIN=$(CURDIR)/bin | ||
BUILDDIR=$(CURDIR)/build | ||
BASE=$(GOPATH)/src/$(REPO_PATH) | ||
GOFILES = $(shell find . -name *.go | grep -vE "(\/vendor\/)|(_test.go)") | ||
PKGS = $(or $(PKG),$(shell cd $(BASE) && env GOPATH=$(GOPATH) $(GO) list ./... | grep -v "^$(PACKAGE)/vendor/")) | ||
TESTPKGS = $(shell env GOPATH=$(GOPATH) $(GO) list -f '{{ if or .TestGoFiles .XTestGoFiles }}{{ .ImportPath }}{{ end }}' $(PKGS)) | ||
|
||
build: | ||
@echo " > Building binaries..." | ||
@CGO_ENABLED=0 go build -o ${PROJECTNAME} ./cmd/... | ||
export GOPATH | ||
export GOBIN | ||
export GO111MODULE=on | ||
# Docker | ||
IMAGEDIR=$(BASE)/images | ||
DOCKERFILE=$(CURDIR)/Dockerfile | ||
TAG=ghcr.io/opiproject/opi-gateway-evpn-cni | ||
# Accept proxy settings for docker | ||
DOCKERARGS= | ||
ifdef HTTP_PROXY | ||
DOCKERARGS += --build-arg http_proxy=$(HTTP_PROXY) | ||
endif | ||
ifdef HTTPS_PROXY | ||
DOCKERARGS += --build-arg https_proxy=$(HTTPS_PROXY) | ||
endif | ||
|
||
get: | ||
@echo " > Checking if there are any missing dependencies..." | ||
@CGO_ENABLED=0 go get ./... | ||
# Go tools | ||
GO = go | ||
GODOC = godoc | ||
GOFMT = gofmt | ||
TIMEOUT = 15 | ||
V ?= 0 | ||
Q = $(if $(filter 1,$V),,@) | ||
|
||
tools: | ||
go get golang.org/x/tools/cmd/goimports | ||
go get github.com/kisielk/errcheck | ||
go get github.com/axw/gocov/gocov | ||
go get github.com/matm/gocov-html | ||
go get github.com/tools/godep | ||
go get github.com/mitchellh/gox | ||
go get github.com/golang/lint/golint | ||
.PHONY: all | ||
all: fmt lint build | ||
|
||
test: | ||
@echo " > Running ginkgo test suites..." | ||
# can replace with a recursive command ginkgo suites are defined for all packages | ||
ginkgo grpc pkg | ||
$(BASE): ; $(info Setting GOPATH...) | ||
@mkdir -p $(dir $@) | ||
@ln -sf $(CURDIR) $@ | ||
|
||
vet: | ||
@CGO_ENABLED=0 go vet -v ./... | ||
$(GOBIN): | ||
@mkdir -p $@ | ||
|
||
errors: | ||
errcheck -ignoretests -blank ./... | ||
$(BUILDDIR): | $(BASE) ; $(info Creating build directory...) | ||
@cd $(BASE) && mkdir -p $@ | ||
|
||
lint: | ||
golint ./... | ||
build: $(BUILDDIR)/$(BINARY_NAME) ; $(info Building $(BINARY_NAME)...) @ ## Build EVPN GW CNI plugin | ||
$(info Done!) | ||
|
||
imports: | ||
goimports -l -w . | ||
$(BUILDDIR)/$(BINARY_NAME): $(GOFILES) | $(BUILDDIR) | ||
@cd $(BASE)/cmd/$(BINARY_NAME) && CGO_ENABLED=0 $(GO) build -o $(BUILDDIR)/$(BINARY_NAME) -tags no_openssl -v | ||
|
||
fmt: | ||
@CGO_ENABLED=0 go fmt ./... | ||
|
||
mock-generate: | ||
@echo " > Starting mock code generation..." | ||
# Generate mocks for exported interfaces | ||
# Tools | ||
|
||
GOLANGCILINT = $(GOBIN)/golangci-lint | ||
$(GOLANGCILINT): | $(BASE) ; $(info Installing golangci-lint...) | ||
$Q go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.52.2 | ||
|
||
GOCOVMERGE = $(GOBIN)/gocovmerge | ||
$(GOCOVMERGE): | $(BASE) ; $(info Building gocovmerge...) | ||
$Q go install github.com/wadey/gocovmerge@latest | ||
|
||
GOCOV = $(GOBIN)/gocov | ||
$(GOCOV): | $(BASE) ; $(info Building gocov...) | ||
$Q go install github.com/axw/gocov/gocov@v1.1.0 | ||
|
||
GOCOVXML = $(GOBIN)/gocov-xml | ||
$(GOCOVXML): | $(BASE) ; $(info Building gocov-xml...) | ||
$Q go install github.com/AlekSi/gocov-xml@latest | ||
|
||
GCOV2LCOV = $(GOBIN)/gcov2lcov | ||
$(GCOV2LCOV): | $(BASE) ; $(info building gcov2lcov...) | ||
$Q go install github.com/jandelgado/gcov2lcov@latest | ||
|
||
GO2XUNIT = $(GOBIN)/go2xunit | ||
$(GO2XUNIT): | $(BASE) ; $(info Building go2xunit...) | ||
$Q go install github.com/tebeka/go2xunit@latest | ||
|
||
|
||
# Tests | ||
|
||
TEST_TARGETS := test-default test-bench test-short test-verbose test-race | ||
.PHONY: $(TEST_TARGETS) test-xml check test tests | ||
test-bench: ARGS=-run=__absolutelynothing__ -bench=. ## Run benchmarks | ||
test-short: ARGS=-short ## Run only short tests | ||
test-verbose: ARGS=-v ## Run tests in verbose mode with coverage reporting | ||
test-race: ARGS=-race ## Run tests with race detector | ||
$(TEST_TARGETS): NAME=$(MAKECMDGOALS:test-%=%) | ||
$(TEST_TARGETS): test | ||
check test tests: fmt lint | $(BASE) ; $(info Running $(NAME:%=% )tests...) @ ## Run tests | ||
$Q cd $(BASE) && $(GO) test -timeout $(TIMEOUT)s $(ARGS) $(TESTPKGS) | ||
|
||
test-xml: fmt lint | $(BASE) $(GO2XUNIT) ; $(info Running $(NAME:%=% )tests...) @ ## Run tests with xUnit output | ||
$Q cd $(BASE) && 2>&1 $(GO) test -timeout 20s -v $(TESTPKGS) | tee test/tests.output | ||
$(GO2XUNIT) -fail -input test/tests.output -output test/tests.xml | ||
|
||
COVERAGE_DIR = $(CURDIR)/test/coverage | ||
COVERAGE_MODE = atomic | ||
COVERAGE_PROFILE = $(COVERAGE_DIR)/profile.out | ||
COVERAGE_XML = $(COVERAGE_DIR)/coverage.xml | ||
COVERAGE_HTML = $(COVERAGE_DIR)/index.html | ||
.PHONY: test-coverage test-coverage-tools | ||
test-coverage-tools: | $(GOCOVMERGE) $(GOCOV) $(GOCOVXML) $(GCOV2LCOV) | ||
test-coverage: fmt test-coverage-tools | $(BASE) ; $(info Running coverage tests...) @ ## Run coverage tests | ||
$Q mkdir -p $(COVERAGE_DIR)/pkgs | ||
$Q cd $(BASE) && for pkg in $(TESTPKGS); do \ | ||
$(GO) test \ | ||
-coverpkg=$(REPO_PATH)/... \ | ||
-covermode=$(COVERAGE_MODE) \ | ||
-coverprofile="$(COVERAGE_DIR)/pkgs/`echo $$pkg | tr "/" "-"`.cover" $$pkg ;\ | ||
done | ||
$Q $(GOCOVMERGE) $(COVERAGE_DIR)/pkgs/*.cover > $(COVERAGE_PROFILE) | ||
$Q $(GO) tool cover -html=$(COVERAGE_PROFILE) -o $(COVERAGE_HTML) | ||
$Q $(GOCOV) convert $(COVERAGE_PROFILE) | $(GOCOVXML) > $(COVERAGE_XML) | ||
$Q $(GCOV2LCOV) -infile $(COVERAGE_PROFILE) -outfile $(COVERAGE_DIR)/lcov.info | ||
|
||
.PHONY: lint | ||
lint: | $(BASE) $(GOLANGCILINT) ; $(info Running golangci-lint...) @ ## Run golint on all source files | ||
$Q $(GOLANGCILINT) run ./... | ||
|
||
.PHONY: fmt | ||
fmt: ; $(info Running gofmt...) @ ## Run gofmt on all source files | ||
@ret=0 && for d in $$($(GO) list -f '{{.Dir}}' ./... | grep -v /vendor/); do \ | ||
$(GOFMT) -l -w $$d/*.go || ret=$$? ; \ | ||
done ; exit $$ret | ||
|
||
# Docker image | ||
# To pass proxy for Docker invoke it as 'make image HTTP_POXY=http://192.168.0.1:8080' | ||
.PHONY: image | ||
image: | $(BASE) ; $(info Building Docker image...) @ ## Build EVPN GW CNI docker image | ||
@docker build -t $(TAG) -f $(DOCKERFILE) $(CURDIR) $(DOCKERARGS) | ||
|
||
# Misc | ||
|
||
.PHONY: deps-update | ||
deps-update: ; $(info Updating dependencies...) @ ## Update dependencies | ||
@go mod tidy && go mod vendor | ||
|
||
.PHONY: clean | ||
clean: | $(BASE) ; $(info Cleaning...) @ ## Cleanup everything | ||
@cd $(BASE) && $(GO) clean --modcache --cache --testcache | ||
@rm -rf $(GOPATH) | ||
@rm -rf $(BUILDDIR) | ||
@rm -rf $(GOBIN) | ||
@rm -rf test/ | ||
|
||
.PHONY: help | ||
help: ; @ ## Display this help message | ||
@grep -E '^[ a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ | ||
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
OPI GATEWAY EVPN CNI | ||
Copyright (C) 2023 Nordix Foundation. | ||
Copyright (c) 2024 Ericsson AB. | ||
|
||
This product includes software developed at | ||
Nordix Foundation (http://www.nordix.org). | ||
|
||
This project contains code developed by the participants of the Network Plumbing Working Group | ||
(https://github.com/k8snetworkplumbingwg/community) | ||
|
||
The getFileNamesFromPath function in | ||
utils/utils.go was created by NVIDIA CORPORATION & AFFILIATES (http://www.nvidia.com/) | ||
Copyright 2023 NVIDIA CORPORATION & AFFILIATES |
Oops, something went wrong.