Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: (OPI CNI) This is the initial implementation of OPI CNI #7

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 24 additions & 24 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,25 +1,25 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright (c) 2022-2023 Dell Inc, or its subsidiaries.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you should not remove copyright


FROM docker.io/library/golang:1.21.4-alpine as builder

WORKDIR /app

# Download necessary Go modules
COPY go.mod ./
COPY go.sum ./
RUN go mod download

# build an app
COPY cmd/ cmd/
COPY pkg/ pkg/
RUN go build -v -o /opi-cni /app/cmd/...

# second stage to reduce image size
FROM alpine:3.18
RUN apk add --no-cache --no-check-certificate hwdata && rm -rf /var/cache/apk/*
COPY --from=builder /opi-cni /
COPY --from=docker.io/fullstorydev/grpcurl:v1.8.9-alpine /bin/grpcurl /usr/local/bin/
EXPOSE 50051 8082
CMD [ "/opi-cni", "-grpc_port=50051", "-http_port=8082" ]
HEALTHCHECK CMD grpcurl -plaintext localhost:50051 list || exit 1
# Copyright (C) 2023 Network Plumping Working Group
# Copyright (C) 2023 Nordix Foundation.

FROM golang:alpine 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

COPY . /usr/src/opi-cni

ENV HTTP_PROXY $http_proxy
ENV HTTPS_PROXY $https_proxy

WORKDIR /usr/src/opi-cni
RUN apk add --no-cache --virtual build-dependencies build-base=~0.5 && \
make clean && \
make build

FROM alpine:3

Check warning

Code scanning / Scorecard

Pinned-Dependencies Medium

score is 0: containerImage not pinned by hash
Remediation tip: pin your Docker image by updating alpine:3 to alpine:3@sha256:34871e7290500828b39e22294660bee86d966bc0017544e848dd9a255cdf59e0
Click Remediation section below for further remediation help
COPY --from=builder /usr/src/opi-cni/build/opi /usr/bin/
WORKDIR /

LABEL io.k8s.display-name="OPI CNI"

COPY ./images/entrypoint.sh /

ENTRYPOINT ["/entrypoint.sh"]
189 changes: 152 additions & 37 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,51 +1,166 @@
# 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.

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=opi
PACKAGE=opi-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-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 OPI 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/[email protected]

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/[email protected]

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 OPI 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}'
12 changes: 12 additions & 0 deletions NOTICE
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
OPI CNI
Copyright (C) 2023 Nordix Foundation

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
Loading