Skip to content

Commit

Permalink
feat: initial implementation of evpn gw cni
Browse files Browse the repository at this point in the history
Signed-off-by: Dimitrios Markou <dimitrios.markou@ericsson.com>
  • Loading branch information
mardim91 committed Feb 22, 2024
1 parent 7020632 commit d09a7fc
Show file tree
Hide file tree
Showing 18 changed files with 3,106 additions and 89 deletions.
35 changes: 18 additions & 17 deletions Dockerfile
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"]
189 changes: 153 additions & 36 deletions Makefile
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}'
13 changes: 13 additions & 0 deletions NOTICE
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
Loading

0 comments on commit d09a7fc

Please sign in to comment.