Compare commits
45 Commits
9.3.0.5-r1
...
9.3.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bcdd76cb55 | ||
|
|
b234eb33c8 | ||
|
|
a5f4bb624c | ||
|
|
a2f2c1fe3b | ||
|
|
ba59442c1c | ||
|
|
e0c3b36b61 | ||
|
|
4dbdc42ca5 | ||
|
|
4a9fd2965c | ||
|
|
ffd72e8b31 | ||
|
|
8182fc43ab | ||
|
|
63a05ad8e4 | ||
|
|
f6b1ff2afd | ||
|
|
8d996081cc | ||
|
|
15d21c594f | ||
|
|
bfd37e39c5 | ||
|
|
3adb91d9bb | ||
|
|
391f4b66d7 | ||
|
|
a8a281db5a | ||
|
|
05d63e3cbf | ||
|
|
467324dd26 | ||
|
|
8abe55b86c | ||
|
|
8db26ebbb0 | ||
|
|
34831f08a0 | ||
|
|
e9a3b79a90 | ||
|
|
c0a4fb9318 | ||
|
|
fb53af6e7b | ||
|
|
65a36fd896 | ||
|
|
b04ef21071 | ||
|
|
6acc28125f | ||
|
|
08c533ed99 | ||
|
|
45384755bb | ||
|
|
67b2a690c5 | ||
|
|
cdc2d0b16b | ||
|
|
4a66728b79 | ||
|
|
64e4976a43 | ||
|
|
1a45834865 | ||
|
|
2ff55a381b | ||
|
|
7c05f4cbcb | ||
|
|
6e10f3ba76 | ||
|
|
e7b641cb1b | ||
|
|
37187e5199 | ||
|
|
f86dcb1c36 | ||
|
|
ae82196402 | ||
|
|
bebb8e1559 | ||
|
|
a1eda64df3 |
30
.travis.yml
30
.travis.yml
@@ -18,14 +18,14 @@ sudo: required
|
|||||||
language: go
|
language: go
|
||||||
|
|
||||||
go:
|
go:
|
||||||
- "1.17.7"
|
- "1.17.12"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- docker
|
- docker
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- MAIN_BRANCH=private-master
|
- MAIN_BRANCH=v9.3.1
|
||||||
- TAGCACHE_FILE=tagcache
|
- TAGCACHE_FILE=tagcache
|
||||||
- RELEASE=r1
|
- RELEASE=r1
|
||||||
|
|
||||||
@@ -38,51 +38,51 @@ go_import_path: "github.com/ibm-messaging/mq-container"
|
|||||||
jobs:
|
jobs:
|
||||||
include:
|
include:
|
||||||
- stage: basic-build
|
- stage: basic-build
|
||||||
if: branch != private-master AND tag IS blank
|
if: branch != v9.3.1 AND tag IS blank
|
||||||
name: "Basic AMD64 build"
|
name: "Basic AMD64 build"
|
||||||
os: linux
|
os: linux
|
||||||
env:
|
env:
|
||||||
- MQ_ARCHIVE_REPOSITORY_DEV=$MQ_930_ARCHIVE_REPOSITORY_DEV_AMD64
|
- MQ_ARCHIVE_REPOSITORY_DEV=$MQ_931_ARCHIVE_REPOSITORY_DEV_AMD64
|
||||||
script: bash -e travis-build-scripts/run.sh
|
script: bash -e travis-build-scripts/run.sh
|
||||||
|
|
||||||
# CD Build
|
# CD Build
|
||||||
|
|
||||||
- stage: global-tag
|
- stage: global-tag
|
||||||
if: branch = private-master AND type != pull_request OR tag =~ ^release-candidate*
|
if: branch = v9.3.1 AND type != pull_request OR tag =~ ^release-candidate*
|
||||||
name: "Generate Global Tag"
|
name: "Generate Global Tag"
|
||||||
os: linux
|
os: linux
|
||||||
script: bash -e travis-build-scripts/global-tag.sh
|
script: bash -e travis-build-scripts/global-tag.sh
|
||||||
- stage: build
|
- stage: build
|
||||||
if: branch = private-master OR tag =~ ^release-candidate*
|
if: branch = v9.3.1 OR tag =~ ^release-candidate*
|
||||||
name: "Multi-Arch AMD64 build"
|
name: "Multi-Arch AMD64 build"
|
||||||
os: linux
|
os: linux
|
||||||
env:
|
env:
|
||||||
- BUILD_ALL=true
|
- BUILD_ALL=true
|
||||||
- MQ_ARCHIVE_REPOSITORY=$MQ_930_ARCHIVE_REPOSITORY_AMD64
|
- MQ_ARCHIVE_REPOSITORY=$MQ_931_ARCHIVE_REPOSITORY_AMD64
|
||||||
- MQ_ARCHIVE_REPOSITORY_DEV=$MQ_930_ARCHIVE_REPOSITORY_DEV_AMD64
|
- MQ_ARCHIVE_REPOSITORY_DEV=$MQ_931_ARCHIVE_REPOSITORY_DEV_AMD64
|
||||||
script: bash -e travis-build-scripts/run.sh
|
script: bash -e travis-build-scripts/run.sh
|
||||||
- stage: build
|
- stage: build
|
||||||
if: branch = private-master OR tag =~ ^release-candidate*
|
if: branch = v9.3.1 OR tag =~ ^release-candidate*
|
||||||
name: "Multi-Arch S390X build"
|
name: "Multi-Arch S390X build"
|
||||||
os: linux-s390
|
os: linux-s390
|
||||||
env:
|
env:
|
||||||
- BUILD_ALL=true
|
- BUILD_ALL=true
|
||||||
- TEST_OPTS_DOCKER="-run TestGoldenPathWithMetrics"
|
- TEST_OPTS_DOCKER="-run TestGoldenPathWithMetrics"
|
||||||
- MQ_ARCHIVE_REPOSITORY=$MQ_930_ARCHIVE_REPOSITORY_S390X
|
- MQ_ARCHIVE_REPOSITORY=$MQ_931_ARCHIVE_REPOSITORY_S390X
|
||||||
- MQ_ARCHIVE_REPOSITORY_DEV=$MQ_930_ARCHIVE_REPOSITORY_DEV_S390X
|
- MQ_ARCHIVE_REPOSITORY_DEV=$MQ_931_ARCHIVE_REPOSITORY_DEV_S390X
|
||||||
script: bash -e travis-build-scripts/run.sh
|
script: bash -e travis-build-scripts/run.sh
|
||||||
- stage: build
|
- stage: build
|
||||||
if: branch = private-master OR tag =~ ^release-candidate*
|
if: branch = v9.3.1 OR tag =~ ^release-candidate*
|
||||||
name: "Multi-Arch PPC64LE build"
|
name: "Multi-Arch PPC64LE build"
|
||||||
os: linux-ppc64le
|
os: linux-ppc64le
|
||||||
env:
|
env:
|
||||||
- BUILD_ALL=true
|
- BUILD_ALL=true
|
||||||
- TEST_OPTS_DOCKER="-run TestGoldenPathWithMetrics"
|
- TEST_OPTS_DOCKER="-run TestGoldenPathWithMetrics"
|
||||||
- MQ_ARCHIVE_REPOSITORY=$MQ_930_ARCHIVE_REPOSITORY_PPC64LE
|
- MQ_ARCHIVE_REPOSITORY=$MQ_931_ARCHIVE_REPOSITORY_PPC64LE
|
||||||
- MQ_ARCHIVE_REPOSITORY_DEV=$MQ_930_ARCHIVE_REPOSITORY_DEV_PPC64LE
|
- MQ_ARCHIVE_REPOSITORY_DEV=$MQ_931_ARCHIVE_REPOSITORY_DEV_PPC64LE
|
||||||
script: bash -e travis-build-scripts/run.sh
|
script: bash -e travis-build-scripts/run.sh
|
||||||
- stage: push-manifest
|
- stage: push-manifest
|
||||||
if: branch = private-master AND type != pull_request OR tag =~ ^release-candidate*
|
if: branch = v9.3.1 AND type != pull_request OR tag =~ ^release-candidate*
|
||||||
name: "Push Manifest-list to registry"
|
name: "Push Manifest-list to registry"
|
||||||
env:
|
env:
|
||||||
- PUSH_MANIFEST_ONLY=true
|
- PUSH_MANIFEST_ONLY=true
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
{
|
{
|
||||||
"settingsInheritedFrom": "whitesource-config/whitesource-config@master",
|
"settingsInheritedFrom": "whitesource-config/whitesource-config@master",
|
||||||
"scanSettings": {
|
"scanSettings": {
|
||||||
"baseBranches": ["private-master", "v9.2.0.x-eus", "v9.2.5"]
|
"baseBranches": ["private-master", "v9.2.0.x-eus", "v9.3.0.x"]
|
||||||
}
|
},
|
||||||
|
"issueSettings": {
|
||||||
|
"issueRepoName": "whitesource-scan-issues"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
12
CHANGELOG.md
12
CHANGELOG.md
@@ -1,5 +1,17 @@
|
|||||||
# Change log
|
# Change log
|
||||||
|
|
||||||
|
## 9.3.1.1 (2023-01)
|
||||||
|
|
||||||
|
* Updated to MQ version 9.3.1.1
|
||||||
|
|
||||||
|
## 9.3.1.0-r2 (2022-11)
|
||||||
|
|
||||||
|
* Queue manager attribute SSLKEYR is now set to blank instead of '/run/runmqserver/tls/key' if key and certificate are not supplied.
|
||||||
|
|
||||||
|
## 9.3.1.0 (2022-10)
|
||||||
|
|
||||||
|
* Updated to MQ version 9.3.1.0
|
||||||
|
|
||||||
## 9.3.0.0 (2022-06)
|
## 9.3.0.0 (2022-06)
|
||||||
|
|
||||||
* Updated to MQ version 9.3.0.0
|
* Updated to MQ version 9.3.0.0
|
||||||
|
|||||||
@@ -13,11 +13,11 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
ARG BASE_IMAGE=registry.access.redhat.com/ubi8/ubi-minimal
|
ARG BASE_IMAGE=registry.access.redhat.com/ubi8/ubi-minimal
|
||||||
ARG BASE_TAG=8.6-751.1655117800
|
ARG BASE_TAG=8.7-1031
|
||||||
ARG BUILDER_IMAGE=registry.access.redhat.com/ubi8/go-toolset
|
ARG BUILDER_IMAGE=registry.access.redhat.com/ubi8/go-toolset
|
||||||
ARG BUILDER_TAG=1.17.7-13.1655148239
|
ARG BUILDER_TAG=1.17.12-11
|
||||||
ARG GO_WORKDIR=/opt/app-root/src/go/src/github.com/ibm-messaging/mq-container
|
ARG GO_WORKDIR=/opt/app-root/src/go/src/github.com/ibm-messaging/mq-container
|
||||||
ARG MQ_URL="https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/9.3.0.0-IBM-MQ-Advanced-for-Developers-Non-Install-LinuxX64.tar.gz"
|
ARG MQ_URL="https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/9.3.1.1-IBM-MQ-Advanced-for-Developers-Non-Install-LinuxX64.tar.gz"
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Build stage to build Go code
|
# Build stage to build Go code
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|||||||
61
Makefile
61
Makefile
@@ -18,7 +18,15 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
include config.env
|
include config.env
|
||||||
|
include source-branch.env
|
||||||
|
|
||||||
|
# arch_uname is the platform architecture according to the uname program. Can be differ by OS, e.g. `arm64` on macOS, but `aarch64` on Linux.
|
||||||
|
arch_uname := $(shell uname -m)
|
||||||
|
# arch_go is the platform architecture in Go-style (e.g. amd64, ppc64le, s390x or arm64).
|
||||||
|
arch_go := $(if $(findstring x86_64,$(arch_uname)),amd64,$(if $(findstring aarch64,$(arch_uname)),arm64,$(arch_uname)))
|
||||||
|
# ARCH is the platform architecture in Go-style (e.g. amd64, ppc64le, s390x or arm64).
|
||||||
|
# Override this to build an image for a different architecture. Note that RUN instructions will not be able to succeed without the help of emulation provided by packages like qemu-user-static.
|
||||||
|
ARCH ?= $(arch_go)
|
||||||
# RELEASE shows what release of the container code has been built
|
# RELEASE shows what release of the container code has been built
|
||||||
RELEASE ?=
|
RELEASE ?=
|
||||||
# MQ_ARCHIVE_REPOSITORY is a remote repository from which to pull the MQ_ARCHIVE (if required)
|
# MQ_ARCHIVE_REPOSITORY is a remote repository from which to pull the MQ_ARCHIVE (if required)
|
||||||
@@ -59,8 +67,6 @@ MQ_DELIVERY_REGISTRY_NAMESPACE ?=
|
|||||||
MQ_DELIVERY_REGISTRY_USER ?=
|
MQ_DELIVERY_REGISTRY_USER ?=
|
||||||
# MQ_DELIVERY_REGISTRY_CREDENTIAL is the password/API key for the remote registry (if required)
|
# MQ_DELIVERY_REGISTRY_CREDENTIAL is the password/API key for the remote registry (if required)
|
||||||
MQ_DELIVERY_REGISTRY_CREDENTIAL ?=
|
MQ_DELIVERY_REGISTRY_CREDENTIAL ?=
|
||||||
# ARCH is the platform architecture (e.g. amd64, ppc64le or s390x)
|
|
||||||
ARCH ?= $(if $(findstring x86_64,$(shell uname -m)),amd64,$(shell uname -m))
|
|
||||||
# LTS is a boolean value to enable/disable LTS container build
|
# LTS is a boolean value to enable/disable LTS container build
|
||||||
LTS ?= false
|
LTS ?= false
|
||||||
# VOLUME_MOUNT_OPTIONS is used when bind-mounting files from the "downloads" directory into the container. By default, SELinux labels are automatically re-written, but this doesn't work on some filesystems with extended attributes (xattrs). You can turn off the label re-writing by setting this variable to be blank.
|
# VOLUME_MOUNT_OPTIONS is used when bind-mounting files from the "downloads" directory into the container. By default, SELinux labels are automatically re-written, but this doesn't work on some filesystems with extended attributes (xattrs). You can turn off the label re-writing by setting this variable to be blank.
|
||||||
@@ -107,12 +113,22 @@ endif
|
|||||||
|
|
||||||
# Try to figure out which archive to use from the architecture
|
# Try to figure out which archive to use from the architecture
|
||||||
ifeq "$(ARCH)" "amd64"
|
ifeq "$(ARCH)" "amd64"
|
||||||
MQ_ARCHIVE_ARCH=X86-64
|
MQ_ARCHIVE_ARCH:=X86-64
|
||||||
MQ_ARCHIVE_DEV_ARCH=X64
|
MQ_ARCHIVE_DEV_ARCH:=X64
|
||||||
else ifeq "$(ARCH)" "ppc64le"
|
else ifeq "$(ARCH)" "ppc64le"
|
||||||
MQ_ARCHIVE_ARCH=PPC64LE
|
MQ_ARCHIVE_ARCH:=PPC64LE
|
||||||
|
MQ_ARCHIVE_DEV_ARCH:=PPC64LE
|
||||||
else ifeq "$(ARCH)" "s390x"
|
else ifeq "$(ARCH)" "s390x"
|
||||||
MQ_ARCHIVE_ARCH=S390X
|
MQ_ARCHIVE_ARCH:=S390X
|
||||||
|
MQ_ARCHIVE_DEV_ARCH:=S390X
|
||||||
|
else ifeq "$(ARCH)" "arm64"
|
||||||
|
MQ_ARCHIVE_ARCH:=ARM64
|
||||||
|
MQ_ARCHIVE_DEV_ARCH:=ARM64
|
||||||
|
endif
|
||||||
|
|
||||||
|
# If this is a fake master build, push images to alternative location (pipeline wont consider these images GA candidates)
|
||||||
|
ifeq ($(shell [ "$(TRAVIS)" = "true" ] && [ -n "$(MAIN_BRANCH)" ] && [ -n "$(SOURCE_BRANCH)" ] && [ "$(MAIN_BRANCH)" != "$(SOURCE_BRANCH)" ] && echo "true"), true)
|
||||||
|
MQ_DELIVERY_REGISTRY_NAMESPACE="master-fake"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# LTS_TAG is the tag modifier for an LTS container build
|
# LTS_TAG is the tag modifier for an LTS container build
|
||||||
@@ -162,6 +178,13 @@ ifeq ($(shell [ ! -z $(TRAVIS) ] && [ "$(TRAVIS_PULL_REQUEST)" = "false" ] && [
|
|||||||
MQ_MANIFEST_TAG_SUFFIX=.$(TIMESTAMPFLAT).$(GIT_COMMIT)
|
MQ_MANIFEST_TAG_SUFFIX=.$(TIMESTAMPFLAT).$(GIT_COMMIT)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# Make sure we don't use VOLUME_MOUNT_OPTIONS for Podman on macOS
|
||||||
|
ifeq "$(COMMAND)" "podman"
|
||||||
|
ifeq "$(shell uname -s)" "Darwin"
|
||||||
|
VOLUME_MOUNT_OPTIONS:=
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
PATH_TO_MQ_TAG_CACHE=$(TRAVIS_BUILD_DIR)/.tagcache
|
PATH_TO_MQ_TAG_CACHE=$(TRAVIS_BUILD_DIR)/.tagcache
|
||||||
ifneq "$(TRAVIS)" "$(EMPTY)"
|
ifneq "$(TRAVIS)" "$(EMPTY)"
|
||||||
ifneq ("$(wildcard $(PATH_TO_MQ_TAG_CACHE))","")
|
ifneq ("$(wildcard $(PATH_TO_MQ_TAG_CACHE))","")
|
||||||
@@ -281,7 +304,7 @@ build-devjmstest:
|
|||||||
test-devserver: test/docker/vendor
|
test-devserver: test/docker/vendor
|
||||||
$(info $(SPACER)$(shell printf $(TITLE)"Test $(MQ_IMAGE_DEVSERVER):$(MQ_TAG) on $(shell $(COMMAND) --version)"$(END)))
|
$(info $(SPACER)$(shell printf $(TITLE)"Test $(MQ_IMAGE_DEVSERVER):$(MQ_TAG) on $(shell $(COMMAND) --version)"$(END)))
|
||||||
$(COMMAND) inspect $(MQ_IMAGE_DEVSERVER):$(MQ_TAG)
|
$(COMMAND) inspect $(MQ_IMAGE_DEVSERVER):$(MQ_TAG)
|
||||||
cd test/docker && TEST_IMAGE=$(MQ_IMAGE_DEVSERVER):$(MQ_TAG) EXPECTED_LICENSE=Developer DEV_JMS_IMAGE=$(DEV_JMS_IMAGE) IBMJRE=true DOCKER_API_VERSION=$(DOCKER_API_VERSION) go test -parallel $(NUM_CPU) -timeout $(TEST_TIMEOUT_DOCKER) -tags mqdev $(TEST_OPTS_DOCKER)
|
cd test/docker && TEST_IMAGE=$(MQ_IMAGE_DEVSERVER):$(MQ_TAG) EXPECTED_LICENSE=Developer DEV_JMS_IMAGE=$(DEV_JMS_IMAGE) IBMJRE=false DOCKER_API_VERSION=$(DOCKER_API_VERSION) go test -parallel $(NUM_CPU) -timeout $(TEST_TIMEOUT_DOCKER) -tags mqdev $(TEST_OPTS_DOCKER)
|
||||||
|
|
||||||
.PHONY: coverage
|
.PHONY: coverage
|
||||||
coverage:
|
coverage:
|
||||||
@@ -316,6 +339,7 @@ test-advancedserver-cover: test/docker/vendor coverage
|
|||||||
|
|
||||||
# Command to build the image
|
# Command to build the image
|
||||||
# Args: imageName, imageTag, dockerfile, extraArgs, dockerfileTarget
|
# Args: imageName, imageTag, dockerfile, extraArgs, dockerfileTarget
|
||||||
|
# If the ARCH variable has been changed from the default value (arch_go variable), then the `--platform` parameter is added
|
||||||
define build-mq-command
|
define build-mq-command
|
||||||
$(COMMAND) build \
|
$(COMMAND) build \
|
||||||
--tag $1:$2 \
|
--tag $1:$2 \
|
||||||
@@ -332,6 +356,7 @@ define build-mq-command
|
|||||||
--label vcs-ref=$(IMAGE_REVISION) \
|
--label vcs-ref=$(IMAGE_REVISION) \
|
||||||
--label vcs-type=git \
|
--label vcs-type=git \
|
||||||
--label vcs-url=$(IMAGE_SOURCE) \
|
--label vcs-url=$(IMAGE_SOURCE) \
|
||||||
|
$(if $(findstring $(arch_go),$(ARCH)),,--platform=linux/$(ARCH)) \
|
||||||
$(EXTRA_LABELS) \
|
$(EXTRA_LABELS) \
|
||||||
--target $5 \
|
--target $5 \
|
||||||
.
|
.
|
||||||
@@ -364,13 +389,6 @@ define build-mq-docker
|
|||||||
$(call build-mq-using-web-server,$1,$2,$3,$4,$5)
|
$(call build-mq-using-web-server,$1,$2,$3,$4,$5)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# Make sure we don't use VOLUME_MOUNT_OPTIONS for Podman on macOS
|
|
||||||
ifeq "$(COMMAND)" "podman"
|
|
||||||
ifeq "$(shell uname -s)" "Darwin"
|
|
||||||
VOLUME_MOUNT_OPTIONS:=
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# When building with Podman on macOS (Darwin), use the web server build because you can't use bind-mounted volumes with `podman build` on macOS
|
# When building with Podman on macOS (Darwin), use the web server build because you can't use bind-mounted volumes with `podman build` on macOS
|
||||||
# Args: imageName, imageTag, dockerfile, mqArchive, dockerfileTarget
|
# Args: imageName, imageTag, dockerfile, mqArchive, dockerfileTarget
|
||||||
define build-mq-podman-Darwin
|
define build-mq-podman-Darwin
|
||||||
@@ -433,9 +451,12 @@ build-sdk: downloads/$(MQ_ARCHIVE_DEV)
|
|||||||
.PHONY: log-build-env
|
.PHONY: log-build-env
|
||||||
log-build-vars:
|
log-build-vars:
|
||||||
$(info $(SPACER)$(shell printf $(TITLE)"Build environment"$(END)))
|
$(info $(SPACER)$(shell printf $(TITLE)"Build environment"$(END)))
|
||||||
@echo ARCH=$(ARCH)
|
@echo arch_uname=$(arch_uname)
|
||||||
@echo MQ_VERSION=$(MQ_VERSION)
|
@echo arch_go=$(arch_go)
|
||||||
@echo MQ_ARCHIVE=$(MQ_ARCHIVE)
|
@echo "ARCH=$(ARCH) (origin:$(origin ARCH))"
|
||||||
|
@echo MQ_VERSION="$(MQ_VERSION) (origin:$(origin MQ_VERSION))"
|
||||||
|
@echo MQ_ARCHIVE="$(MQ_ARCHIVE) (origin:$(origin MQ_ARCHIVE))"
|
||||||
|
@echo MQ_ARCHIVE_DEV_ARCH=$(MQ_ARCHIVE_DEV_ARCH)
|
||||||
@echo MQ_ARCHIVE_DEV=$(MQ_ARCHIVE_DEV)
|
@echo MQ_ARCHIVE_DEV=$(MQ_ARCHIVE_DEV)
|
||||||
@echo MQ_IMAGE_DEVSERVER=$(MQ_IMAGE_DEVSERVER)
|
@echo MQ_IMAGE_DEVSERVER=$(MQ_IMAGE_DEVSERVER)
|
||||||
@echo MQ_IMAGE_ADVANCEDSERVER=$(MQ_IMAGE_ADVANCEDSERVER)
|
@echo MQ_IMAGE_ADVANCEDSERVER=$(MQ_IMAGE_ADVANCEDSERVER)
|
||||||
@@ -462,6 +483,9 @@ pull-mq-archive-dev:
|
|||||||
|
|
||||||
.PHONY: push-advancedserver
|
.PHONY: push-advancedserver
|
||||||
push-advancedserver:
|
push-advancedserver:
|
||||||
|
@if [ $(MQ_DELIVERY_REGISTRY_NAMESPACE) = "master-fake" ]; then\
|
||||||
|
echo "Detected fake master build. Note that the push destination is set to the fake master namespace: $(MQ_DELIVERY_REGISTRY_FULL_PATH)";\
|
||||||
|
fi
|
||||||
$(info $(SPACER)$(shell printf $(TITLE)"Push production image to $(MQ_DELIVERY_REGISTRY_FULL_PATH)"$(END)))
|
$(info $(SPACER)$(shell printf $(TITLE)"Push production image to $(MQ_DELIVERY_REGISTRY_FULL_PATH)"$(END)))
|
||||||
$(COMMAND) login $(MQ_DELIVERY_REGISTRY_HOSTNAME) -u $(MQ_DELIVERY_REGISTRY_USER) -p $(MQ_DELIVERY_REGISTRY_CREDENTIAL)
|
$(COMMAND) login $(MQ_DELIVERY_REGISTRY_HOSTNAME) -u $(MQ_DELIVERY_REGISTRY_USER) -p $(MQ_DELIVERY_REGISTRY_CREDENTIAL)
|
||||||
$(COMMAND) tag $(MQ_IMAGE_ADVANCEDSERVER)\:$(MQ_TAG) $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_FULL_RELEASE_NAME)
|
$(COMMAND) tag $(MQ_IMAGE_ADVANCEDSERVER)\:$(MQ_TAG) $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_FULL_RELEASE_NAME)
|
||||||
@@ -469,6 +493,9 @@ push-advancedserver:
|
|||||||
|
|
||||||
.PHONY: push-devserver
|
.PHONY: push-devserver
|
||||||
push-devserver:
|
push-devserver:
|
||||||
|
@if [ $(MQ_DELIVERY_REGISTRY_NAMESPACE) = "master-fake" ]; then\
|
||||||
|
echo "Detected fake master build. Note that the push destination is set to the fake master namespace: $(MQ_DELIVERY_REGISTRY_FULL_PATH)";\
|
||||||
|
fi
|
||||||
$(info $(SPACER)$(shell printf $(TITLE)"Push developer image to $(MQ_DELIVERY_REGISTRY_FULL_PATH)"$(END)))
|
$(info $(SPACER)$(shell printf $(TITLE)"Push developer image to $(MQ_DELIVERY_REGISTRY_FULL_PATH)"$(END)))
|
||||||
$(COMMAND) login $(MQ_DELIVERY_REGISTRY_HOSTNAME) -u $(MQ_DELIVERY_REGISTRY_USER) -p $(MQ_DELIVERY_REGISTRY_CREDENTIAL)
|
$(COMMAND) login $(MQ_DELIVERY_REGISTRY_HOSTNAME) -u $(MQ_DELIVERY_REGISTRY_USER) -p $(MQ_DELIVERY_REGISTRY_CREDENTIAL)
|
||||||
$(COMMAND) tag $(MQ_IMAGE_DEVSERVER)\:$(MQ_TAG) $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEV_FULL_RELEASE_NAME)
|
$(COMMAND) tag $(MQ_IMAGE_DEVSERVER)\:$(MQ_TAG) $(MQ_DELIVERY_REGISTRY_FULL_PATH)/$(MQ_IMAGE_DEV_FULL_RELEASE_NAME)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# © Copyright IBM Corporation 2017, 2020
|
# © Copyright IBM Corporation 2017, 2022
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@@ -20,19 +20,31 @@
|
|||||||
|
|
||||||
SRC_DIR = src
|
SRC_DIR = src
|
||||||
BUILD_DIR = ./build
|
BUILD_DIR = ./build
|
||||||
|
ARCH ?= $(if $(findstring x86_64,$(shell uname -m)),amd64,$(if $(findstring aarch64,$(shell uname -m)),aarch64,$(shell uname -m)))
|
||||||
|
|
||||||
# Flags passed to the C compiler. Need to use gnu11 to get POSIX functions needed for file locking.
|
# Flags passed to the C compiler. Need to use gnu11 to get POSIX functions needed for file locking.
|
||||||
CFLAGS += -std=gnu11 -fPIC -Wall -m64
|
CFLAGS.amd64 := -m64
|
||||||
|
CFLAGS.ppc64le := -m64
|
||||||
|
CFLAGS.s390x := -m64
|
||||||
|
# -m64 is not a valid compiler option on aarch64/arm64 (ARM)
|
||||||
|
CFLAGS.arm64 :=
|
||||||
|
CFLAGS += -std=gnu11 -fPIC -Wall ${CFLAGS.${ARCH}}
|
||||||
|
|
||||||
LIB_APR = -L/usr/lib64 -lapr-1 -laprutil-1
|
LIB_APR = -L/usr/lib64 -lapr-1 -laprutil-1
|
||||||
LIB_MQ = -L/opt/mqm/lib64 -lmqm_r
|
LIB_MQ = -L/opt/mqm/lib64 -lmqm_r
|
||||||
|
|
||||||
all: $(BUILD_DIR)/mqhtpass.so $(BUILD_DIR)/htpass_test
|
all: $(BUILD_DIR)/mqhtpass.so $(BUILD_DIR)/htpass_test $(BUILD_DIR)/log_test
|
||||||
|
|
||||||
$(BUILD_DIR)/log.o : $(SRC_DIR)/log.c $(SRC_DIR)/log.h
|
$(BUILD_DIR)/log.o : $(SRC_DIR)/log.c $(SRC_DIR)/log.h
|
||||||
mkdir -p ${dir $@}
|
mkdir -p ${dir $@}
|
||||||
gcc $(CFLAGS) -c $(SRC_DIR)/log.c -o $@
|
gcc $(CFLAGS) -c $(SRC_DIR)/log.c -o $@
|
||||||
|
|
||||||
|
$(BUILD_DIR)/log_test : $(BUILD_DIR)/log.o
|
||||||
|
mkdir -p ${dir $@}
|
||||||
|
gcc $(CFLAGS) $(SRC_DIR)/log_test.c $^ -o $@
|
||||||
|
# Run Logging tests, and print log if they fail
|
||||||
|
$@ || (cat log_test*.log && exit 1)
|
||||||
|
|
||||||
$(BUILD_DIR)/htpass.o : $(SRC_DIR)/htpass.c $(SRC_DIR)/htpass.h
|
$(BUILD_DIR)/htpass.o : $(SRC_DIR)/htpass.c $(SRC_DIR)/htpass.h
|
||||||
mkdir -p ${dir $@}
|
mkdir -p ${dir $@}
|
||||||
gcc $(CFLAGS) -c $(SRC_DIR)/htpass.c -I /usr/include/apr-1 -o $@
|
gcc $(CFLAGS) -c $(SRC_DIR)/htpass.c -I /usr/include/apr-1 -o $@
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2021
|
© Copyright IBM Corporation 2021, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -124,7 +124,7 @@ void log_printf(const char *source_file, int source_line, const char *level, con
|
|||||||
if (strftime(date_buf, sizeof date_buf, "%FT%T", utc))
|
if (strftime(date_buf, sizeof date_buf, "%FT%T", utc))
|
||||||
{
|
{
|
||||||
// Round microseconds down to milliseconds, for consistency
|
// Round microseconds down to milliseconds, for consistency
|
||||||
cur += snprintf(cur, end-cur, ", \"ibm_datetime\":\"%s.%03ldZ\"", date_buf, now.tv_usec / 1000);
|
cur += snprintf(cur, end-cur, ", \"ibm_datetime\":\"%s.%03ldZ\"", date_buf, now.tv_usec / (long)1000);
|
||||||
}
|
}
|
||||||
cur += snprintf(cur, end-cur, ", \"ibm_processId\":\"%d\"", pid);
|
cur += snprintf(cur, end-cur, ", \"ibm_processId\":\"%d\"", pid);
|
||||||
cur += snprintf(cur, end-cur, ", \"host\":\"%s\"", hostname);
|
cur += snprintf(cur, end-cur, ", \"host\":\"%s\"", hostname);
|
||||||
@@ -146,7 +146,17 @@ void log_printf(const char *source_file, int source_line, const char *level, con
|
|||||||
|
|
||||||
// Important: Just do one file write, to prevent problems with multi-threading.
|
// Important: Just do one file write, to prevent problems with multi-threading.
|
||||||
// This only works if the log message is not too long for the buffer.
|
// This only works if the log message is not too long for the buffer.
|
||||||
fprintf(fp, buf);
|
fprintf(fp, "%s", buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int trimmed_len(char *s, int max_len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = max_len - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (s[i] != ' ')
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return i+1;
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2021
|
© Copyright IBM Corporation 2021, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -59,5 +59,12 @@ void log_close();
|
|||||||
*/
|
*/
|
||||||
#define log_debugf(format,...) log_printf(__FILE__, __LINE__, "DEBUG", format, ##__VA_ARGS__)
|
#define log_debugf(format,...) log_printf(__FILE__, __LINE__, "DEBUG", format, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the length of the string when trimmed of trailing spaces.
|
||||||
|
* IBM MQ uses fixed length strings, so this function can be used to print
|
||||||
|
* a trimmed version of a string using the "%.*s" printf format string.
|
||||||
|
* For example, `log_printf("%.*s", trimmed_len(fw_str, 48), fw_str)`
|
||||||
|
*/
|
||||||
|
int trimmed_len(char *s, int);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
120
authservice/mqhtpass/src/log_test.c
Normal file
120
authservice/mqhtpass/src/log_test.c
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
© Copyright IBM Corporation 2022
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
// Headers for multi-threaded tests
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
// Start a test and log the function name
|
||||||
|
#define test_start() printf("=== RUN: %s\n", __func__)
|
||||||
|
|
||||||
|
// Indicate test has passed
|
||||||
|
#define test_pass() printf("--- PASS: %s\n", __func__)
|
||||||
|
|
||||||
|
// The length of strings used in the tests
|
||||||
|
#define STR_LEN 5
|
||||||
|
|
||||||
|
// Indicate test has failed
|
||||||
|
void test_fail(const char *test_name)
|
||||||
|
{
|
||||||
|
printf("--- FAIL: %s\n", test_name);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print a fixed-width string in hexadecimal
|
||||||
|
void print_hex(char fw_string[STR_LEN])
|
||||||
|
{
|
||||||
|
printf("[");
|
||||||
|
for (int i=0; i<STR_LEN; i++)
|
||||||
|
{
|
||||||
|
printf("%02x", fw_string[i]);
|
||||||
|
if (i < STR_LEN-1)
|
||||||
|
printf(",");
|
||||||
|
}
|
||||||
|
printf("]");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// Tests for string manipulation
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void test_trimmed_len(const char *test_name, char fw_string[STR_LEN], int expected_len)
|
||||||
|
{
|
||||||
|
printf("=== RUN: %s\n", test_name);
|
||||||
|
int len;
|
||||||
|
// Create a copy of the fixed-width string
|
||||||
|
char fw_string2[STR_LEN];
|
||||||
|
memcpy(fw_string2, fw_string, STR_LEN * sizeof(char));
|
||||||
|
// Call the function under test
|
||||||
|
len = trimmed_len(fw_string, STR_LEN);
|
||||||
|
// Check the result is correct
|
||||||
|
if (len != expected_len)
|
||||||
|
{
|
||||||
|
printf("%s: Expected result to be %d; got %d\n", __func__, expected_len, len);
|
||||||
|
test_fail(test_name);
|
||||||
|
}
|
||||||
|
// Check that the original string has not been changed
|
||||||
|
for (int i=0; i<STR_LEN; i++)
|
||||||
|
{
|
||||||
|
if (fw_string[i] != fw_string2[i])
|
||||||
|
{
|
||||||
|
printf("%c-%c\n", fw_string[i], fw_string2[i]);
|
||||||
|
printf("%s: Expected string to be identical to input hex ", __func__);
|
||||||
|
print_hex(fw_string2);
|
||||||
|
printf("; got hex ");
|
||||||
|
print_hex(fw_string);
|
||||||
|
printf("\n");
|
||||||
|
test_fail(test_name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("--- PASS: %s\n", test_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_trimmed_len_normal()
|
||||||
|
{
|
||||||
|
char fw_string[STR_LEN] = {'a','b','c',' ',' '};
|
||||||
|
test_trimmed_len(__func__, fw_string, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_trimmed_len_full()
|
||||||
|
{
|
||||||
|
char fw_string[STR_LEN] = {'a','b','c','d','e'};
|
||||||
|
test_trimmed_len(__func__, fw_string, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_trimmed_len_empty()
|
||||||
|
{
|
||||||
|
char fw_string[STR_LEN] = {' ',' ',' ',' ',' '};
|
||||||
|
test_trimmed_len(__func__, fw_string, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// Turn on debugging for the tests
|
||||||
|
setenv("DEBUG", "true", true);
|
||||||
|
log_init("log_test.log");
|
||||||
|
test_trimmed_len_normal();
|
||||||
|
test_trimmed_len_full();
|
||||||
|
test_trimmed_len_empty();
|
||||||
|
log_close();
|
||||||
|
}
|
||||||
@@ -34,8 +34,6 @@ static MQZ_TERM_AUTHORITY mqhtpass_terminate;
|
|||||||
#define HTPASSWD_FILE "/etc/mqm/mq.htpasswd"
|
#define HTPASSWD_FILE "/etc/mqm/mq.htpasswd"
|
||||||
#define NAME "MQ Advanced for Developers custom authentication service"
|
#define NAME "MQ Advanced for Developers custom authentication service"
|
||||||
|
|
||||||
static char *trim(char *s);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization and entrypoint for the dynamically loaded
|
* Initialization and entrypoint for the dynamically loaded
|
||||||
* authorization installable service. It registers the addresses of the
|
* authorization installable service. It registers the addresses of the
|
||||||
@@ -80,7 +78,7 @@ void MQENTRY MQStart(
|
|||||||
{
|
{
|
||||||
log_infof("Initializing %s", NAME);
|
log_infof("Initializing %s", NAME);
|
||||||
}
|
}
|
||||||
log_debugf("MQStart options=%s qmgr=%s", ((Options == MQZIO_SECONDARY) ? "Secondary" : "Primary"), trim(QMgrName));
|
log_debugf("MQStart options=%s qmgr=%.*s", ((Options == MQZIO_SECONDARY) ? "Secondary" : "Primary"), trimmed_len(QMgrName, MQ_Q_MGR_NAME_LENGTH), QMgrName);
|
||||||
|
|
||||||
if (!htpass_valid_file(HTPASSWD_FILE))
|
if (!htpass_valid_file(HTPASSWD_FILE))
|
||||||
{
|
{
|
||||||
@@ -176,11 +174,14 @@ static void MQENTRY mqhtpass_authenticate_user_csp(
|
|||||||
// Tell the queue manager to continue trying other authorization services, as they might have the user.
|
// Tell the queue manager to continue trying other authorization services, as they might have the user.
|
||||||
*pContinuation = MQZCI_CONTINUE;
|
*pContinuation = MQZCI_CONTINUE;
|
||||||
log_debugf(
|
log_debugf(
|
||||||
"User authentication failed due to invalid user. user=%s effuser=%s applname=%s csp_user=%s cc=%d reason=%d",
|
"User authentication failed due to invalid user. user=%.*s effuser=%.*s applname=%.*s csp_user=%s cc=%d reason=%d",
|
||||||
trim(pIdentityContext->UserIdentifier),
|
trimmed_len(pIdentityContext->UserIdentifier, MQ_USER_ID_LENGTH),
|
||||||
trim(pApplicationContext->EffectiveUserID),
|
pIdentityContext->UserIdentifier,
|
||||||
trim(pApplicationContext->ApplName),
|
trimmed_len(pApplicationContext->EffectiveUserID, MQ_USER_ID_LENGTH),
|
||||||
trim(csp_user),
|
pApplicationContext->EffectiveUserID,
|
||||||
|
trimmed_len(pApplicationContext->ApplName, MQ_APPL_NAME_LENGTH),
|
||||||
|
pApplicationContext->ApplName,
|
||||||
|
csp_user,
|
||||||
*pCompCode,
|
*pCompCode,
|
||||||
*pReason);
|
*pReason);
|
||||||
}
|
}
|
||||||
@@ -192,11 +193,14 @@ static void MQENTRY mqhtpass_authenticate_user_csp(
|
|||||||
// Tell the queue manager to stop trying other authorization services.
|
// Tell the queue manager to stop trying other authorization services.
|
||||||
*pContinuation = MQZCI_STOP;
|
*pContinuation = MQZCI_STOP;
|
||||||
log_debugf(
|
log_debugf(
|
||||||
"User authentication failed due to invalid password. user=%s effuser=%s applname=%s csp_user=%s cc=%d reason=%d",
|
"User authentication failed due to invalid password. user=%.*s effuser=%.*s applname=%.*s csp_user=%s cc=%d reason=%d",
|
||||||
trim(pIdentityContext->UserIdentifier),
|
trimmed_len(pIdentityContext->UserIdentifier, MQ_USER_ID_LENGTH),
|
||||||
trim(pApplicationContext->EffectiveUserID),
|
pIdentityContext->UserIdentifier,
|
||||||
trim(pApplicationContext->ApplName),
|
trimmed_len(pApplicationContext->EffectiveUserID, MQ_USER_ID_LENGTH),
|
||||||
trim(csp_user),
|
pApplicationContext->EffectiveUserID,
|
||||||
|
trimmed_len(pApplicationContext->ApplName, MQ_APPL_NAME_LENGTH),
|
||||||
|
pApplicationContext->ApplName,
|
||||||
|
csp_user,
|
||||||
*pCompCode,
|
*pCompCode,
|
||||||
*pReason);
|
*pReason);
|
||||||
}
|
}
|
||||||
@@ -275,11 +279,14 @@ static void MQENTRY mqhtpass_authenticate_user(
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
log_debugf(
|
log_debugf(
|
||||||
"User authentication failed user=%s effuser=%s applname=%s cspuser=%s cc=%d reason=%d",
|
"User authentication failed user=%.*s effuser=%.*s applname=%.*s cspuser=%s cc=%d reason=%d",
|
||||||
trim(pIdentityContext->UserIdentifier),
|
trimmed_len(pIdentityContext->UserIdentifier, MQ_USER_ID_LENGTH),
|
||||||
trim(pApplicationContext->EffectiveUserID),
|
pIdentityContext->UserIdentifier,
|
||||||
trim(pApplicationContext->ApplName),
|
trimmed_len(pApplicationContext->EffectiveUserID, MQ_USER_ID_LENGTH),
|
||||||
trim(spuser),
|
pApplicationContext->EffectiveUserID,
|
||||||
|
trimmed_len(pApplicationContext->ApplName, MQ_APPL_NAME_LENGTH),
|
||||||
|
pApplicationContext->ApplName,
|
||||||
|
spuser,
|
||||||
*pCompCode,
|
*pCompCode,
|
||||||
*pReason);
|
*pReason);
|
||||||
}
|
}
|
||||||
@@ -333,18 +340,3 @@ static void MQENTRY mqhtpass_terminate(
|
|||||||
*pReason = MQRC_NONE;
|
*pReason = MQRC_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove trailing spaces from a string.
|
|
||||||
*/
|
|
||||||
static char *trim(char *s)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = strlen(s) - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
if (s[i] == ' ')
|
|
||||||
s[i] = 0;
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2017, 2020
|
© Copyright IBM Corporation 2017, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -18,22 +18,24 @@ limitations under the License.
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"os/signal"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ibm-messaging/mq-container/pkg/name"
|
"github.com/ibm-messaging/mq-container/pkg/name"
|
||||||
)
|
)
|
||||||
|
|
||||||
func queueManagerHealthy() (bool, error) {
|
func queueManagerHealthy(ctx context.Context) (bool, error) {
|
||||||
name, err := name.GetQueueManagerName()
|
name, err := name.GetQueueManagerName()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
// Specify the queue manager name, just in case someone's created a second queue manager
|
// Specify the queue manager name, just in case someone's created a second queue manager
|
||||||
// #nosec G204
|
// #nosec G204
|
||||||
cmd := exec.Command("dspmq", "-n", "-m", name)
|
cmd := exec.CommandContext(ctx, "dspmq", "-n", "-m", name)
|
||||||
// Run the command and wait for completion
|
// Run the command and wait for completion
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
fmt.Printf("%s", out)
|
fmt.Printf("%s", out)
|
||||||
@@ -47,13 +49,20 @@ func queueManagerHealthy() (bool, error) {
|
|||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func doMain() int {
|
||||||
healthy, err := queueManagerHealthy()
|
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
healthy, err := queueManagerHealthy(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.Exit(2)
|
return 2
|
||||||
}
|
}
|
||||||
if !healthy {
|
if !healthy {
|
||||||
os.Exit(1)
|
return 1
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
os.Exit(doMain())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2017, 2019
|
© Copyright IBM Corporation 2017, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -18,44 +18,54 @@ limitations under the License.
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
|
||||||
"github.com/ibm-messaging/mq-container/internal/ready"
|
"github.com/ibm-messaging/mq-container/internal/ready"
|
||||||
"github.com/ibm-messaging/mq-container/pkg/name"
|
"github.com/ibm-messaging/mq-container/pkg/name"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func doMain() int {
|
||||||
|
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
// Check if runmqserver has indicated that it's finished configuration
|
// Check if runmqserver has indicated that it's finished configuration
|
||||||
r, err := ready.Check()
|
r, err := ready.Check()
|
||||||
if !r || err != nil {
|
if !r || err != nil {
|
||||||
os.Exit(1)
|
return 1
|
||||||
}
|
}
|
||||||
name, err := name.GetQueueManagerName()
|
name, err := name.GetQueueManagerName()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
os.Exit(1)
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the queue manager has a running listener
|
// Check if the queue manager has a running listener
|
||||||
if active, _ := ready.IsRunningAsActiveQM(name); active {
|
if active, _ := ready.IsRunningAsActiveQM(ctx, name); active {
|
||||||
conn, err := net.Dial("tcp", "127.0.0.1:1414")
|
conn, err := net.Dial("tcp", "127.0.0.1:1414")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
os.Exit(1)
|
return 1
|
||||||
}
|
}
|
||||||
err = conn.Close()
|
err = conn.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
}
|
}
|
||||||
} else if standby, _ := ready.IsRunningAsStandbyQM(name); standby {
|
} else if standby, _ := ready.IsRunningAsStandbyQM(ctx, name); standby {
|
||||||
fmt.Printf("Detected queue manager running in standby mode")
|
fmt.Printf("Detected queue manager running in standby mode")
|
||||||
os.Exit(10)
|
return 10
|
||||||
} else if replica, _ := ready.IsRunningAsReplicaQM(name); replica {
|
} else if replica, _ := ready.IsRunningAsReplicaQM(ctx, name); replica {
|
||||||
fmt.Printf("Detected queue manager running in replica mode")
|
fmt.Printf("Detected queue manager running in replica mode")
|
||||||
os.Exit(20)
|
return 20
|
||||||
} else {
|
} else {
|
||||||
os.Exit(1)
|
return 1
|
||||||
}
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
os.Exit(doMain())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2021
|
© Copyright IBM Corporation 2021, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -18,22 +18,24 @@ limitations under the License.
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"os/signal"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ibm-messaging/mq-container/pkg/name"
|
"github.com/ibm-messaging/mq-container/pkg/name"
|
||||||
)
|
)
|
||||||
|
|
||||||
func queueManagerStarted() (bool, error) {
|
func queueManagerStarted(ctx context.Context) (bool, error) {
|
||||||
name, err := name.GetQueueManagerName()
|
name, err := name.GetQueueManagerName()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
// Specify the queue manager name, just in case someone's created a second queue manager
|
// Specify the queue manager name, just in case someone's created a second queue manager
|
||||||
// #nosec G204
|
// #nosec G204
|
||||||
cmd := exec.Command("dspmq", "-n", "-m", name)
|
cmd := exec.CommandContext(ctx, "dspmq", "-n", "-m", name)
|
||||||
// Run the command and wait for completion
|
// Run the command and wait for completion
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -46,13 +48,20 @@ func queueManagerStarted() (bool, error) {
|
|||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func doMain() int {
|
||||||
started, err := queueManagerStarted()
|
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, os.Kill)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
started, err := queueManagerStarted(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
os.Exit(2)
|
return 2
|
||||||
}
|
}
|
||||||
if !started {
|
if !started {
|
||||||
os.Exit(1)
|
return 1
|
||||||
}
|
}
|
||||||
os.Exit(0)
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
os.Exit(doMain())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2017, 2021
|
© Copyright IBM Corporation 2017, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -165,7 +165,7 @@ func configureLogger(name string) (mirrorFunc, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Failed to unmarshall JSON in log message - %v", err)
|
log.Printf("Failed to unmarshall JSON in log message - %v", err)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf(formatBasic(obj))
|
fmt.Print(formatBasic(obj))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// The log being mirrored isn't JSON, so just print it.
|
// The log being mirrored isn't JSON, so just print it.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2017, 2020
|
© Copyright IBM Corporation 2017, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -16,6 +16,7 @@ limitations under the License.
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
@@ -131,7 +132,7 @@ func startQueueManager(name string) error {
|
|||||||
func stopQueueManager(name string) error {
|
func stopQueueManager(name string) error {
|
||||||
log.Println("Stopping queue manager")
|
log.Println("Stopping queue manager")
|
||||||
qmGracePeriod := os.Getenv("MQ_GRACE_PERIOD")
|
qmGracePeriod := os.Getenv("MQ_GRACE_PERIOD")
|
||||||
isStandby, err := ready.IsRunningAsStandbyQM(name)
|
isStandby, err := ready.IsRunningAsStandbyQM(context.Background(), name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error getting status for queue manager %v: %v", name, err.Error())
|
log.Printf("Error getting status for queue manager %v: %v", name, err.Error())
|
||||||
return err
|
return err
|
||||||
@@ -141,7 +142,7 @@ func stopQueueManager(name string) error {
|
|||||||
if isStandby {
|
if isStandby {
|
||||||
args = []string{"-x", name}
|
args = []string{"-x", name}
|
||||||
} else {
|
} else {
|
||||||
args = []string{"-s", "-w", "-r", "-tp", qmGracePeriod, name}
|
args = []string{"-s", "-w", "-tp", qmGracePeriod, name}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out, rc, err := command.Run("endmqm", args...)
|
out, rc, err := command.Run("endmqm", args...)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
###########################################################################################################################################################
|
###########################################################################################################################################################
|
||||||
|
|
||||||
# MQ_VERSION is the fully qualified MQ version number to build
|
# MQ_VERSION is the fully qualified MQ version number to build
|
||||||
MQ_VERSION ?= 9.3.0.0
|
MQ_VERSION ?= 9.3.1.1
|
||||||
|
|
||||||
###########################################################################################################################################################
|
###########################################################################################################################################################
|
||||||
|
|||||||
3
docs/building.md
Normal file → Executable file
3
docs/building.md
Normal file → Executable file
@@ -34,8 +34,7 @@ MQ_ARCHIVE=mq-1.2.3.4.tar.gz MQ_VERSION=1.2.3.4 make build-advancedserver
|
|||||||
|
|
||||||
**Note**: MQ 9.3 is the latest MQ version with MQ Long Term Support (LTS), as well as being the latest Continuous Delivery (CD) version. Therefore, to build build 9.3.0.X, follow the [instructions above for MQ 9.3](#building-mq-93-long-term-support-lts-and-continuous-delivery-cd).
|
**Note**: MQ 9.3 is the latest MQ version with MQ Long Term Support (LTS), as well as being the latest Continuous Delivery (CD) version. Therefore, to build build 9.3.0.X, follow the [instructions above for MQ 9.3](#building-mq-93-long-term-support-lts-and-continuous-delivery-cd).
|
||||||
|
|
||||||
However, if you wish to build the previous MQ LTS, use the [instructions](/../9.2.0.x/docs/building.md#mq-long-term-support-lts) in the `v9.2.0.x-eus` branch.
|
However, if you wish to build the previous MQ LTS, use the [instructions](https://github.ibm.com/mq-cloudpak/mq-container/blob/v9.2.0.x-eus/docs/building.md#mq-long-term-support-lts) in the `v9.2.0.x-eus` branch.
|
||||||
|
|
||||||
|
|
||||||
## Building a developer image
|
## Building a developer image
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ Two channels are created, one for administration, the other for normal messaging
|
|||||||
|
|
||||||
## Web Console
|
## Web Console
|
||||||
|
|
||||||
By default the MQ Advanced for Developers image will start the IBM MQ Web Console that allows you to administer your Queue Manager running on your container. When the web console has been started, you can access it by opening a web browser and navigating to https://<Container IP>:9443/ibmmq/console. Where <Container IP> is replaced by the IP address of your running container.
|
By default the MQ Advanced for Developers image will start the IBM MQ Web Console that allows you to administer your Queue Manager running on your container. When the web console has been started, you can access it by opening a web browser and navigating to `https://<Container IP>:9443/ibmmq/console`. Where `<Container IP>` is replaced by the IP address of your running container.
|
||||||
|
|
||||||
When you navigate to this page you may be presented with a security exception warning. This happens because, by default, the web console creates a self-signed certificate to use for the HTTPS operations. This certificate is not trusted by your browser and has an incorrect distinguished name.
|
When you navigate to this page you may be presented with a security exception warning. This happens because, by default, the web console creates a self-signed certificate to use for the HTTPS operations. This certificate is not trusted by your browser and has an incorrect distinguished name.
|
||||||
|
|
||||||
|
|||||||
@@ -16,5 +16,5 @@ docker run \
|
|||||||
--env LICENSE=accept \
|
--env LICENSE=accept \
|
||||||
--env MQ_QMGR_NAME=QM1 \
|
--env MQ_QMGR_NAME=QM1 \
|
||||||
--detach \
|
--detach \
|
||||||
ibm-mqadvanced-server:9.3.0.0-amd64
|
ibm-mqadvanced-server:9.3.1.1-amd64
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ There are two main sets of tests:
|
|||||||
The Docker tests can be run locally on a machine with Docker. For example:
|
The Docker tests can be run locally on a machine with Docker. For example:
|
||||||
|
|
||||||
```
|
```
|
||||||
make devserver
|
make test-devserver
|
||||||
make advancedserver
|
make test-advancedserver
|
||||||
```
|
```
|
||||||
|
|
||||||
You can specify the image to use directly by using the `MQ_IMAGE_ADVANCEDSERVER` or `MQ_IMAGE_DEVSERVER` variables, for example:
|
You can specify the image to use directly by using the `MQ_IMAGE_ADVANCEDSERVER` or `MQ_IMAGE_DEVSERVER` variables, for example:
|
||||||
|
|
||||||
```
|
```
|
||||||
MQ_IMAGE_ADVANCEDSERVER=ibm-mqadvanced-server:9.3.0.0-amd64 make test-advancedserver
|
MQ_IMAGE_ADVANCEDSERVER=ibm-mqadvanced-server:9.3.1.1-amd64 make test-advancedserver
|
||||||
```
|
```
|
||||||
|
|
||||||
You can pass parameters to `go test` with an environment variable. For example, to run the "TestGoldenPath" test, run the following command:
|
You can pass parameters to `go test` with an environment variable. For example, to run the "TestGoldenPath" test, run the following command:
|
||||||
|
|||||||
4
go.mod
4
go.mod
@@ -8,7 +8,7 @@ require (
|
|||||||
github.com/prometheus/client_golang v1.11.1
|
github.com/prometheus/client_golang v1.11.1
|
||||||
github.com/prometheus/client_model v0.2.0
|
github.com/prometheus/client_model v0.2.0
|
||||||
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect
|
github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f
|
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d
|
||||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1
|
||||||
software.sslmate.com/src/go-pkcs12 v0.0.0-20200830195227-52f69702a001
|
software.sslmate.com/src/go-pkcs12 v0.0.0-20200830195227-52f69702a001
|
||||||
)
|
)
|
||||||
|
|||||||
14
go.sum
14
go.sum
@@ -97,14 +97,15 @@ github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG
|
|||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f h1:aZp0e2vLN4MToVqnjNEYEtrEA8RH8U8FN1CU7JgqsPU=
|
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
|
||||||
golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -115,17 +116,20 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q=
|
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4=
|
||||||
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# -*- mode: sh -*-
|
# -*- mode: sh -*-
|
||||||
# © Copyright IBM Corporation 2015, 2021
|
# © Copyright IBM Corporation 2015, 2022
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
@@ -22,6 +22,7 @@ test -f /usr/bin/yum && YUM=true || YUM=false
|
|||||||
test -f /usr/bin/microdnf && MICRODNF=true || MICRODNF=false
|
test -f /usr/bin/microdnf && MICRODNF=true || MICRODNF=false
|
||||||
test -f /usr/bin/rpm && RPM=true || RPM=false
|
test -f /usr/bin/rpm && RPM=true || RPM=false
|
||||||
test -f /usr/bin/apt-get && UBUNTU=true || UBUNTU=false
|
test -f /usr/bin/apt-get && UBUNTU=true || UBUNTU=false
|
||||||
|
CPU_ARCH=$(uname -m)
|
||||||
|
|
||||||
if ($UBUNTU); then
|
if ($UBUNTU); then
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
@@ -29,8 +30,7 @@ if ($UBUNTU); then
|
|||||||
# This ensures no unsupported code gets installed, and makes the build faster
|
# This ensures no unsupported code gets installed, and makes the build faster
|
||||||
source /etc/os-release
|
source /etc/os-release
|
||||||
# Figure out the correct apt URL based on the CPU architecture
|
# Figure out the correct apt URL based on the CPU architecture
|
||||||
CPU_ARCH=$(uname -p)
|
if [ "${CPU_ARCH}" == "x86_64" ]; then
|
||||||
if [ ${CPU_ARCH} == "x86_64" ]; then
|
|
||||||
APT_URL="http://archive.ubuntu.com/ubuntu/"
|
APT_URL="http://archive.ubuntu.com/ubuntu/"
|
||||||
else
|
else
|
||||||
APT_URL="http://ports.ubuntu.com/ubuntu-ports/"
|
APT_URL="http://ports.ubuntu.com/ubuntu-ports/"
|
||||||
@@ -41,29 +41,22 @@ if ($UBUNTU); then
|
|||||||
echo "deb ${APT_URL} ${UBUNTU_CODENAME}-updates main restricted" >> /etc/apt/sources.list
|
echo "deb ${APT_URL} ${UBUNTU_CODENAME}-updates main restricted" >> /etc/apt/sources.list
|
||||||
echo "deb ${APT_URL} ${UBUNTU_CODENAME}-security main restricted" >> /etc/apt/sources.list
|
echo "deb ${APT_URL} ${UBUNTU_CODENAME}-security main restricted" >> /etc/apt/sources.list
|
||||||
# Install additional packages required by MQ, this install process and the runtime scripts
|
# Install additional packages required by MQ, this install process and the runtime scripts
|
||||||
|
EXTRA_DEBS="bash bc ca-certificates coreutils curl debianutils file findutils gawk grep libc-bin mount passwd procps sed tar util-linux"
|
||||||
|
# On ARM CPUs, there is no IBM JRE, so install another one
|
||||||
|
if [ "${CPU_ARCH}" == "aarch64" ]; then
|
||||||
|
EXTRA_DEBS="${EXTRA_DEBS} openjdk-8-jre"
|
||||||
|
fi
|
||||||
apt-get update
|
apt-get update
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends ${EXTRA_DEBS}
|
||||||
bash \
|
|
||||||
bc \
|
|
||||||
ca-certificates \
|
|
||||||
coreutils \
|
|
||||||
curl \
|
|
||||||
debianutils \
|
|
||||||
file \
|
|
||||||
findutils \
|
|
||||||
gawk \
|
|
||||||
grep \
|
|
||||||
libc-bin \
|
|
||||||
mount \
|
|
||||||
passwd \
|
|
||||||
procps \
|
|
||||||
sed \
|
|
||||||
tar \
|
|
||||||
util-linux
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ($RPM); then
|
if ($RPM); then
|
||||||
EXTRA_RPMS="bash bc ca-certificates file findutils gawk glibc-common grep ncurses-compat-libs passwd procps-ng sed shadow-utils tar util-linux which"
|
EXTRA_RPMS="bash bc ca-certificates file findutils gawk glibc-common grep ncurses-compat-libs passwd procps-ng sed shadow-utils tar util-linux which"
|
||||||
|
# On ARM CPUs, there is no IBM JRE, so install another one
|
||||||
|
if [ "${CPU_ARCH}" == "aarch64" ]; then
|
||||||
|
EXTRA_RPMS="${EXTRA_RPMS} java-1.8.0-openjdk-headless"
|
||||||
|
fi
|
||||||
|
|
||||||
# Install additional packages required by MQ, this install process and the runtime scripts
|
# Install additional packages required by MQ, this install process and the runtime scripts
|
||||||
$YUM && yum -y install --setopt install_weak_deps=false ${EXTRA_RPMS}
|
$YUM && yum -y install --setopt install_weak_deps=false ${EXTRA_RPMS}
|
||||||
$MICRODNF && microdnf --disableplugin=subscription-manager install ${EXTRA_RPMS}
|
$MICRODNF && microdnf --disableplugin=subscription-manager install ${EXTRA_RPMS}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2017, 2020
|
© Copyright IBM Corporation 2017, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -18,6 +18,7 @@ limitations under the License.
|
|||||||
package command
|
package command
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
)
|
)
|
||||||
@@ -27,9 +28,13 @@ import (
|
|||||||
// Do not use this function to run shell built-ins (like "cd"), because
|
// Do not use this function to run shell built-ins (like "cd"), because
|
||||||
// the error handling works differently
|
// the error handling works differently
|
||||||
func Run(name string, arg ...string) (string, int, error) {
|
func Run(name string, arg ...string) (string, int, error) {
|
||||||
|
return RunContext(context.Background(), name, arg...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RunContext(ctx context.Context, name string, arg ...string) (string, int, error) {
|
||||||
// Run the command and wait for completion
|
// Run the command and wait for completion
|
||||||
// #nosec G204
|
// #nosec G204
|
||||||
cmd := exec.Command(name, arg...)
|
cmd := exec.CommandContext(ctx, name, arg...)
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
rc := cmd.ProcessState.ExitCode()
|
rc := cmd.ProcessState.ExitCode()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2018, 2020
|
© Copyright IBM Corporation 2018, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -171,8 +171,8 @@ func (ks *KeyStore) GetCertificateLabels() ([]string, error) {
|
|||||||
var labels []string
|
var labels []string
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
s := scanner.Text()
|
s := scanner.Text()
|
||||||
if strings.HasPrefix(s, "-") || strings.HasPrefix(s, "*-") {
|
if strings.HasPrefix(s, "-") || strings.HasPrefix(s, "*-") || strings.HasPrefix(s, "!") {
|
||||||
s := strings.TrimLeft(s, "-*")
|
s := strings.TrimLeft(s, "-*!")
|
||||||
labels = append(labels, strings.TrimSpace(s))
|
labels = append(labels, strings.TrimSpace(s))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2018, 2019
|
© Copyright IBM Corporation 2018, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -43,7 +43,7 @@ func GatherMetrics(qmName string, log *logger.Logger) {
|
|||||||
|
|
||||||
// If running in standby mode - wait until the queue manager becomes active
|
// If running in standby mode - wait until the queue manager becomes active
|
||||||
for {
|
for {
|
||||||
active, _ := ready.IsRunningAsActiveQM(qmName)
|
active, _ := ready.IsRunningAsActiveQM(context.Background(), qmName)
|
||||||
if active {
|
if active {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2018, 2019
|
© Copyright IBM Corporation 2018, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -18,6 +18,7 @@ limitations under the License.
|
|||||||
package ready
|
package ready
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -67,22 +68,22 @@ func Check() (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// IsRunningAsActiveQM returns true if the queue manager is running in active mode
|
// IsRunningAsActiveQM returns true if the queue manager is running in active mode
|
||||||
func IsRunningAsActiveQM(name string) (bool, error) {
|
func IsRunningAsActiveQM(ctx context.Context, name string) (bool, error) {
|
||||||
return isRunningQM(name, "(RUNNING)")
|
return isRunningQM(ctx, name, "(RUNNING)")
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRunningAsStandbyQM returns true if the queue manager is running in standby mode
|
// IsRunningAsStandbyQM returns true if the queue manager is running in standby mode
|
||||||
func IsRunningAsStandbyQM(name string) (bool, error) {
|
func IsRunningAsStandbyQM(ctx context.Context, name string) (bool, error) {
|
||||||
return isRunningQM(name, "(RUNNING AS STANDBY)")
|
return isRunningQM(ctx, name, "(RUNNING AS STANDBY)")
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsRunningAsReplicaQM returns true if the queue manager is running in replica mode
|
// IsRunningAsReplicaQM returns true if the queue manager is running in replica mode
|
||||||
func IsRunningAsReplicaQM(name string) (bool, error) {
|
func IsRunningAsReplicaQM(ctx context.Context, name string) (bool, error) {
|
||||||
return isRunningQM(name, "(REPLICA)")
|
return isRunningQM(ctx, name, "(REPLICA)")
|
||||||
}
|
}
|
||||||
|
|
||||||
func isRunningQM(name string, status string) (bool, error) {
|
func isRunningQM(ctx context.Context, name string, status string) (bool, error) {
|
||||||
out, _, err := command.Run("dspmq", "-n", "-m", name)
|
out, _, err := command.RunContext(ctx, "dspmq", "-n", "-m", name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2019, 2021
|
© Copyright IBM Corporation 2019, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -76,18 +76,20 @@ type TLSStore struct {
|
|||||||
Truststore KeyStoreData
|
Truststore KeyStoreData
|
||||||
}
|
}
|
||||||
|
|
||||||
func configureTLSKeystores(keystoreDir, keyDir, trustDir string, p12TruststoreRequired bool) (string, KeyStoreData, KeyStoreData, error) {
|
func configureTLSKeystores(keystoreDir, keyDir, trustDir string, p12TruststoreRequired bool, nativeTLSHA bool) (string, KeyStoreData, KeyStoreData, error) {
|
||||||
|
var keyLabel string
|
||||||
// Create the CMS Keystore & PKCS#12 Truststore (if required)
|
// Create the CMS Keystore & PKCS#12 Truststore (if required)
|
||||||
tlsStore, err := generateAllKeystores(keystoreDir, p12TruststoreRequired)
|
tlsStore, err := generateAllKeystores(keystoreDir, p12TruststoreRequired, nativeTLSHA)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", tlsStore.Keystore, tlsStore.Truststore, err
|
return "", tlsStore.Keystore, tlsStore.Truststore, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process all keys - add them to the CMS KeyStore
|
if tlsStore.Keystore.Keystore != nil {
|
||||||
keyLabel, err := processKeys(&tlsStore, keystoreDir, keyDir)
|
// Process all keys - add them to the CMS KeyStore
|
||||||
if err != nil {
|
keyLabel, err = processKeys(&tlsStore, keystoreDir, keyDir)
|
||||||
return "", tlsStore.Keystore, tlsStore.Truststore, err
|
if err != nil {
|
||||||
|
return "", tlsStore.Keystore, tlsStore.Truststore, err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process all trust certificates - add them to the CMS KeyStore & PKCS#12 Truststore (if required)
|
// Process all trust certificates - add them to the CMS KeyStore & PKCS#12 Truststore (if required)
|
||||||
@@ -101,13 +103,13 @@ func configureTLSKeystores(keystoreDir, keyDir, trustDir string, p12TruststoreRe
|
|||||||
|
|
||||||
// ConfigureDefaultTLSKeystores configures the CMS Keystore & PKCS#12 Truststore
|
// ConfigureDefaultTLSKeystores configures the CMS Keystore & PKCS#12 Truststore
|
||||||
func ConfigureDefaultTLSKeystores() (string, KeyStoreData, KeyStoreData, error) {
|
func ConfigureDefaultTLSKeystores() (string, KeyStoreData, KeyStoreData, error) {
|
||||||
return configureTLSKeystores(keystoreDirDefault, keyDirDefault, trustDirDefault, true)
|
return configureTLSKeystores(keystoreDirDefault, keyDirDefault, trustDirDefault, true, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConfigureHATLSKeystore configures the CMS Keystore & PKCS#12 Truststore
|
// ConfigureHATLSKeystore configures the CMS Keystore & PKCS#12 Truststore
|
||||||
func ConfigureHATLSKeystore() (string, KeyStoreData, KeyStoreData, error) {
|
func ConfigureHATLSKeystore() (string, KeyStoreData, KeyStoreData, error) {
|
||||||
// *.crt files mounted to the HA TLS dir keyDirHA will be processed as trusted in the CMS keystore
|
// *.crt files mounted to the HA TLS dir keyDirHA will be processed as trusted in the CMS keystore
|
||||||
return configureTLSKeystores(keystoreDirHA, keyDirHA, keyDirHA, false)
|
return configureTLSKeystores(keystoreDirHA, keyDirHA, keyDirHA, false, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConfigureTLS configures TLS for the queue manager
|
// ConfigureTLS configures TLS for the queue manager
|
||||||
@@ -115,9 +117,18 @@ func ConfigureTLS(keyLabel string, cmsKeystore KeyStoreData, devMode bool, log *
|
|||||||
|
|
||||||
const mqsc string = "/etc/mqm/15-tls.mqsc"
|
const mqsc string = "/etc/mqm/15-tls.mqsc"
|
||||||
const mqscTemplate string = mqsc + ".tpl"
|
const mqscTemplate string = mqsc + ".tpl"
|
||||||
|
sslKeyRing := ""
|
||||||
|
|
||||||
|
// Don't set SSLKEYR if no keys or crts are not supplied
|
||||||
|
// Key label will be blank if no certs were added during processing keys and certs.
|
||||||
|
if cmsKeystore.Keystore != nil {
|
||||||
|
certList, _ := cmsKeystore.Keystore.ListAllCertificates()
|
||||||
|
if len(certList) > 0 {
|
||||||
|
sslKeyRing = strings.TrimSuffix(cmsKeystore.Keystore.Filename, ".kdb")
|
||||||
|
}
|
||||||
|
}
|
||||||
err := mqtemplate.ProcessTemplateFile(mqscTemplate, mqsc, map[string]string{
|
err := mqtemplate.ProcessTemplateFile(mqscTemplate, mqsc, map[string]string{
|
||||||
"SSLKeyR": strings.TrimSuffix(cmsKeystore.Keystore.Filename, ".kdb"),
|
"SSLKeyR": sslKeyRing,
|
||||||
"CertificateLabel": keyLabel,
|
"CertificateLabel": keyLabel,
|
||||||
}, log)
|
}, log)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -159,7 +170,7 @@ func configureTLSDev(log *logger.Logger) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// generateAllKeystores creates the CMS Keystore & PKCS#12 Truststore (if required)
|
// generateAllKeystores creates the CMS Keystore & PKCS#12 Truststore (if required)
|
||||||
func generateAllKeystores(keystoreDir string, p12TruststoreRequired bool) (TLSStore, error) {
|
func generateAllKeystores(keystoreDir string, p12TruststoreRequired bool, nativeTLSHA bool) (TLSStore, error) {
|
||||||
|
|
||||||
var cmsKeystore, p12Truststore KeyStoreData
|
var cmsKeystore, p12Truststore KeyStoreData
|
||||||
|
|
||||||
@@ -175,11 +186,19 @@ func generateAllKeystores(keystoreDir string, p12TruststoreRequired bool) (TLSSt
|
|||||||
return TLSStore{cmsKeystore, p12Truststore}, fmt.Errorf("Failed to create Keystore directory: %v", err)
|
return TLSStore{cmsKeystore, p12Truststore}, fmt.Errorf("Failed to create Keystore directory: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the CMS Keystore
|
// Search the default keys directory for any keys/certs.
|
||||||
cmsKeystore.Keystore = keystore.NewCMSKeyStore(filepath.Join(keystoreDir, cmsKeystoreName), cmsKeystore.Password)
|
keysDirectory := keyDirDefault
|
||||||
err = cmsKeystore.Keystore.Create()
|
// Change to default native HA TLS directory if we are configuring nativeHA
|
||||||
if err != nil {
|
if nativeTLSHA {
|
||||||
return TLSStore{cmsKeystore, p12Truststore}, fmt.Errorf("Failed to create CMS Keystore: %v", err)
|
keysDirectory = keyDirHA
|
||||||
|
}
|
||||||
|
// Create the CMS Keystore if we have been provided keys and certificates
|
||||||
|
if haveKeysAndCerts(keysDirectory) || haveKeysAndCerts(trustDirDefault) {
|
||||||
|
cmsKeystore.Keystore = keystore.NewCMSKeyStore(filepath.Join(keystoreDir, cmsKeystoreName), cmsKeystore.Password)
|
||||||
|
err = cmsKeystore.Keystore.Create()
|
||||||
|
if err != nil {
|
||||||
|
return TLSStore{cmsKeystore, p12Truststore}, fmt.Errorf("Failed to create CMS Keystore: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the PKCS#12 Truststore (if required)
|
// Create the PKCS#12 Truststore (if required)
|
||||||
@@ -203,7 +222,6 @@ func processKeys(tlsStore *TLSStore, keystoreDir string, keyDir string) (string,
|
|||||||
// Process all keys
|
// Process all keys
|
||||||
keyList, err := ioutil.ReadDir(keyDir)
|
keyList, err := ioutil.ReadDir(keyDir)
|
||||||
if err == nil && len(keyList) > 0 {
|
if err == nil && len(keyList) > 0 {
|
||||||
|
|
||||||
// Process each set of keys - each set should contain files: *.key & *.crt
|
// Process each set of keys - each set should contain files: *.key & *.crt
|
||||||
for _, keySet := range keyList {
|
for _, keySet := range keyList {
|
||||||
keys, _ := ioutil.ReadDir(filepath.Join(keyDir, keySet.Name()))
|
keys, _ := ioutil.ReadDir(filepath.Join(keyDir, keySet.Name()))
|
||||||
@@ -602,3 +620,23 @@ func writeCertificatesToFile(file string, certificates []*pem.Block) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Search the specified directory for .key and .crt files.
|
||||||
|
// Return true if at least one .key or .crt file is found else false
|
||||||
|
func haveKeysAndCerts(keyDir string) bool {
|
||||||
|
fileList, err := os.ReadDir(keyDir)
|
||||||
|
if err == nil && len(fileList) > 0 {
|
||||||
|
for _, fileInfo := range fileList {
|
||||||
|
// Keys and certs will be supplied in an user defined subdirectory.
|
||||||
|
// Do a listing of the subdirectory and then search for .key and .cert files
|
||||||
|
keys, _ := ioutil.ReadDir(filepath.Join(keyDir, fileInfo.Name()))
|
||||||
|
for _, key := range keys {
|
||||||
|
if strings.Contains(key.Name(), ".key") || strings.Contains(key.Name(), ".crt") {
|
||||||
|
// We found at least one key/crt file.
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ func ConfigureWebKeystore(p12Truststore KeyStoreData, webKeystore string) (strin
|
|||||||
// Check if a new self-signed certificate should be generated
|
// Check if a new self-signed certificate should be generated
|
||||||
genHostName := os.Getenv("MQ_GENERATE_CERTIFICATE_HOSTNAME")
|
genHostName := os.Getenv("MQ_GENERATE_CERTIFICATE_HOSTNAME")
|
||||||
if genHostName != "" {
|
if genHostName != "" {
|
||||||
|
|
||||||
// Create the Web Keystore
|
// Create the Web Keystore
|
||||||
newWebKeystore := keystore.NewPKCS12KeyStore(webKeystoreFile, p12Truststore.Password)
|
newWebKeystore := keystore.NewPKCS12KeyStore(webKeystoreFile, p12Truststore.Password)
|
||||||
err := newWebKeystore.Create()
|
err := newWebKeystore.Create()
|
||||||
|
|||||||
7
source-branch.env
Normal file
7
source-branch.env
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
###########################################################################################################################################################
|
||||||
|
|
||||||
|
# SOURCE_BRANCH is the repository branch name for this release stream.
|
||||||
|
# It should be updated when a new release fork is created but not for testing of personal builds or pre-fork updates.
|
||||||
|
SOURCE_BRANCH ?= v9.3.1
|
||||||
|
|
||||||
|
###########################################################################################################################################################
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
//go:build mqdev
|
||||||
// +build mqdev
|
// +build mqdev
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -51,8 +52,10 @@ func TestDevGoldenPath(t *testing.T) {
|
|||||||
waitForReady(t, cli, id)
|
waitForReady(t, cli, id)
|
||||||
waitForWebReady(t, cli, id, insecureTLSConfig)
|
waitForWebReady(t, cli, id, insecureTLSConfig)
|
||||||
t.Run("JMS", func(t *testing.T) {
|
t.Run("JMS", func(t *testing.T) {
|
||||||
// Run the JMS tests, with no password specified
|
// Run the JMS tests, with no password specified.
|
||||||
runJMSTests(t, cli, id, false, "app", defaultAppPasswordOS)
|
// Use OpenJDK JRE for running testing, pass false for 7th parameter.
|
||||||
|
// Last parameter is blank as the test doesn't use TLS.
|
||||||
|
runJMSTests(t, cli, id, false, "app", defaultAppPasswordOS, "false", "")
|
||||||
})
|
})
|
||||||
t.Run("REST admin", func(t *testing.T) {
|
t.Run("REST admin", func(t *testing.T) {
|
||||||
testRESTAdmin(t, cli, id, insecureTLSConfig)
|
testRESTAdmin(t, cli, id, insecureTLSConfig)
|
||||||
@@ -115,7 +118,9 @@ func TestDevSecure(t *testing.T) {
|
|||||||
waitForWebReady(t, cli, ctr.ID, createTLSConfig(t, cert, tlsPassPhrase))
|
waitForWebReady(t, cli, ctr.ID, createTLSConfig(t, cert, tlsPassPhrase))
|
||||||
|
|
||||||
t.Run("JMS", func(t *testing.T) {
|
t.Run("JMS", func(t *testing.T) {
|
||||||
runJMSTests(t, cli, ctr.ID, true, "app", appPassword)
|
// OpenJDK is used for running tests, hence pass "false" for 7th parameter.
|
||||||
|
// Cipher name specified is compliant with non-IBM JRE naming.
|
||||||
|
runJMSTests(t, cli, ctr.ID, true, "app", appPassword, "false", "TLS_RSA_WITH_AES_256_CBC_SHA256")
|
||||||
})
|
})
|
||||||
t.Run("REST admin", func(t *testing.T) {
|
t.Run("REST admin", func(t *testing.T) {
|
||||||
testRESTAdmin(t, cli, ctr.ID, insecureTLSConfig)
|
testRESTAdmin(t, cli, ctr.ID, insecureTLSConfig)
|
||||||
@@ -153,7 +158,9 @@ func TestDevWebDisabled(t *testing.T) {
|
|||||||
})
|
})
|
||||||
t.Run("JMS", func(t *testing.T) {
|
t.Run("JMS", func(t *testing.T) {
|
||||||
// Run the JMS tests, with no password specified
|
// Run the JMS tests, with no password specified
|
||||||
runJMSTests(t, cli, id, false, "app", defaultAppPasswordOS)
|
// OpenJDK is used for running tests, hence pass "false" for 7th parameter.
|
||||||
|
// Last parameter is blank as the test doesn't use TLS.
|
||||||
|
runJMSTests(t, cli, id, false, "app", defaultAppPasswordOS, "false", "")
|
||||||
})
|
})
|
||||||
// Stop the container cleanly
|
// Stop the container cleanly
|
||||||
stopContainer(t, cli, id)
|
stopContainer(t, cli, id)
|
||||||
@@ -184,3 +191,131 @@ func TestDevConfigDisabled(t *testing.T) {
|
|||||||
// Stop the container cleanly
|
// Stop the container cleanly
|
||||||
stopContainer(t, cli, id)
|
stopContainer(t, cli, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test if SSLKEYR and CERTLABL attributes are not set when key and certificate
|
||||||
|
// are not supplied.
|
||||||
|
func TestSSLKEYRBlank(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
cli, err := client.NewClientWithOpts(client.FromEnv)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
containerConfig := container.Config{
|
||||||
|
Env: []string{
|
||||||
|
"LICENSE=accept",
|
||||||
|
"MQ_QMGR_NAME=qm1",
|
||||||
|
"MQ_ENABLE_EMBEDDED_WEB_SERVER=false",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
id := runContainerWithPorts(t, cli, &containerConfig, []int{9443})
|
||||||
|
defer cleanContainer(t, cli, id)
|
||||||
|
waitForReady(t, cli, id)
|
||||||
|
// execute runmqsc to display qmgr SSLKEYR and CERTLABL attibutes.
|
||||||
|
// Search the console output for exepcted values
|
||||||
|
_, sslkeyROutput := execContainer(t, cli, id, "", []string{"bash", "-c", "echo 'DISPLAY QMGR SSLKEYR CERTLABL' | runmqsc"})
|
||||||
|
if !strings.Contains(sslkeyROutput, "SSLKEYR( )") && !strings.Contains(sslkeyROutput, "CERTLABL( )") {
|
||||||
|
t.Errorf("Expected SSLKEYR to be blank but it is not; got \"%v\"", sslkeyROutput)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop the container cleanly
|
||||||
|
stopContainer(t, cli, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test if SSLKEYR and CERTLABL attributes are set when key and certificate
|
||||||
|
// are supplied.
|
||||||
|
func TestSSLKEYRWithSuppliedKeyAndCert(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
cli, err := client.NewClientWithOpts(client.FromEnv)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
containerConfig := container.Config{
|
||||||
|
Env: []string{
|
||||||
|
"LICENSE=accept",
|
||||||
|
"MQ_QMGR_NAME=QM1",
|
||||||
|
"MQ_ENABLE_EMBEDDED_WEB_SERVER=false",
|
||||||
|
},
|
||||||
|
Image: imageName(),
|
||||||
|
}
|
||||||
|
hostConfig := container.HostConfig{
|
||||||
|
Binds: []string{
|
||||||
|
coverageBind(t),
|
||||||
|
tlsDir(t, false) + ":/etc/mqm/pki/keys/default",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
networkingConfig := network.NetworkingConfig{}
|
||||||
|
ctr, err := cli.ContainerCreate(context.Background(), &containerConfig, &hostConfig, &networkingConfig, t.Name())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer cleanContainer(t, cli, ctr.ID)
|
||||||
|
startContainer(t, cli, ctr.ID)
|
||||||
|
waitForReady(t, cli, ctr.ID)
|
||||||
|
// execute runmqsc to display qmgr SSLKEYR and CERTLABL attibutes.
|
||||||
|
// Search the console output for exepcted values
|
||||||
|
_, sslkeyROutput := execContainer(t, cli, ctr.ID, "", []string{"bash", "-c", "echo 'DISPLAY QMGR SSLKEYR CERTLABL' | runmqsc"})
|
||||||
|
if !strings.Contains(sslkeyROutput, "SSLKEYR(/run/runmqserver/tls/key)") && !strings.Contains(sslkeyROutput, "CERTLABL(default)") {
|
||||||
|
t.Errorf("Expected SSLKEYR to be '/run/runmqserver/tls/key' but it is not; got \"%v\"", sslkeyROutput)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop the container cleanly
|
||||||
|
stopContainer(t, cli, ctr.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test with CA cert
|
||||||
|
func TestSSLKEYRWithCACert(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
cli, err := client.NewClientWithOpts(client.FromEnv)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
containerConfig := container.Config{
|
||||||
|
Env: []string{
|
||||||
|
"LICENSE=accept",
|
||||||
|
"MQ_QMGR_NAME=QM1",
|
||||||
|
"MQ_ENABLE_EMBEDDED_WEB_SERVER=false",
|
||||||
|
},
|
||||||
|
Image: imageName(),
|
||||||
|
}
|
||||||
|
hostConfig := container.HostConfig{
|
||||||
|
Binds: []string{
|
||||||
|
coverageBind(t),
|
||||||
|
tlsDirWithCA(t, false) + ":/etc/mqm/pki/keys/QM1CA",
|
||||||
|
},
|
||||||
|
// Assign a random port for the web server on the host
|
||||||
|
PortBindings: nat.PortMap{
|
||||||
|
"9443/tcp": []nat.PortBinding{
|
||||||
|
{
|
||||||
|
HostIP: "0.0.0.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
networkingConfig := network.NetworkingConfig{}
|
||||||
|
ctr, err := cli.ContainerCreate(context.Background(), &containerConfig, &hostConfig, &networkingConfig, t.Name())
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
defer cleanContainer(t, cli, ctr.ID)
|
||||||
|
startContainer(t, cli, ctr.ID)
|
||||||
|
waitForReady(t, cli, ctr.ID)
|
||||||
|
|
||||||
|
// execute runmqsc to display qmgr SSLKEYR and CERTLABL attibutes.
|
||||||
|
// Search the console output for exepcted values
|
||||||
|
_, sslkeyROutput := execContainer(t, cli, ctr.ID, "", []string{"bash", "-c", "echo 'DISPLAY QMGR SSLKEYR CERTLABL' | runmqsc"})
|
||||||
|
if !strings.Contains(sslkeyROutput, "SSLKEYR(/run/runmqserver/tls/key)") {
|
||||||
|
t.Errorf("Expected SSLKEYR to be '/run/runmqserver/tls/key' but it is not; got \"%v\"", sslkeyROutput)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.Contains(sslkeyROutput, "CERTLABL(QM1CA)") {
|
||||||
|
t.Errorf("Expected CERTLABL to be 'QM1CA' but it is not; got \"%v\"", sslkeyROutput)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop the container cleanly
|
||||||
|
stopContainer(t, cli, ctr.ID)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
|
//go:build mqdev
|
||||||
// +build mqdev
|
// +build mqdev
|
||||||
|
|
||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2018, 2021
|
© Copyright IBM Corporation 2018, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -18,6 +19,7 @@ limitations under the License.
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
@@ -26,8 +28,8 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
"os"
|
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@@ -80,15 +82,19 @@ func tlsDir(t *testing.T, unixPath bool) string {
|
|||||||
return filepath.Join(getCwd(t, unixPath), "../tls")
|
return filepath.Join(getCwd(t, unixPath), "../tls")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tlsDirWithCA(t *testing.T, unixPath bool) string {
|
||||||
|
return filepath.Join(getCwd(t, unixPath), "../tlscacert")
|
||||||
|
}
|
||||||
|
|
||||||
// runJMSTests runs a container with a JMS client, which connects to the queue manager container with the specified ID
|
// runJMSTests runs a container with a JMS client, which connects to the queue manager container with the specified ID
|
||||||
func runJMSTests(t *testing.T, cli *client.Client, ID string, tls bool, user, password string) {
|
func runJMSTests(t *testing.T, cli *client.Client, ID string, tls bool, user, password string, ibmjre string, cipherName string) {
|
||||||
containerConfig := container.Config{
|
containerConfig := container.Config{
|
||||||
// -e MQ_PORT_1414_TCP_ADDR=9.145.14.173 -e MQ_USERNAME=app -e MQ_PASSWORD=passw0rd -e MQ_CHANNEL=DEV.APP.SVRCONN -e MQ_TLS_TRUSTSTORE=/tls/test.p12 -e MQ_TLS_PASSPHRASE=passw0rd -v /Users/arthurbarr/go/src/github.com/ibm-messaging/mq-container/test/tls:/tls msgtest
|
// -e MQ_PORT_1414_TCP_ADDR=9.145.14.173 -e MQ_USERNAME=app -e MQ_PASSWORD=passw0rd -e MQ_CHANNEL=DEV.APP.SVRCONN -e MQ_TLS_TRUSTSTORE=/tls/test.p12 -e MQ_TLS_PASSPHRASE=passw0rd -v /Users/arthurbarr/go/src/github.com/ibm-messaging/mq-container/test/tls:/tls msgtest
|
||||||
Env: []string{
|
Env: []string{
|
||||||
"MQ_PORT_1414_TCP_ADDR=" + getIPAddress(t, cli, ID),
|
"MQ_PORT_1414_TCP_ADDR=" + getIPAddress(t, cli, ID),
|
||||||
"MQ_USERNAME=" + user,
|
"MQ_USERNAME=" + user,
|
||||||
"MQ_CHANNEL=DEV.APP.SVRCONN",
|
"MQ_CHANNEL=DEV.APP.SVRCONN",
|
||||||
"IBMJRE=" + os.Getenv("IBMJRE"),
|
"IBMJRE=" + ibmjre,
|
||||||
},
|
},
|
||||||
Image: imageNameDevJMS(),
|
Image: imageNameDevJMS(),
|
||||||
}
|
}
|
||||||
@@ -101,6 +107,7 @@ func runJMSTests(t *testing.T, cli *client.Client, ID string, tls bool, user, pa
|
|||||||
containerConfig.Env = append(containerConfig.Env, []string{
|
containerConfig.Env = append(containerConfig.Env, []string{
|
||||||
"MQ_TLS_TRUSTSTORE=/var/tls/client-trust.jks",
|
"MQ_TLS_TRUSTSTORE=/var/tls/client-trust.jks",
|
||||||
"MQ_TLS_PASSPHRASE=passw0rd",
|
"MQ_TLS_PASSPHRASE=passw0rd",
|
||||||
|
"MQ_TLS_CIPHER=" + cipherName,
|
||||||
}...)
|
}...)
|
||||||
}
|
}
|
||||||
hostConfig := container.HostConfig{
|
hostConfig := container.HostConfig{
|
||||||
@@ -119,9 +126,57 @@ func runJMSTests(t *testing.T, cli *client.Client, ID string, tls bool, user, pa
|
|||||||
if rc != 0 {
|
if rc != 0 {
|
||||||
t.Errorf("JUnit container failed with rc=%v", rc)
|
t.Errorf("JUnit container failed with rc=%v", rc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Get console output of the container and process the lines
|
||||||
|
// to see if we have any failures
|
||||||
|
scanner := bufio.NewScanner(strings.NewReader(inspectLogs(t, cli, ctr.ID)))
|
||||||
|
for scanner.Scan() {
|
||||||
|
s := scanner.Text()
|
||||||
|
if processJunitLogLine(s) {
|
||||||
|
t.Errorf("JUnit container tests failed. Reason: %s", s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
defer cleanContainer(t, cli, ctr.ID)
|
defer cleanContainer(t, cli, ctr.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parse JUnit log line and return true if line contains failed or aborted tests
|
||||||
|
func processJunitLogLine(outputLine string) bool {
|
||||||
|
var failedLine bool
|
||||||
|
// Sample JUnit test run output
|
||||||
|
//[ 2 containers found ]
|
||||||
|
//[ 0 containers skipped ]
|
||||||
|
//[ 2 containers started ]
|
||||||
|
//[ 0 containers aborted ]
|
||||||
|
//[ 2 containers successful ]
|
||||||
|
//[ 0 containers failed ]
|
||||||
|
//[ 0 tests found ]
|
||||||
|
//[ 0 tests skipped ]
|
||||||
|
//[ 0 tests started ]
|
||||||
|
//[ 0 tests aborted ]
|
||||||
|
//[ 0 tests successful ]
|
||||||
|
//[ 0 tests failed ]
|
||||||
|
|
||||||
|
// Consider only those lines that begin with '[' and with ']'
|
||||||
|
if strings.HasPrefix(outputLine, "[") && strings.HasSuffix(outputLine, "]") {
|
||||||
|
// Strip off [] and whitespaces
|
||||||
|
trimmed := strings.Trim(outputLine, "[] ")
|
||||||
|
if strings.Contains(trimmed, "aborted") || strings.Contains(trimmed, "failed") {
|
||||||
|
// Tokenize on whitespace
|
||||||
|
tokens := strings.Split(trimmed, " ")
|
||||||
|
// Determine the count of aborted or failed tests
|
||||||
|
count, err := strconv.Atoi(tokens[0])
|
||||||
|
if err == nil {
|
||||||
|
if count > 0 {
|
||||||
|
failedLine = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return failedLine
|
||||||
|
}
|
||||||
|
|
||||||
// createTLSConfig creates a tls.Config which trusts the specified certificate
|
// createTLSConfig creates a tls.Config which trusts the specified certificate
|
||||||
func createTLSConfig(t *testing.T, certFile, password string) *tls.Config {
|
func createTLSConfig(t *testing.T, certFile, password string) *tls.Config {
|
||||||
// Get the SystemCertPool, continue with an empty pool on error
|
// Get the SystemCertPool, continue with an empty pool on error
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ func TestLicenseNotSet(t *testing.T) {
|
|||||||
expectTerminationMessage(t, cli, id)
|
expectTerminationMessage(t, cli, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Start container with LICENSE environment variable set to view.
|
||||||
|
//Check that container starts and display license text
|
||||||
func TestLicenseView(t *testing.T) {
|
func TestLicenseView(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
@@ -132,42 +134,6 @@ func goldenPath(t *testing.T, metric bool) {
|
|||||||
stopContainer(t, cli, id)
|
stopContainer(t, cli, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestSecurityVulnerabilities checks for any vulnerabilities in the image, as reported
|
|
||||||
// by Red Hat
|
|
||||||
func TestSecurityVulnerabilities(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
cli, err := client.NewClientWithOpts(client.FromEnv)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
rc, _ := runContainerOneShot(t, cli, "bash", "-c", "command -v microdnf && test -e /etc/yum.repos.d/ubi.repo")
|
|
||||||
if rc != 0 {
|
|
||||||
t.Skip("Skipping test because container is based on ubi-minimal, which doesn't include yum")
|
|
||||||
}
|
|
||||||
// id, _, err := command.Run("sudo", "buildah", "from", imageName())
|
|
||||||
// if err != nil {
|
|
||||||
// t.Log(id)
|
|
||||||
// t.Fatal(err)
|
|
||||||
// }
|
|
||||||
// id = strings.TrimSpace(id)
|
|
||||||
// defer command.Run("buildah", "rm", id)
|
|
||||||
// mnt, _, err := command.Run("sudo", "buildah", "mount", id)
|
|
||||||
// if err != nil {
|
|
||||||
// t.Log(mnt)
|
|
||||||
// t.Fatal(err)
|
|
||||||
// }
|
|
||||||
// mnt = strings.TrimSpace(mnt)
|
|
||||||
// out, _, err := command.Run("bash", "-c", "sudo cp /etc/yum.repos.d/* "+filepath.Join(mnt, "/etc/yum.repos.d/"))
|
|
||||||
// if err != nil {
|
|
||||||
// t.Log(out)
|
|
||||||
// t.Fatal(err)
|
|
||||||
// }
|
|
||||||
// out, ret, _ := command.Run("bash", "-c", "yum --installroot="+mnt+" updateinfo list sec | grep /Sec")
|
|
||||||
// if ret != 1 {
|
|
||||||
// t.Errorf("Expected no vulnerabilities, found the following:\n%v", out)
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
func utilTestNoQueueManagerName(t *testing.T, hostName string, expectedName string) {
|
func utilTestNoQueueManagerName(t *testing.T, hostName string, expectedName string) {
|
||||||
search := "QMNAME(" + expectedName + ")"
|
search := "QMNAME(" + expectedName + ")"
|
||||||
@@ -187,6 +153,7 @@ func utilTestNoQueueManagerName(t *testing.T, hostName string, expectedName stri
|
|||||||
t.Errorf("Expected result of running dspmq to contain name=%v, got name=%v", search, out)
|
t.Errorf("Expected result of running dspmq to contain name=%v, got name=%v", search, out)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNoQueueManagerName(t *testing.T) {
|
func TestNoQueueManagerName(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
|
||||||
|
|||||||
@@ -3,17 +3,17 @@ module github.com/ibm-messaging/mq-container/test/docker
|
|||||||
go 1.16
|
go 1.16
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/containerd/containerd v1.6.3 // indirect
|
github.com/containerd/containerd v1.6.6 // indirect
|
||||||
github.com/docker/distribution v2.8.1+incompatible // indirect
|
github.com/docker/distribution v2.8.1+incompatible // indirect
|
||||||
// Note: This is not actually Docker v17.12!
|
// Note: This is not actually Docker v17.12!
|
||||||
// Go modules require the use of semver, but Docker does not use semver and has not
|
// Go modules require the use of semver, but Docker does not use semver and has not
|
||||||
// [opted-in to use Go modules](https://github.com/golang/go/wiki/Modules#can-a-module-consume-a-package-that-has-not-opted-in-to-modules)
|
// [opted-in to use Go modules](https://github.com/golang/go/wiki/Modules#can-a-module-consume-a-package-that-has-not-opted-in-to-modules)
|
||||||
// This means that when you `go get` Docker, you need to do so based on a commit,
|
// This means that when you `go get` Docker, you need to do so based on a commit,
|
||||||
// e.g. `go get -v github.com/docker/docker@420b1d36250f9cfdc561f086f25a213ecb669b6f`,
|
// e.g. `go get -v github.com/docker/docker@420b1d36250f9cfdc561f086f25a213ecb669b6f`,
|
||||||
// which uses the commit for [Docker v19.03.15](https://github.com/moby/moby/releases/tag/v19.03.15)
|
// which uses the commit for [Docker v19.03.15](https://github.com/moby/moby/releases/tag/v19.03.15)
|
||||||
// Go will then find the latest tag with a semver-compatible tag. In Docker's case,
|
// Go will then find the latest tag with a semver-compatible tag. In Docker's case,
|
||||||
// v17.12.0 is valid semver, but v18.09 and v19.03 are not.
|
// v17.12.0 is valid semver, but v18.09 and v19.03 are not.
|
||||||
// Also note: Docker v20.10 is valid semver, but the v20.10 client API requires use of Docker API
|
// Also note: Docker v20.10 is valid semver, but the v20.10 client API requires use of Docker API
|
||||||
// version 1.41 on the server, which is currently too new for the version of Docker in Travis (Ubuntu Bionic)
|
// version 1.41 on the server, which is currently too new for the version of Docker in Travis (Ubuntu Bionic)
|
||||||
github.com/docker/docker v17.12.0-ce-rc1.0.20210128214336-420b1d36250f+incompatible
|
github.com/docker/docker v17.12.0-ce-rc1.0.20210128214336-420b1d36250f+incompatible
|
||||||
github.com/docker/go-connections v0.4.0
|
github.com/docker/go-connections v0.4.0
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwT
|
|||||||
github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
|
github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
|
||||||
github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg=
|
github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg=
|
||||||
github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
|
github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
|
||||||
|
github.com/Microsoft/hcsshim v0.9.3/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
|
||||||
github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
|
github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
|
||||||
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
|
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
|
||||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
||||||
@@ -195,8 +196,8 @@ github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTV
|
|||||||
github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c=
|
github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c=
|
||||||
github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s=
|
github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s=
|
||||||
github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE=
|
github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE=
|
||||||
github.com/containerd/containerd v1.6.3 h1:JfgUEIAH07xDWk6kqz0P3ArZt+KJ9YeihSC9uyFtSKg=
|
github.com/containerd/containerd v1.6.6 h1:xJNPhbrmz8xAMDNoVjHy9YHtWwEQNS+CDkcIRh7t8Y0=
|
||||||
github.com/containerd/containerd v1.6.3/go.mod h1:gCVGrYRYFm2E8GmuUIbj/NGD7DLZQLzSJQazjVKDOig=
|
github.com/containerd/containerd v1.6.6/go.mod h1:ZoP1geJldzCVY3Tonoz7b1IXk8rIX0Nltt5QE4OMNk0=
|
||||||
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
@@ -215,7 +216,7 @@ github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZH
|
|||||||
github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk=
|
github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk=
|
||||||
github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
|
github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
|
||||||
github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
|
github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
|
||||||
github.com/containerd/go-cni v1.1.4/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
|
github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34=
|
||||||
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
|
github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
|
||||||
github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
|
github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
|
||||||
github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
|
github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
|
||||||
@@ -250,6 +251,7 @@ github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ
|
|||||||
github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
||||||
github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
|
||||||
github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y=
|
github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y=
|
||||||
|
github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw=
|
||||||
github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
|
github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
|
||||||
github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
|
github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
|
||||||
github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE=
|
github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE=
|
||||||
@@ -462,6 +464,7 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
|
|||||||
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
|
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
@@ -632,6 +635,7 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108
|
|||||||
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
|
github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
|
||||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
|
||||||
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
|
||||||
|
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
||||||
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||||
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
@@ -641,6 +645,7 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT
|
|||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||||
github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
|
github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
|
||||||
|
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||||
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||||
@@ -660,7 +665,7 @@ github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rm
|
|||||||
github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0=
|
github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0=
|
||||||
github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
|
github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
|
||||||
github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
|
github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
|
||||||
github.com/opencontainers/runc v1.1.1/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
|
github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
|
||||||
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
|
||||||
@@ -672,6 +677,7 @@ github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqi
|
|||||||
github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
|
github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
|
||||||
github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=
|
github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=
|
||||||
github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
|
github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
|
||||||
|
github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
|
||||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
@@ -1094,6 +1100,7 @@ golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc=
|
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150 h1:xHms4gcpe1YE7A3yIllJXP16CMAGuqwO2lX1mTyyRRc=
|
||||||
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2019, 2020
|
© Copyright IBM Corporation 2019, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -16,6 +16,7 @@ limitations under the License.
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
@@ -92,15 +93,28 @@ func TestMultiInstanceContainerStop(t *testing.T) {
|
|||||||
waitForReady(t, cli, qm1aId)
|
waitForReady(t, cli, qm1aId)
|
||||||
waitForReady(t, cli, qm1bId)
|
waitForReady(t, cli, qm1bId)
|
||||||
|
|
||||||
err, active, standby := getActiveStandbyQueueManager(t, cli, qm1aId, qm1bId)
|
err, originalActive, originalStandby := getActiveStandbyQueueManager(t, cli, qm1aId, qm1bId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
stopContainer(t, cli, active)
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
stopContainer(t, cli, originalActive)
|
||||||
|
|
||||||
if status := getQueueManagerStatus(t, cli, standby, "QM1"); strings.Compare(status, "Running") != 0 {
|
for {
|
||||||
t.Fatalf("Expected QM1 to be running as active queue manager, dspmq returned status of %v", status)
|
status := getQueueManagerStatus(t, cli, originalStandby, "QM1")
|
||||||
|
select {
|
||||||
|
case <-time.After(1 * time.Second):
|
||||||
|
if status == "Running" {
|
||||||
|
t.Logf("Original standby is now the active")
|
||||||
|
return
|
||||||
|
} else if status == "Starting" {
|
||||||
|
t.Logf("Original standby is starting")
|
||||||
|
}
|
||||||
|
case <-ctx.Done():
|
||||||
|
t.Fatalf("%s Timed out waiting for standby to become the active. Status=%v", time.Now().Format(time.RFC3339), status)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2019
|
© Copyright IBM Corporation 2019, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -77,6 +77,7 @@ func getActiveStandbyQueueManager(t *testing.T, cli *client.Client, qm1aId strin
|
|||||||
|
|
||||||
func getQueueManagerStatus(t *testing.T, cli *client.Client, containerID string, queueManagerName string) string {
|
func getQueueManagerStatus(t *testing.T, cli *client.Client, containerID string, queueManagerName string) string {
|
||||||
_, dspmqOut := execContainer(t, cli, containerID, "", []string{"bash", "-c", "dspmq", "-m", queueManagerName})
|
_, dspmqOut := execContainer(t, cli, containerID, "", []string{"bash", "-c", "dspmq", "-m", queueManagerName})
|
||||||
|
t.Logf("dspmq for %v (%v) returned: %v", containerID, queueManagerName, dspmqOut)
|
||||||
regex := regexp.MustCompile(`STATUS\(.*\)`)
|
regex := regexp.MustCompile(`STATUS\(.*\)`)
|
||||||
status := regex.FindString(dspmqOut)
|
status := regex.FindString(dspmqOut)
|
||||||
status = strings.TrimSuffix(strings.TrimPrefix(status, "STATUS("), ")")
|
status = strings.TrimSuffix(strings.TrimPrefix(status, "STATUS("), ")")
|
||||||
|
|||||||
@@ -16,16 +16,16 @@
|
|||||||
# Application build environment (Maven)
|
# Application build environment (Maven)
|
||||||
###############################################################################
|
###############################################################################
|
||||||
FROM registry.access.redhat.com/ubi8/openjdk-8 as builder
|
FROM registry.access.redhat.com/ubi8/openjdk-8 as builder
|
||||||
COPY pom.xml .
|
COPY pom.xml ./
|
||||||
#WORKDIR /usr/src/mymaven
|
#WORKDIR /usr/src/mymaven
|
||||||
# Download dependencies separately, so Docker caches them
|
# Download dependencies separately, so Docker caches them
|
||||||
RUN mvn dependency:go-offline install
|
RUN mvn dependency:go-offline install
|
||||||
# Copy source
|
# Copy source
|
||||||
COPY src .
|
COPY src ./src
|
||||||
# Run the main build
|
# Run the main build
|
||||||
RUN mvn --offline install
|
RUN mvn --offline install
|
||||||
# Print a list of all the files (useful for debugging)
|
# Print a list of all the files (useful for debugging)
|
||||||
RUN find .
|
RUN find ./
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# Application runtime (JRE only, no build environment)
|
# Application runtime (JRE only, no build environment)
|
||||||
@@ -35,4 +35,4 @@ FROM registry.access.redhat.com/ubi8/openjdk-8-runtime
|
|||||||
COPY --from=builder /home/jboss/target/*.jar /opt/app/
|
COPY --from=builder /home/jboss/target/*.jar /opt/app/
|
||||||
COPY --from=builder /home/jboss/target/lib/*.jar /opt/app/
|
COPY --from=builder /home/jboss/target/lib/*.jar /opt/app/
|
||||||
USER 1001
|
USER 1001
|
||||||
ENTRYPOINT ["java", "-classpath", "/opt/app/*", "org.junit.platform.console.ConsoleLauncher", "-p", "com.ibm.mqcontainer.test", "--details", "verbose"]
|
ENTRYPOINT ["java", "-classpath", "/opt/app/*", "org.junit.platform.console.ConsoleLauncher", "--fail-if-no-tests", "-p", "com.ibm.mqcontainer.test", "--details", "verbose"]
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ limitations under the License.
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.ibm.mq</groupId>
|
<groupId>com.ibm.mq</groupId>
|
||||||
<artifactId>com.ibm.mq.allclient</artifactId>
|
<artifactId>com.ibm.mq.allclient</artifactId>
|
||||||
<version>9.2.0.0</version>
|
<version>9.3.0.0</version>
|
||||||
<scope>compile</scope>
|
<scope>compile</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
© Copyright IBM Corporation 2018, 2021
|
© Copyright IBM Corporation 2018, 2022
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@@ -82,11 +82,10 @@ class JMSTests {
|
|||||||
boolean ibmjre = System.getenv("IBMJRE").equals("true");
|
boolean ibmjre = System.getenv("IBMJRE").equals("true");
|
||||||
if (ibmjre){
|
if (ibmjre){
|
||||||
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "true");
|
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "true");
|
||||||
factory.setSSLCipherSuite("SSL_RSA_WITH_AES_128_CBC_SHA256");
|
|
||||||
} else {
|
} else {
|
||||||
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false");
|
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false");
|
||||||
factory.setSSLCipherSuite("TLS_RSA_WITH_AES_128_CBC_SHA256");
|
|
||||||
}
|
}
|
||||||
|
factory.setSSLCipherSuite(System.getenv("MQ_TLS_CIPHER"));
|
||||||
}
|
}
|
||||||
return factory;
|
return factory;
|
||||||
}
|
}
|
||||||
|
|||||||
23
test/tlscacert/cacert.crt
Normal file
23
test/tlscacert/cacert.crt
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDxTCCAq2gAwIBAgIUc5EKoPi8cg2M2n+SqCPn44LFjoAwDQYJKoZIhvcNAQEL
|
||||||
|
BQAwcjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk5ZMREwDwYDVQQHDAhOZXcgWW9y
|
||||||
|
azEMMAoGA1UECgwDSUJNMQwwCgYDVQQLDANJQk0xDDAKBgNVBAMMA0lCTTEZMBcG
|
||||||
|
CSqGSIb3DQEJARYKbXFAaWJtLmNvbTAeFw0yMjEwMDYxMzA2NTVaFw0zMjEwMDMx
|
||||||
|
MzA2NTVaMHIxCzAJBgNVBAYTAlVTMQswCQYDVQQIDAJOWTERMA8GA1UEBwwITmV3
|
||||||
|
IFlvcmsxDDAKBgNVBAoMA0lCTTEMMAoGA1UECwwDSUJNMQwwCgYDVQQDDANJQk0x
|
||||||
|
GTAXBgkqhkiG9w0BCQEWCm1xQGlibS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB
|
||||||
|
DwAwggEKAoIBAQCls3oNIDxzKct0NXVsoz1Hng3BcaDPcBRYCNgAEwDOVe3rEEbZ
|
||||||
|
d2KFliDgCG3hCHMM1Yaabx3iTVsKklubBxr1JFmyDtgb4z9mJpMVYXS+gsKsZOs/
|
||||||
|
vNSmzpt5VlbEadHKJ/aFf/EWxvoOP80UiEeUJt36aWFUTyjjyArd2xS8fD1DATFB
|
||||||
|
U2bteaWfkpuLeFiTtwftZhsLv1s5T35+Ex087eX1tkm/TArxZsNl/9RrSWsbJh/t
|
||||||
|
bjiRKn+fCZdirFsurP3Si5Jd9laCW0RBKAKYEh40XYDgjLhvcazDPTBueTHXQPG5
|
||||||
|
S0hCOhCJiCWpPCsh8rIOCz0D9YIByZADR1WvAgMBAAGjUzBRMB0GA1UdDgQWBBS5
|
||||||
|
OsiPqZXlMwpMqGKczUg3qVvy0zAfBgNVHSMEGDAWgBS5OsiPqZXlMwpMqGKczUg3
|
||||||
|
qVvy0zAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBfwYRcckke
|
||||||
|
/NzDHlFb8TBlUDqERmlT/qTWamVZO2Zuo4Y0BFOYFEA23F5sQU2s2MFSEZcAKe5v
|
||||||
|
mJroFE2rr4aY4bJ4Z0UXlOAYyqNxVOTI4MIxwbg3GVr8c8oWBnAmgqI9W9OpgZ52
|
||||||
|
/bN24XL9s6I3TeOTtYI9z5O70Kl/E3nG8GcfMw0EtNIy0UPUWvJH8FgEsotsRO9v
|
||||||
|
tPtlZklEK/D+Keozbs2shdNhKgVnDatpdTBqvwLztb1+te5AckuOnJsnG+iIrG2D
|
||||||
|
Ehoq2O3gktIVdAk4sv2BoONzegLWB+GSxGVZsemfYF4PkN9/w+znz0LK/ATAtabK
|
||||||
|
rikk0yC+Xg8z
|
||||||
|
-----END CERTIFICATE-----
|
||||||
34
test/tlscacert/generate-test-cert.sh
Normal file
34
test/tlscacert/generate-test-cert.sh
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/bash -ex
|
||||||
|
# -*- mode: sh -*-
|
||||||
|
# © Copyright IBM Corporation 2018, 2022
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
KEY=server.key
|
||||||
|
CERT=server.crt
|
||||||
|
CACERT=cacert.crt
|
||||||
|
CAPEM=rootcakey.pem
|
||||||
|
|
||||||
|
# Create a private key and certificate in PEM format, for the server to use
|
||||||
|
openssl req \
|
||||||
|
-newkey rsa:2048 -nodes -keyout ${KEY} \
|
||||||
|
-subj "/CN=localhost" \
|
||||||
|
-addext "subjectAltName = DNS:localhost" \
|
||||||
|
-x509 -days 3650 -out ${CERT}
|
||||||
|
|
||||||
|
# Generate the private key of the root CA
|
||||||
|
openssl genrsa -out ${CAPEM} 2048
|
||||||
|
|
||||||
|
#Generate the self-signed root CA certificate. Manual input is required when prompted
|
||||||
|
openssl req -x509 -sha256 -new -nodes -key ${CAPEM} -days 3650 -out ${CACERT}
|
||||||
|
|
||||||
27
test/tlscacert/rootcakey.pem
Normal file
27
test/tlscacert/rootcakey.pem
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
MIIEowIBAAKCAQEApbN6DSA8cynLdDV1bKM9R54NwXGgz3AUWAjYABMAzlXt6xBG
|
||||||
|
2XdihZYg4Aht4QhzDNWGmm8d4k1bCpJbmwca9SRZsg7YG+M/ZiaTFWF0voLCrGTr
|
||||||
|
P7zUps6beVZWxGnRyif2hX/xFsb6Dj/NFIhHlCbd+mlhVE8o48gK3dsUvHw9QwEx
|
||||||
|
QVNm7Xmln5Kbi3hYk7cH7WYbC79bOU9+fhMdPO3l9bZJv0wK8WbDZf/Ua0lrGyYf
|
||||||
|
7W44kSp/nwmXYqxbLqz90ouSXfZWgltEQSgCmBIeNF2A4Iy4b3Gswz0wbnkx10Dx
|
||||||
|
uUtIQjoQiYglqTwrIfKyDgs9A/WCAcmQA0dVrwIDAQABAoIBAQCcL9ZltPMF4mlh
|
||||||
|
+lnasuu6K+LvafmYTh7+9CcVutPRqfF+1nLR3NRC8sW+JnPb36kCeepMe1yByUR9
|
||||||
|
bINoV4QzebYKPi+56bQCx21wg9IVGRACi4WrKISRTsIB1z4mGVCj6pNWNsi7HYbq
|
||||||
|
E31tUx+VKCWoOdiCLbNvMUn84Npk5npK9P9F86qypSJqJv3HORgOa58x7qZiD2fk
|
||||||
|
TroLuGHKFWGtSiK1vvgax8gBwMi9JvWoPhwHagINh0WwT820+3/4KbqcsvRNSIu8
|
||||||
|
qA+ltk/Vt0ftwPMpxPYnvRFrSvzYIRE04fbWqA3mxhPr/oP3xXrwyd1hnX6GzPIR
|
||||||
|
KXeX1i7BAoGBANGV6XtL8cq8tu/4emOYDn4tncMRICQ8uMWZqnIQAvX8PBx1w9E2
|
||||||
|
Wbkl0oBHJ/gDtU+feDvbHI0JBvXerce2cxj4+793TGLUl980dgq776x2fcxHjvYZ
|
||||||
|
uZjJd4M95Lh+IhtWGZQ1FviiylDg62w+mrNydX8WiFjLGYPydQqCIAAxAoGBAMpl
|
||||||
|
m/MDqpgPxiDU1O9DAq8C/0MQUOc/p+67aGsYxmPDdCouBLA/zckQh6Cp9Wo3n7MF
|
||||||
|
X5UHOqn72q/4ahNEx+3YQoaLqRKTjUHl3r3zj+MsM0hIDp1uOxVzbANxazuLuqqA
|
||||||
|
C+yJTmRU7uvNPH1AMFJBKRSmhd3MJwoHF/KZAhvfAoGAFaGPU3ZnIjGP//x5RUYw
|
||||||
|
WL2EhtmBo7vQpjRR7yvP4muCGL3e0/z0DbPloe+2JFbdo7Ylxqe6rqO74Cx3ayFd
|
||||||
|
h7pK4VwCukCO3C6h8EGtXvNr0GWiT6wgB7DjcNw2ewQpqQCd6zn/gPHsR6SvJ6De
|
||||||
|
fp7VmaRNtjxgCcpAYjFD9EECgYAhEPaofjnZvAH/jSX4rPb8Rr4TY9AD58d03lNR
|
||||||
|
4+tNkzogRgJoFRR2u+ecnQfGQa4qnj8eZt7ztHzm8OvLmBodxo4f0yNdMJQMZxS7
|
||||||
|
7dXdJHSAY51XpRGsEH5eFaKSSOLHRkIsc8ZF6AZcqdwvDlSWq6SdhhMqyFa8cao8
|
||||||
|
7TiF+wKBgADNZ4HoZDfnuH5jUvf7y+YlxDX3jxWR+BUTLCJmt082uT+8Xg5SALec
|
||||||
|
B8GP5s6VKglD5Wzj8IhxvpQ5yzH9DRHwEeu3vFLBinIUlWdBiXwtnbmY0E9r3PSb
|
||||||
|
pZQH5RZ5PyrJicIVBJSqdFu2HDl4heeLJE0LGh7SQnFaexxXn397
|
||||||
|
-----END RSA PRIVATE KEY-----
|
||||||
19
test/tlscacert/server.crt
Normal file
19
test/tlscacert/server.crt
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
MIIDHzCCAgegAwIBAgIUUFCo8fUglrbfDY8ZUDnzAfWeq54wDQYJKoZIhvcNAQEL
|
||||||
|
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMTAwNjEzMDYwMloXDTMyMTAw
|
||||||
|
MzEzMDYwMlowFDESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEF
|
||||||
|
AAOCAQ8AMIIBCgKCAQEAxcja4TbshPj4tWgbRP73eDs2382j6Km5TNej6To13PJq
|
||||||
|
Wyezg081ctmgFEMlgbRiowZmecpYOKjDKuVDtfLE6nZMmN+PjXXuOMGIPu67fx/4
|
||||||
|
tnaMDYw96WIBEFNVZ7dC/pceaTIRbnjma89o1/mTudTAYPLAvKpeBqpJJFWPMDhz
|
||||||
|
nK3NKeydTdUYc9jmEJWiFCI4bUdyvyUjp+7QrDbdODXo27/nVAV0Ih+OuU4ZnxT5
|
||||||
|
cf1fzVV1ZqHd8jbLm25ZoAmkk+9DSXFNA2hbSepf70mRVD/Qyn8U6b5A2v+mWIfs
|
||||||
|
B1+iAlPl7IX88W1Q9q1yu0uT8YWGWpeTbeOnJ4WJ8wIDAQABo2kwZzAdBgNVHQ4E
|
||||||
|
FgQUEjp6AtPmpuLQyBPeiW4pW+VGb2wwHwYDVR0jBBgwFoAUEjp6AtPmpuLQyBPe
|
||||||
|
iW4pW+VGb2wwDwYDVR0TAQH/BAUwAwEB/zAUBgNVHREEDTALgglsb2NhbGhvc3Qw
|
||||||
|
DQYJKoZIhvcNAQELBQADggEBAL2bTWfTqxfN0YbBPjG05sR4nO8mhbNSGHDuGeiO
|
||||||
|
OP0wPxkgAueScTpyhHWEAJmMQOMUM9KhByZj7LnqW8XY9BBS3zPAyzAdia8/o6Vl
|
||||||
|
7El+M2JCfqz7hSupRK8M+r+XUq3hyEFjPLt+KO6D5VNzXiTM+36UueeQD3aaxxyo
|
||||||
|
LpHSPeXFBkOrT/wt6FHi4NHvWls95PllncWZVYjxPMUUF/o30tOxSmgXwjUknrI8
|
||||||
|
29ADKM1IbFuXd4vKYG9V+ukI6n5F86PYrN2ajPBKIidvTqU8tPzMHuJZ3YiIiv8p
|
||||||
|
TARE2b5YLWuu+aF2z/V71MmIWr0uyOk6pZVGOCw7fwHx/wg=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
28
test/tlscacert/server.key
Normal file
28
test/tlscacert/server.key
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDFyNrhNuyE+Pi1
|
||||||
|
aBtE/vd4OzbfzaPoqblM16PpOjXc8mpbJ7ODTzVy2aAUQyWBtGKjBmZ5ylg4qMMq
|
||||||
|
5UO18sTqdkyY34+Nde44wYg+7rt/H/i2dowNjD3pYgEQU1Vnt0L+lx5pMhFueOZr
|
||||||
|
z2jX+ZO51MBg8sC8ql4GqkkkVY8wOHOcrc0p7J1N1Rhz2OYQlaIUIjhtR3K/JSOn
|
||||||
|
7tCsNt04Nejbv+dUBXQiH465ThmfFPlx/V/NVXVmod3yNsubblmgCaST70NJcU0D
|
||||||
|
aFtJ6l/vSZFUP9DKfxTpvkDa/6ZYh+wHX6ICU+XshfzxbVD2rXK7S5PxhYZal5Nt
|
||||||
|
46cnhYnzAgMBAAECggEBAKLRsZZbf6QLzbqRBHntJ04b+RWOlVOQfRHMJ4x1Nig4
|
||||||
|
i+OUsEv1pftxOj3T9QlstRKdzziNociq7VffurkLLJ4TWwUybVu37K9easncABAs
|
||||||
|
ArQ6rRruC32YB2YoJBOoowcw4oEZDY6TCqVP7nB1be46PVDSJmZqHdOA1YuKv8Ci
|
||||||
|
FbzLZEKYy6QGmHp9xMzc3usQ+KRNIFcR3NJb0eCbfAXb0tP3F12i4ygnxifkOVQS
|
||||||
|
hukTJlZVbAO3W9uUEzLh5bkLoPfob6Vrwv1tGQ48uFgzgPXc4bWOUDFXHW5+vQLD
|
||||||
|
1MKFboozrNhRR+Q5xvbRnaWEv4hMHlUNggc5ErRj6CkCgYEA5m5f1VfhfqSvEF2c
|
||||||
|
XcIfUDiCzREpllY2ZdBSfUlz/GA6f0QUyFJBCdd4ypipQcggn60de9DoKDcNcq32
|
||||||
|
rfVfANpsciJq9s4+xLL8MGtUuoi4HK8LHP3tc8aJaAcCVjBFbz0orKXDUOcue6A5
|
||||||
|
Z5riDjiXOE56XSLSSNSRjWh4psUCgYEA27sfaM4J0YkdFuth/Qu+X9PeroUZyC0T
|
||||||
|
3glMN/7PU4jZg+2v4Psfe61gj8qOt0catuWvsD0wQTy3jt+svY/KfkbspK6/7CEG
|
||||||
|
fKx1AB1xeMr4JuQp9POFVhKRn4sBUMbHOkbjzlNpGmUI2arlLRTwT8YpuMDjCK4l
|
||||||
|
ZuUYB/IHOVcCgYAqexqryCHIKTAlAjz7g/gl3+UtTQavsoEg0AEFG++IDW17XN+/
|
||||||
|
9noLCHA6WV6KxAxPo6iV1POXxl5yT+P0OhIjpCDuAa5ahbdIp/6aJo9ePCpFD3gr
|
||||||
|
Bh0qhOV8Ch7CKPAEC/Bds8mINrZ5EBbFJOab3I70UHN6jBrcVmPm/+WOSQKBgQCW
|
||||||
|
AbBWt1qCnu2qCPWzcAH+n8DFOf645vVKPuS20ZEuwR1l8K2ClU4P+/QRFkLKIpO9
|
||||||
|
Sx7e3VcFInNZ6Z+fJfwiqz7AysAhbwZjtMSHWJJv2XkB7AAsxtc/RJv/5ED4qUu3
|
||||||
|
oE/DOrRlHZamKwIb/dB1VZ6ED8Ku2VyVW09FlViTLwKBgEU21xqvP1+TXzsrZNGm
|
||||||
|
/Hj/RAaA8B6tyo5Dj9glV80oakMSaxBsLP9xHkoZjkHaJnoFosKBQSnCcPnEY4gP
|
||||||
|
22WEyGshu8sujLibLKWhARqjeubatXv+XBxiDdMbgcd/XTwbI4HTjXy5LF0o47UI
|
||||||
|
W6itMOg9uCfBJM/i2jrAkmQR
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
@@ -26,7 +26,18 @@ mkdir -p $GOPATH/src/github.com/docker
|
|||||||
cd $GOPATH/src/github.com/docker
|
cd $GOPATH/src/github.com/docker
|
||||||
git clone https://github.com/docker/docker-credential-helpers
|
git clone https://github.com/docker/docker-credential-helpers
|
||||||
cd docker-credential-helpers
|
cd docker-credential-helpers
|
||||||
make pass
|
|
||||||
|
# After https://github.com/docker/docker-credential-helpers/commit/fd0197473f0ecb29e73ccef9028057194ff463bc go 1.18 is required... Pin commit if earlier go installed
|
||||||
|
go_version="$(go version | cut -f3 -d' ')"
|
||||||
|
IFS=. read -a go_version_parts <<<"$go_version"
|
||||||
|
go_major="${go_version_parts[0]##go}"
|
||||||
|
go_minor="${go_version_parts[1]}"
|
||||||
|
if [[ "$go_major" -eq 1 && "$go_minor" -lt 18 ]]; then
|
||||||
|
echo "Go version ${go_major}.${go_minor} < 1.18... Pinning credential-helper commit"
|
||||||
|
git checkout ab7fd12c67d83193072fa91e5648b036547f6323
|
||||||
|
fi
|
||||||
|
|
||||||
|
make pass
|
||||||
cp bin/docker-credential-pass $GOPATH/bin/docker-credential-pass
|
cp bin/docker-credential-pass $GOPATH/bin/docker-credential-pass
|
||||||
mkdir -p /home/travis/.docker
|
mkdir -p /home/travis/.docker
|
||||||
echo '{ "credsStore": "pass" }' | tee /home/travis/.docker/config.json
|
echo '{ "credsStore": "pass" }' | tee /home/travis/.docker/config.json
|
||||||
|
|||||||
4
vendor/modules.txt
vendored
4
vendor/modules.txt
vendored
@@ -36,12 +36,12 @@ github.com/prometheus/procfs/internal/util
|
|||||||
# github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
|
# github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635
|
||||||
## explicit
|
## explicit
|
||||||
github.com/syndtr/gocapability/capability
|
github.com/syndtr/gocapability/capability
|
||||||
# golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f
|
# golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d
|
||||||
## explicit
|
## explicit
|
||||||
golang.org/x/crypto/bcrypt
|
golang.org/x/crypto/bcrypt
|
||||||
golang.org/x/crypto/blowfish
|
golang.org/x/crypto/blowfish
|
||||||
golang.org/x/crypto/pbkdf2
|
golang.org/x/crypto/pbkdf2
|
||||||
# golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40
|
# golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1
|
||||||
## explicit
|
## explicit
|
||||||
golang.org/x/sys/internal/unsafeheader
|
golang.org/x/sys/internal/unsafeheader
|
||||||
golang.org/x/sys/unix
|
golang.org/x/sys/unix
|
||||||
|
|||||||
Reference in New Issue
Block a user