From 9c8b3825be31236264407848b144e097b5935b98 Mon Sep 17 00:00:00 2001 From: Robert Parker Date: Wed, 12 Dec 2018 13:11:47 +0000 Subject: [PATCH] Add image tag into info output, add ability to print info output on demand and prevent multiple instances of runmqserver being run --- Dockerfile-server | 3 +- Makefile-UBUNTU | 3 +- cmd/runmqserver/main.go | 20 +++++++ cmd/runmqserver/process.go | 63 +++++++++++++++++++++ cmd/runmqserver/version.go | 7 +++ incubating/mqadvanced-server-dev/Dockerfile | 3 +- 6 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 cmd/runmqserver/process.go diff --git a/Dockerfile-server b/Dockerfile-server index ba81c0c..97d70e9 100644 --- a/Dockerfile-server +++ b/Dockerfile-server @@ -22,10 +22,11 @@ FROM $BUILDER_IMAGE as builder WORKDIR /go/src/github.com/ibm-messaging/mq-container/ ARG IMAGE_REVISION="Not specified" ARG IMAGE_SOURCE="Not specified" +ARG IMAGE_TAG="Not specified" COPY cmd/ ./cmd COPY internal/ ./internal COPY vendor/ ./vendor -RUN go build -ldflags "-X \"main.ImageCreated=$(date --iso-8601=seconds)\" -X \"main.ImageRevision=$IMAGE_REVISION\" -X \"main.ImageSource=$IMAGE_SOURCE\"" ./cmd/runmqserver/ +RUN go build -ldflags "-X \"main.ImageCreated=$(date --iso-8601=seconds)\" -X \"main.ImageRevision=$IMAGE_REVISION\" -X \"main.ImageSource=$IMAGE_SOURCE\" -X \"main.ImageTag=$IMAGE_TAG\"" ./cmd/runmqserver/ RUN go build ./cmd/chkmqready/ RUN go build ./cmd/chkmqhealthy/ # Run all unit tests diff --git a/Makefile-UBUNTU b/Makefile-UBUNTU index 71a76b1..0ca502e 100644 --- a/Makefile-UBUNTU +++ b/Makefile-UBUNTU @@ -205,6 +205,7 @@ define docker-build-mq --build-arg BUILDER_IMAGE=$(MQ_IMAGE_GOLANG_SDK) \ --build-arg IMAGE_REVISION="$(IMAGE_REVISION)" \ --build-arg IMAGE_SOURCE="$(IMAGE_SOURCE)" \ + --build-arg IMAGE_TAG="$1" \ --label IBM_PRODUCT_ID=$4 \ --label IBM_PRODUCT_NAME=$5 \ --label IBM_PRODUCT_VERSION=$6 \ @@ -236,7 +237,7 @@ build-devserver: MQ_SDK_ARCHIVE=$(MQ_ARCHIVE_DEV) build-devserver: downloads/$(MQ_ARCHIVE_DEV) docker-version build-golang-sdk-ex $(info $(shell printf $(TITLE)"Build $(MQ_IMAGE_DEVSERVER_BASE)"$(END))) $(call docker-build-mq,$(MQ_IMAGE_DEVSERVER_BASE),Dockerfile-server,$(MQ_ARCHIVE_DEV),"98102d16795c4263ad9ca075190a2d4d","IBM MQ Advanced for Developers (Non-Warranted)",$(MQ_VERSION)) - $(DOCKER) build --tag $(MQ_IMAGE_DEVSERVER) --build-arg IMAGE_SOURCE="$(IMAGE_SOURCE)" --build-arg IMAGE_REVISION="$(IMAGE_REVISION)" --build-arg BASE_IMAGE=$(MQ_IMAGE_DEVSERVER_BASE) --build-arg BUILDER_IMAGE=$(MQ_IMAGE_GOLANG_SDK) --file incubating/mqadvanced-server-dev/Dockerfile . + $(DOCKER) build --tag $(MQ_IMAGE_DEVSERVER) --build-arg IMAGE_SOURCE="$(IMAGE_SOURCE)" --build-arg IMAGE_REVISION="$(IMAGE_REVISION)" --build-arg IMAGE_TAG="$(MQ_IMAGE_DEVSERVER)" --build-arg BASE_IMAGE=$(MQ_IMAGE_DEVSERVER_BASE) --build-arg BUILDER_IMAGE=$(MQ_IMAGE_GOLANG_SDK) --file incubating/mqadvanced-server-dev/Dockerfile . .PHONY: build-advancedserver-cover build-advancedserver-cover: docker-version diff --git a/cmd/runmqserver/main.go b/cmd/runmqserver/main.go index 4df645b..01f00d5 100644 --- a/cmd/runmqserver/main.go +++ b/cmd/runmqserver/main.go @@ -20,6 +20,7 @@ package main import ( "context" "errors" + "flag" "os" "sync" @@ -29,12 +30,31 @@ import ( ) func doMain() error { + var infoFlag = flag.Bool("info", false, "Display debug info, then exit") + flag.Parse() + + // Configure the logger so we can output messages name, nameErr := name.GetQueueManagerName() mf, err := configureLogger(name) if err != nil { logTermination(err) return err } + + // Check whether they only want debug info + if *infoFlag { + logVersionInfo() + logConfig() + return nil + } + + err = verifySingleProcess() + if err != nil { + // We don't do the normal termination here as it would create a termination file. + log.Error(err) + return err + } + if nameErr != nil { logTermination(err) return err diff --git a/cmd/runmqserver/process.go b/cmd/runmqserver/process.go new file mode 100644 index 0000000..03d6c56 --- /dev/null +++ b/cmd/runmqserver/process.go @@ -0,0 +1,63 @@ +/* +© Copyright IBM Corporation 2018 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package main + +import ( + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/ibm-messaging/mq-container/internal/command" +) + +// Verifies that we are the main or only instance of this program +func verifySingleProcess() error { + programName, err := determineExecutable() + if err != nil { + return fmt.Errorf("Failed to determine name of this program - %v", err) + } + + // Verify that there is only one runmqserver + _, err = verifyOnlyOne(programName) + if err != nil { + return fmt.Errorf("You cannot run more than one instance of this program") + } + + return nil +} + +// Verifies that there is only one instance running of the given program name. +func verifyOnlyOne(programName string) (int, error) { + out, _, _ := command.Run("ps", "-e", "--format", "cmd") + //if this goes wrong then assume we are the only one + numOfProg := strings.Count(out, programName) + if numOfProg != 1 { + return numOfProg, fmt.Errorf("Expected there to be only 1 instance of %s but found %d", programName, numOfProg) + } + return numOfProg, nil +} + +// Determines the name of the currently running executable. +func determineExecutable() (string, error) { + file, err := os.Executable() + if err != nil { + return "", err + } + + _, exec := filepath.Split(file) + return exec, nil +} diff --git a/cmd/runmqserver/version.go b/cmd/runmqserver/version.go index 35af770..0142364 100644 --- a/cmd/runmqserver/version.go +++ b/cmd/runmqserver/version.go @@ -29,6 +29,8 @@ var ( ImageRevision = "Not specified" // ImageSource is the URL to get source code for building the image ImageSource = "Not specified" + // ImageTag is the tag of the image + ImageTag = "Not specified" ) func logDateStamp() { @@ -43,6 +45,10 @@ func logGitCommit() { log.Printf("Image source: %v", ImageSource) } +func logImageTag() { + log.Printf("Image tag: %v", ImageTag) +} + func logMQVersion() { mqVersion, _, err := command.Run("dspmqver", "-b", "-f", "2") if err != nil { @@ -67,5 +73,6 @@ func logVersionInfo() { logDateStamp() logGitRepo() logGitCommit() + logImageTag() logMQVersion() } diff --git a/incubating/mqadvanced-server-dev/Dockerfile b/incubating/mqadvanced-server-dev/Dockerfile index 148635a..2c996d8 100644 --- a/incubating/mqadvanced-server-dev/Dockerfile +++ b/incubating/mqadvanced-server-dev/Dockerfile @@ -21,12 +21,13 @@ ARG BUILDER_IMAGE=mq-golang-sdk:9.1.1.0-x86_64-ubuntu-16.04 FROM $BUILDER_IMAGE as builder ARG IMAGE_REVISION="Not specified" ARG IMAGE_SOURCE="Not specified" +ARG IMAGE_TAG="Not specified" WORKDIR /go/src/github.com/ibm-messaging/mq-container/ COPY cmd/ ./cmd COPY internal/ ./internal COPY vendor/ ./vendor # Re-build runmqserver, with code tagged with 'mqdev' enabled -RUN go build -ldflags "-X \"main.ImageCreated=$(date --iso-8601=seconds)\" -X \"main.ImageRevision=$IMAGE_REVISION\" -X \"main.ImageSource=$IMAGE_SOURCE\"" --tags 'mqdev' ./cmd/runmqserver +RUN go build -ldflags "-X \"main.ImageCreated=$(date --iso-8601=seconds)\" -X \"main.ImageRevision=$IMAGE_REVISION\" -X \"main.ImageSource=$IMAGE_SOURCE\" -X \"main.ImageTag=$IMAGE_TAG\"" --tags 'mqdev' ./cmd/runmqserver RUN go build ./cmd/runmqdevserver/ # Run all unit tests RUN go test -v ./cmd/runmqdevserver/...