diff --git a/build/ci/.build-container.yml b/build/ci/.build-container.yml index 3dcaaeec1eb75beeabfe3ef5f38d67fd304b280e..51e208283d1936345dddc03ed102a17fe7c1e63d 100644 --- a/build/ci/.build-container.yml +++ b/build/ci/.build-container.yml @@ -6,7 +6,7 @@ variables: DOCKER_TLS_CERTDIR: "/certs" DOCKER_IMAGE_SHA: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -.deploy: &deploy +.build: &build before_script: - echo "override global before script" image: docker:19.03.12 @@ -18,54 +18,31 @@ variables: docker build \ --build-arg GITLAB_USER=$GO_MODULES_USER \ --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN \ - -t $DOCKER_IMAGE_SHA . + -t $DOCKER_IMAGE_SHA $PATH - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - docker tag $DOCKER_IMAGE_SHA $TAG - docker push $TAG -deploy:develop: +build:develop: variables: TAG: $CI_REGISTRY_IMAGE:develop - HOOK: $PORTAINER_HOOK_DEVELOP + PATH: build/dockerfiles/staging rules: - if: $CI_COMMIT_BRANCH == "develop" - <<: *deploy + <<: *build -deploy:latest: +build:merge-request: variables: - TAG: $CI_REGISTRY_IMAGE:latest - HOOK: $PORTAINER_HOOK_LATEST - rules: - - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH - <<: *deploy - -.deploy:mr: &deploy-mr - before_script: - - echo "override global before script" - image: docker:19.03.12 - stage: build - tags: - - dind - script: - - > - docker build \ - --build-arg GITLAB_USER=$GO_MODULES_USER \ - --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN \ - -t $DOCKER_IMAGE_SHA . - - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY - - docker tag $DOCKER_IMAGE_SHA $TAG - - docker push $TAG - -deploy:merge-request:master: - variables: - TAG: $CI_REGISTRY_IMAGE:mr-master + TAG: $CI_REGISTRY_IMAGE:merge-request + PATH: build/dockerfiles/staging rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH - <<: *deploy-mr + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + <<: *build -deploy:merge-mr:develop: +build:latest: variables: - TAG: $CI_REGISTRY_IMAGE:mr-develop + TAG: $CI_REGISTRY_IMAGE:latest + PATH: build/dockerfiles/production rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop' - <<: *deploy-mr + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + <<: *build \ No newline at end of file diff --git a/build/ci/.terraform-ci.yml b/build/ci/.terraform-ci.yml index 5a025809c65770b8eb17328c796af1155eaa31db..014c4502bcfe6126d5b6476f916d2eefc23953dc 100644 --- a/build/ci/.terraform-ci.yml +++ b/build/ci/.terraform-ci.yml @@ -21,12 +21,9 @@ cache: - export TF_VAR_tls_cert=${DOCKER_TLS_CERT} - export TF_VAR_tls_ca_cert=${DOCKER_TLS_CA} rules: - - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH + - if: $CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop') variables: - TF_VAR_container_tag: $CI_REGISTRY_IMAGE:mr-master - - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop' - variables: - TF_VAR_container_tag: $CI_REGISTRY_IMAGE:mr-develop + TF_VAR_container_tag: $CI_REGISTRY_IMAGE:merge-request - if: $CI_COMMIT_BRANCH == "integration-test" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH diff --git a/build/dockerfiles/production/Dockerfile b/build/dockerfiles/production/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..4e90a5a77bc40d69b7d43366173e76c3d6a251ef --- /dev/null +++ b/build/dockerfiles/production/Dockerfile @@ -0,0 +1,18 @@ +FROM golang:1.15-alpine AS builder +ARG GITLAB_USER +ARG GITLAB_TOKEN +WORKDIR /src/gosdn +COPY . . +RUN apk add git +RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de" +RUN go mod download +RUN CGO_ENABLED=0 GOOS=linux go build ./cmd/gosdn + +FROM alpine:latest +EXPOSE 8443 +EXPOSE 55055 +COPY --from=builder /src/gosdn/gosdn . +COPY --from=builder /src/gosdn/configs ./configs + +ENTRYPOINT [ "./gosdn" ] +CMD [""] diff --git a/build/dockerfiles/staging/Dockerfile b/build/dockerfiles/staging/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..bb1503026edf39ef061288b7e60b2b5c68f5acea --- /dev/null +++ b/build/dockerfiles/staging/Dockerfile @@ -0,0 +1,18 @@ +FROM golang:1.15-alpine AS builder +ARG GITLAB_USER +ARG GITLAB_TOKEN +WORKDIR /src/gosdn +COPY . . +RUN apk add git +RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de" +RUN go mod download +RUN CGO_ENABLED=0 GOOS=linux go build -race ./cmd/gosdn + +FROM alpine:latest +EXPOSE 8443 +EXPOSE 55055 +COPY --from=builder /src/gosdn/gosdn . +COPY --from=builder /src/gosdn/configs ./configs + +ENTRYPOINT [ "./gosdn" ] +CMD [""] diff --git a/nucleus/controller.go b/nucleus/controller.go index bb928f4ae44ba399da1b7e3262e7700380eb546d..e8fb8413c499a85ae435c9c65a6c9474cf9f0cf5 100644 --- a/nucleus/controller.go +++ b/nucleus/controller.go @@ -47,19 +47,8 @@ func initialize() error { } // TODO: Start grpc listener here - if err := httpAPI(); err != nil { - return err - } - - attachDatabase() - - return nil -} -// deprecated -// attachDatabase connects to the database and passes the connection to the controller core -func attachDatabase() { - c.database = database.NewDatabaseClient() + return httpAPI() } // createSouthboundInterfaces initializes the controller with its supported SBIs @@ -87,9 +76,11 @@ func createPrincipalNetworkDomain(sbi SouthboundInterface) error { // Run calls initialize to start the controller func Run(ctx context.Context) error { var initError error + coreLock.Lock() coreOnce.Do(func() { initError = initialize() }) + coreLock.Unlock() if initError != nil { log.WithFields(log.Fields{}).Error(initError) return initError diff --git a/nucleus/http.go b/nucleus/http.go index 41fea9aaa78245df4bf991451beb65743dc5b127..c4419fb7906b1b0d094725cc122db3c47ee12c68 100644 --- a/nucleus/http.go +++ b/nucleus/http.go @@ -9,12 +9,9 @@ import ( log "github.com/sirupsen/logrus" "net/http" "net/url" - "sync" "time" ) -var httpOnce sync.Once - func stopHttpServer() error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -34,16 +31,11 @@ func registerHttpHandler() { } // deprecated -func httpAPI() (err error) { - coreLock.Lock() - defer coreLock.Unlock() - httpOnce.Do(registerHttpHandler) +func httpAPI() error { + registerHttpHandler() c.httpServer = &http.Server{Addr: ":8080"} go func() { - err = c.httpServer.ListenAndServe() - if err != nil { - return - } + log.Info(c.httpServer.ListenAndServe()) }() return nil } diff --git a/nucleus/inizalize_test.go b/nucleus/initialise_test.go similarity index 98% rename from nucleus/inizalize_test.go rename to nucleus/initialise_test.go index e551b4472352413e8af3cadb6dcabcef7ba9a3e5..16e0f2f02df749093da38d2278e787615ab1fcd8 100644 --- a/nucleus/inizalize_test.go +++ b/nucleus/initialise_test.go @@ -45,6 +45,12 @@ var gnmiAddress = "141.100.70.171:6030" // TODO: Move somewhere more sensible func TestMain(m *testing.M) { log.SetReportCaller(true) + + + if os.Getenv("GOSDN_LOG") == "nolog" { + log.SetLevel(log.PanicLevel) + } + gnmiMessages = map[string]pb.Message{ "../test/proto/cap-resp-arista-ceos": &gpb.CapabilityResponse{}, "../test/proto/req-full-node": &gpb.GetRequest{},