Skip to content
Snippets Groups Projects
Commit c0f7d938 authored by Malte Bauch's avatar Malte Bauch
Browse files

Merge branch develop with refs/heads/master into refs/merge-requests/245/train

parents ac2bbb70 44b946b1
No related branches found
No related tags found
No related merge requests found
Pipeline #96709 passed
Showing
with 721 additions and 60 deletions
.git
.gitlab
build
documentation
mocks
test
.cobra.yaml
.dockeringore
.gitlab-ci.yaml
ARCHITECTURE.md
CONTRIBUTING.md
README.md
root = true
[*]
indent_style = space
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf
[{*.yaml, *.yml}]
indent_size = 2
.vscode/
.vscode/launch.json
.DS_Store
documentation/design-documentation/
documentation/design/*.pdf
......@@ -14,4 +15,16 @@ documentation/design/*.pdf
.idea/workspace.xml
restconf/bin/bin
test/.terraform.local/
configs/gosdn.toml
\ No newline at end of file
configs/gosdn.toml
api/api_test.toml
debug.test
# test files
report.xml
nucleus/util/proto/*_test
# Binary
gosdn
# persistent data
**/stores/**
variables:
SECURE_ANALYZERS_PREFIX: registry.gitlab.com/gitlab-org/security-products/analyzers
DOCKER_IMAGE_SHA: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
GOSDN_IMAGE: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"
GOSDN_TESTING_IMAGE: "${CI_REGISTRY_IMAGE}:testing_${CI_COMMIT_SHA}"
CEOS_IMAGE: "$CI_REGISTRY_IMAGE/ceos:latest"
GOLANG_VERSION: "1.17"
stages:
- .pre
- test
- build
- test
- analyze
- apply
- integration-test
- deploy
- build-release
- .post
default:
before_script:
- git config --global url."https://$GO_MODULES_USER:$GO_MODULES_ACCESS_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
include:
- local: '/build/ci/.code-quality-ci.yml'
- local: '/build/ci/.security-and-compliance-ci.yml'
- local: '/build/ci/.build-container.yml'
- local: '/build/ci/.test.yml'
- local: '/build/ci/.terraform-ci.yml'
- local: '/build/ci/.deploy-k8s.yml'
\ No newline at end of file
- local: '/.gitlab/ci/.build-container.yml'
- local: '/.gitlab/ci/.code-quality-ci.yml'
- local: '/.gitlab/ci/.security-and-compliance-ci.yml'
- local: '/.gitlab/ci/.test.yml'
- local: '/.gitlab/ci/.containerlab-ci.yml'
- local: '/.gitlab/ci/.integration-test.yml'
- local: '/.gitlab/ci/.uml-autogen-ci.yml'
- local: '/.gitlab/ci/.build-release.yml'
.build: &build
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [ "" ]
variables:
TAG: $CI_COMMIT_BRANCH
before_script:
# replace all slashes in the tag with hyphen, because slashes are not allowed in tags
- TAG=${TAG//\//-}
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"username\":\"$CI_DEPENDENCY_PROXY_USER\",\"password\":\"$CI_DEPENDENCY_PROXY_TOKEN\"}}}" > /kaniko/.docker/config.json
needs: []
build-testing-image:
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
variables:
TAG: latest
- if: $CI_COMMIT_BRANCH == "develop"
variables:
TAG: $CI_COMMIT_BRANCH
BUILDARGS: -race
- when: always
script:
- /kaniko/executor
--cache=true
--context "$CI_PROJECT_DIR"
--dockerfile "Dockerfile"
--build-arg "GOLANG_VERSION=$GOLANG_VERSION"
--build-arg "BUILDARGS=$BUILDARGS"
--build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
--destination "$GOSDN_TESTING_IMAGE"
--target "installer"
<<: *build
build-image:
rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
variables:
TAG: $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_BRANCH == "develop"
variables:
TAG: develop
BUILDARGS: -race
- when: always
script:
- /kaniko/executor
--cache=true
--context "$CI_PROJECT_DIR"
--dockerfile "Dockerfile"
--build-arg "GOLANG_VERSION=$GOLANG_VERSION"
--build-arg "BUILDARGS=$BUILDARGS"
--build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
--destination "$GOSDN_IMAGE"
--destination "$CI_REGISTRY_IMAGE:$TAG"
<<: *build
.build-release-docker: &build-release-docker
stage: build-release
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [ "" ]
rules:
# TODO: Implement later when we need it
#- if: $CI_COMMIT_TAG =~ .+ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
# variables:
# TAG: $CI_COMMIT_TAG
# when: on_success
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
variables:
TAG: $CI_DEFAULT_BRANCH
when: on_success
- when: never
before_script:
# replace all slashes in the tag with hyphen, because slashes are not allowed in tags
- TAG=${TAG//\//-}
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"username\":\"$CI_DEPENDENCY_PROXY_USER\",\"password\":\"$CI_DEPENDENCY_PROXY_TOKEN\"}}}" > /kaniko/.docker/config.json
build-release-image:
script:
- /kaniko/executor
--cache=true
--context "$CI_PROJECT_DIR"
--dockerfile "Dockerfile"
--build-arg "GOLANG_VERSION=$GOLANG_VERSION"
--build-arg "BUILDARGS=$BUILDARGS"
--build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
--destination "$GOSDN_IMAGE"
--destination "$CI_REGISTRY_IMAGE:$TAG"
- /kaniko/executor
--cache=true
--context "$CI_PROJECT_DIR"
--dockerfile "Dockerfile"
--build-arg "GOLANG_VERSION=$GOLANG_VERSION"
--build-arg "BUILDARGS=$BUILDARGS"
--build-arg "GITLAB_PROXY=${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/"
--destination "$GOSDN_IMAGE"
--destination "$CI_REGISTRY_IMAGE:latest"
<<: *build-release-docker
.build-release-binary: &build-release-binary
stage: build-release
image:
name: ${GITLAB_PROXY}golang:$GOLANG_VERSION
rules:
# TODO: Implement later when we need it
#- if: $CI_COMMIT_TAG =~ .+ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
# variables:
# TAG: $CI_COMMIT_TAG
# when: on_success
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
variables:
TAG: $CI_DEFAULT_BRANCH
when: on_success
- if: $CI_COMMIT_BRANCH == "develop"
variables:
TAG: $CI_COMMIT_BRANCH
when: on_success
- when: never
build-release-linux:
script:
- GOOS=linux go build ./cmd/gosdn
- mv gosdn gosdn-$TAG
- 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file gosdn-$TAG "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/gosdn/$TAG/gosdn-$TAG-linux"'
artifacts:
paths:
- gosdn-$TAG
expire_in: 4 weeks
<<: *build-release-binary
build-release-freebsd:
script:
- GOOS=freebsd go build ./cmd/gosdn
- mv gosdn gosdn-$TAG
- - 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file gosdn-$TAG "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/gosdn/$TAG/gosdn-$TAG-freebsd"'
artifacts:
paths:
- gosdn-$TAG
expire_in: 4 weeks
<<: *build-release-binary
\ No newline at end of file
code-quality:
image: golangci/golangci-lint:latest-alpine
stage: test
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_COMMIT_BRANCH == "develop"
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/golangci/golangci-lint:v1.42-alpine
stage: analyze
script:
# writes golangci-lint output to gl-code-quality-report.json
- golangci-lint run --config build/ci/.golangci-config/.golangci.yml --out-format code-climate | tee gl-code-quality-report.json
- golangci-lint run --config .gitlab/ci/.golangci-config/.golangci.yml --out-format code-climate | tee gl-code-quality-report.json
artifacts:
reports:
codequality: gl-code-quality-report.json
paths:
- gl-code-quality-report.json
\ No newline at end of file
- gl-code-quality-report.json
needs: []
variables:
CLAB_DIR: "/mnt"
CLAB_NAME: "clab${CI_PIPELINE_IID}"
# Templates for Job Types
.containerlab_deploy: &containerlab_deploy
stage: apply
rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never
- when: on_success
tags:
- shell
before_script:
- cd ${CLAB_DIR}
- export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts"
- echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
- echo ${GOSDN_IMAGE}
- docker pull ${GOSDN_IMAGE}
- docker pull ${CEOS_IMAGE}
.containerlab_template: &containerlab_template
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/alpine:latest
stage: build
rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never
- when: on_success
before_script:
- export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts"
- firstOctet=$(generate_octet.sh $CI_COMMIT_SHA)
- secondOctet=$(generate_octet.sh $CI_PIPELINE_ID)
- export CLAB_MGMT_SUBNET="172.$firstOctet.$secondOctet.0/24"
script:
- |
sed -e "s|@@CEOS_CONTAINER_IMAGE@@|${CEOS_IMAGE}|g" \
-e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_IMAGE}|g" \
-e "s|@@CLAB_NAME@@|${CLAB_NAME}|g" \
-e "s|@@CLAB_MGMT_SUBNET@@|${CLAB_MGMT_SUBNET}|g" \
${CLAB_TEMPLATE} > ${CLAB_NAME}.clab.yml
- cat ${CLAB_NAME}.clab.yml
artifacts:
name: ${CLAB_NAME}
paths:
- ${CLAB_NAME}.clab.yml
# JOBS
containerlab:template:integration:
extends: .containerlab_template
variables:
CLAB_TEMPLATE: "${CI_PROJECT_DIR}/test/containerlab/int01.clab.tmpl.yml"
containerlab:deploy:integration:
extends: .containerlab_deploy
needs: ["containerlab:template:integration", "build-image"]
script:
- sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure
- |
echo -e "\
GOSDN_HTTP_PORT=$(docker_host_port 8080 clab-${CLAB_NAME}-gosdn)\n\
GOSDN_GRPC_PORT=$(docker_host_port 55055 clab-${CLAB_NAME}-gosdn)\n\
CEOS1_PORT=$(docker_host_port 6030 clab-${CLAB_NAME}-ceos1)" \
> ${CI_PROJECT_DIR}/build.env
- cat ${CI_PROJECT_DIR}/build.env
artifacts:
reports:
dotenv: ${CI_PROJECT_DIR}/build.env
containerlab:destroy:
rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never
- when: always
stage: .post
tags:
- shell
needs: ["containerlab:deploy:integration", "integration-test:nucleus", "integration-test:api", "containerlab:template:integration"]
before_script:
- cd ${CLAB_DIR}
script:
- sudo containerlab destroy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml
- docker volume rm -f ${CLAB_NAME}-volume
- docker image rm -f ${GOSDN_IMAGE}
allow_failure: true
#containerlab:template:develop:
# extends: .containerlab_template
# variables:
# CLAB_NAME: "dev"
# CLAB_TEMPLATE: "${CI_PROJECT_DIR}/test/containerlab/dev.clab.tmpl.yml"
# GOSDN_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE:develop"
# rules:
# - if: $CI_COMMIT_BRANCH == 'develop' && $CI_NIGHTLY == null
#
#
#containerlab:deploy:develop:
# extends:
# - .containerlab_deploy
# needs: ["containerlab:template:develop", "build-image"]
# variables:
# CLAB_NAME: "dev"
# GOSDN_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE:develop"
# script:
# - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure
# rules:
# - if: $CI_COMMIT_BRANCH == 'develop' && $CI_NIGHTLY == null
containerlab:clean:
stage: .post
tags:
- shell
before_script:
- cd ${CLAB_DIR}
script:
- docker kill $(docker ps -q) || true
- docker rm $(docker ps -a -q) || true
- docker rmi $(docker images | grep 'registry.code.fbi.h-da.de/danet/gosdn ' | awk '{print $3}') || true
- sudo rm -rf ${CLAB_DIR}/clab-* || true
- sudo sed -i 's|.*clab.*||g' /etc/hosts
allow_failure: true
rules:
- if: $CI_SCHEDULE_CLEAN
when: always
build:k8s-bot:
stage: build
image: golang:1.16
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/golang:$GOLANG_VERSION
rules:
- if: $CI_COMMIT_BRANCH == "develop"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- cd build/cd
- go build -o k8s-bot
......@@ -14,7 +13,9 @@ build:k8s-bot:
- build/cd/k8s-bot
.deploy: &deploy
image: bitnami/kubectl:latest
image:
name: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/bitnami/kubectl:latest
entrypoint: [""]
before_script:
- echo "override global before script"
variables:
......@@ -22,21 +23,11 @@ build:k8s-bot:
script:
- ./build/cd/k8s-bot
deploy:integration-test:
<<: *deploy
stage: apply
needs:
- job: "build:merge-request"
- job: "build:k8s-bot"
artifacts: true
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
deploy:develop:
<<: *deploy
stage: deploy
needs:
- job: "build:develop"
- job: "build-docker"
- job: "build:k8s-bot"
artifacts: true
rules:
......@@ -46,7 +37,7 @@ deploy:latest:
<<: *deploy
stage: deploy
needs:
- job: "build:latest"
- job: "build-docker"
- job: "build:k8s-bot"
artifacts: true
rules:
......@@ -56,7 +47,7 @@ deploy:nightly:mainline:
<<: *deploy
stage: deploy
needs:
- job: "build:latest"
- job: "build-docker"
- job: "build:k8s-bot"
artifacts: true
rules:
......@@ -66,23 +57,8 @@ deploy:nightly:develop:
<<: *deploy
stage: deploy
needs:
- job: "build:latest"
- job: "build-docker"
- job: "build:k8s-bot"
artifacts: true
rules:
- if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == "mainline"
destroy:k8s:
image: bitnami/kubectl:latest
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: always
before_script:
- echo "override global before script"
stage: .post
variables:
K8S_OP: "delete"
script:
- ./build/cd/k8s-bot
dependencies:
- build:k8s-bot
\ No newline at end of file
run:
timeout: 5m
timeout: 10m
issues-exit-code: 1
# directories to be ignored by linters
skip-dirs:
......@@ -7,7 +7,7 @@ run:
- test
skip-dirs-default: true
skip-files:
- nucleus/http.go
- http.go
# output settings -> code-climate for GitLab
output:
format: code-climate
......@@ -26,8 +26,15 @@ linters:
disable-all: true
enable:
- gofmt
- golint
- goimports
- gocyclo
- govet
- unused
- staticcheck
- typecheck
- revive
- whitespace
issues:
exclude-use-default: false
max-issues-per-linter: 0
max-same-issues: 0
.integration-test: &integration-test
image: $GOSDN_TESTING_IMAGE
stage: integration-test
rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never
- when: on_success
needs:
- job: "containerlab:deploy:integration"
tags:
- integration-test-docker
variables:
GOSDN_LOG: "nolog"
GOSDN_TEST_API_ENDPOINT: "141.100.70.178:${GOSDN_GRPC_PORT}"
CEOS_TEST_ENDPOINT: "141.100.70.178:${CEOS1_PORT}"
GOSDN_TEST_USER: "admin"
GOSDN_TEST_PASSWORD: "admin"
integration-test:nucleus:
<<: *integration-test
script:
- ${CI_PROJECT_DIR}/.gitlab/ci/scripts/wait-for-it.sh ${CEOS_TEST_ENDPOINT} -s -t 180 -- echo "CEOS is up"
- cd ./test/integration
- go test -race -v -run TestGnmi_SetIntegration
- go test -race -v -run TestGnmi_GetIntegration
- go test -race -v -run TestGnmi_SubscribeIntegration
- go test -race -v -run TestGnmi_CapabilitiesIntegration
integration-test:api:
<<: *integration-test
variables:
K8S_OP: "getenv"
script:
- cd ./api
- go test -race -v -run TestApiIntegration
.rules: &rules
stage: analyze
rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never
- when: always
needs: []
sast:
variables:
SAST_ANALYZER_IMAGE_TAG: '2'
SAST_EXCLUDED_PATHS: spec, test, tests, tmp
SEARCH_MAX_DEPTH: '4'
include:
- template: Security/SAST.gitlab-ci.yml
- template: Dependency-Scanning.gitlab-ci.yml
- template: Security/License-Scanning.gitlab-ci.yml
# - template: Security/Secret-Detection.gitlab-ci.yml
- template: Security/Container-Scanning.gitlab-ci.yml
gemnasium-dependency_scanning:
<<: *rules
gosec-sast:
<<: *rules
license_scanning:
<<: *rules
semgrep-sast:
<<: *rules
#secret_detection:
# <<: *rules
container_scanning:
stage: analyze
rules:
- if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
when: never
- when: always
variables:
DOCKER_IMAGE: "${GOSDN_IMAGE}"
DOCKER_USER: "${CI_REGISTRY_USER}"
DOCKER_PASSWORD: "${CI_REGISTRY_PASSWORD}"
needs:
- build-image
.test: &test
image: $GOSDN_TESTING_IMAGE
stage: test
rules:
- when: on_success
variables:
GOSDN_LOG: "nolog"
GOSDN_CHANGE_TIMEOUT: "100ms"
before_script:
- go get gotest.tools/gotestsum
artifacts:
when: always
reports:
junit: report.xml
needs:
- build-testing-image
unit-test:
script:
- gotestsum --junitfile report.xml --format testname -- -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out
after_script:
- go tool cover -func=coverage.out
<<: *test
controller-test:
script:
- gotestsum --junitfile report.xml --format testname -- -race -v -run TestRun
<<: *test
test-build:
artifacts:
when: never
script:
- GOOS=linux go build $BUILDARGS ./cmd/gosdn
<<: *test
goplantuml:
image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/golang:$GOLANG_VERSION
stage: .post
only:
- develop
when: manual
variables:
FILENAME: "home.md"
WIKI_URL: "${CI_SERVER_PROTOCOL}://project_${CI_PROJECT_ID}_bot3:${GOPLANTUML_TOKEN}@${CI_SERVER_HOST}:${CI_SERVER_PORT}/${CI_PROJECT_PATH}.wiki.git"
script:
# install goplantuml
- go get github.com/jfeliu007/goplantuml/cmd/goplantuml
# remove old wiki folder
- rm -rf "/tmp/${CI_PROJECT_NAME}.wiki"
# clone and move to wiki folder
- cd /tmp
- git clone "${WIKI_URL}"
- cd "${CI_PROJECT_NAME}.wiki"
- echo '```plantuml' > "$FILENAME"
# run goplantuml
- goplantuml "${CI_PROJECT_DIR}/nucleus/" >> "$FILENAME"
- echo '```' >> "$FILENAME"
# git commit
- git config user.name "$GITLAB_USER_NAME"
- git config user.email "$GITLAB_USER_EMAIL"
- git add "$FILENAME"
- git commit -m "Auto-updated UML diagram via goplantuml CI job"
- git push origin "HEAD:master"
#!/bin/sh
TEMPLATE="{{ (index (index .NetworkSettings.Ports \"${1}/tcp\") 0).HostPort }}"
docker inspect -f "${TEMPLATE}" ${2}
#!/bin/sh
input=$1
#trailing_backspace=$2
hashed_value=$(echo $input | sha256sum | awk '{print $1}' )
decimal_value=$((16#$hashed_value))
decimal_value=${decimal_value/-/}
octet=$(((decimal_value % 255)))
echo -n $octet
#!/usr/bin/env bash
# Use this script to test if a given TCP host/port are available
WAITFORIT_cmdname=${0##*/}
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
usage()
{
cat << USAGE >&2
Usage:
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
-h HOST | --host=HOST Host or IP under test
-p PORT | --port=PORT TCP port under test
Alternatively, you specify the host and port as host:port
-s | --strict Only execute subcommand if the test succeeds
-q | --quiet Don't output any status messages
-t TIMEOUT | --timeout=TIMEOUT
Timeout in seconds, zero for no timeout
-- COMMAND ARGS Execute command with args after the test finishes
USAGE
exit 1
}
wait_for()
{
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
else
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
fi
WAITFORIT_start_ts=$(date +%s)
while :
do
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
WAITFORIT_result=$?
else
(echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
WAITFORIT_result=$?
fi
if [[ $WAITFORIT_result -eq 0 ]]; then
WAITFORIT_end_ts=$(date +%s)
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
break
fi
sleep 1
done
return $WAITFORIT_result
}
wait_for_wrapper()
{
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
else
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
fi
WAITFORIT_PID=$!
trap "kill -INT -$WAITFORIT_PID" INT
wait $WAITFORIT_PID
WAITFORIT_RESULT=$?
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
fi
return $WAITFORIT_RESULT
}
# process arguments
while [[ $# -gt 0 ]]
do
case "$1" in
*:* )
WAITFORIT_hostport=(${1//:/ })
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
shift 1
;;
--child)
WAITFORIT_CHILD=1
shift 1
;;
-q | --quiet)
WAITFORIT_QUIET=1
shift 1
;;
-s | --strict)
WAITFORIT_STRICT=1
shift 1
;;
-h)
WAITFORIT_HOST="$2"
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
shift 2
;;
--host=*)
WAITFORIT_HOST="${1#*=}"
shift 1
;;
-p)
WAITFORIT_PORT="$2"
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
shift 2
;;
--port=*)
WAITFORIT_PORT="${1#*=}"
shift 1
;;
-t)
WAITFORIT_TIMEOUT="$2"
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
shift 2
;;
--timeout=*)
WAITFORIT_TIMEOUT="${1#*=}"
shift 1
;;
--)
shift
WAITFORIT_CLI=("$@")
break
;;
--help)
usage
;;
*)
echoerr "Unknown argument: $1"
usage
;;
esac
done
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
echoerr "Error: you need to provide a host and port to test."
usage
fi
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
# Check to see if timeout is from busybox?
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
WAITFORIT_BUSYTIMEFLAG=""
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
WAITFORIT_ISBUSY=1
# Check if busybox timeout uses -t flag
# (recent Alpine versions don't support -t anymore)
if timeout &>/dev/stdout | grep -q -e '-t '; then
WAITFORIT_BUSYTIMEFLAG="-t"
fi
else
WAITFORIT_ISBUSY=0
fi
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
wait_for
WAITFORIT_RESULT=$?
exit $WAITFORIT_RESULT
else
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
wait_for_wrapper
WAITFORIT_RESULT=$?
else
wait_for
WAITFORIT_RESULT=$?
fi
fi
if [[ $WAITFORIT_CLI != "" ]]; then
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
exit $WAITFORIT_RESULT
fi
exec "${WAITFORIT_CLI[@]}"
else
exit $WAITFORIT_RESULT
fi
[submodule "documentation/manual"]
path = documentation/manual
url = https://git.overleaf.com/620142e0fbf7476b92f7240a
FROM golang:1.16-buster AS builder
ARG GITLAB_USER
ARG GITLAB_TOKEN
ARG GOLANG_VERSION=1.17
ARG BUILDARGS
ARG $GITLAB_PROXY
FROM ${GITLAB_PROXY}golang:$GOLANG_VERSION-buster AS installer
WORKDIR /src/gosdn
COPY . .
RUN apt-get update && apt-get install -y git
RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
COPY go.* ./
RUN go mod download
FROM installer as builder
COPY . ./
RUN GOOS=linux go build $BUILDARGS ./cmd/gosdn
FROM debian:latest
FROM ${GITLAB_PROXY}debian:bullseye
EXPOSE 8080
EXPOSE 55055
COPY --from=builder /src/gosdn/gosdn .
COPY --from=builder /src/gosdn/configs ./configs
COPY ./configs ./configs
ENTRYPOINT [ "./gosdn" ]
CMD [""]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment