From e230c04e14db483384a5814695a7d1b8b227c292 Mon Sep 17 00:00:00 2001 From: Troy Ronda Date: Wed, 11 Jul 2018 20:54:27 -0400 Subject: [PATCH] [FAB-11128] Mock chaincode daemon This change adds a pre-built chaincode daemon to speed-up integration tests. When enabled test chaincodes run inside a single mock container. Enablement is controlled by the FABRIC_SDK_CHAINCODED environment passed into make. e.g., FABRIC_SDK_CHAINCODED=true make integration-tests will enable the mock daemon. The CI env is also updated to enable the mock daemon. Change-Id: I42983eacce2a02f0f5b54f20074c2ee041ad2846 Signed-off-by: Troy Ronda --- Makefile | 91 ++++-- .../chaincoded/cmd/chaincoded/chaincoded.go | 258 ++++++++++++++++++ test/fixtures/dockerenv/.env | 1 + .../dockerenv/docker-compose-chaincoded.yaml | 43 +++ .../dockerenv/docker-compose-pkcs11-test.yaml | 2 +- .../dockerenv/docker-compose-std.yaml | 14 + test/fixtures/dockerenv/docker-compose.yaml | 69 ++--- test/fixtures/socat/Dockerfile | 17 ++ test/fixtures/socat/install-socat.sh | 16 ++ .../sdk/channel_client_pvt_test.go | 4 +- test/scripts/chaincoded.sh | 27 ++ test/scripts/clean_integration.sh | 2 +- test/scripts/dependencies.sh | 7 + test/scripts/populate-vendor.sh | 7 + 14 files changed, 491 insertions(+), 67 deletions(-) create mode 100644 scripts/_go/src/chaincoded/cmd/chaincoded/chaincoded.go create mode 100644 test/fixtures/dockerenv/docker-compose-chaincoded.yaml create mode 100644 test/fixtures/dockerenv/docker-compose-std.yaml create mode 100644 test/fixtures/socat/Dockerfile create mode 100644 test/fixtures/socat/install-socat.sh create mode 100755 test/scripts/chaincoded.sh diff --git a/Makefile b/Makefile index 9246ab3e4f..119ae94a21 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,7 @@ GO_TESTFLAGS ?= -count=1 FABRIC_SDK_EXPERIMENTAL ?= true FABRIC_SDK_EXTRA_GO_TAGS ?= FABRIC_SDK_POPULATE_VENDOR ?= true +FABRIC_SDK_CHAINCODED ?= false # Fabric tool versions (overridable) FABRIC_TOOLS_VERSION ?= $(FABRIC_STABLE_VERSION) @@ -71,7 +72,7 @@ THIRDPARTY_FABRIC_COMMIT ?= v1.2.0 FIXTURE_DOCKER_REMOVE_FORCE ?= false # Options for exercising unit tests (overridable) -FABRIC_SDK_DEPRECATED_UNITTEST ?= false +FABRIC_SDK_DEPRECATED_UNITTEST ?= false # Code levels to exercise integration/e2e tests against (overridable) FABRIC_STABLE_INTTEST ?= true @@ -105,16 +106,18 @@ FABRIC_CODELEVEL_UNITTEST_VER ?= $(FABRIC_DEVSTABLE_CODELEVEL_VER) # Local variables used by makefile PACKAGE_NAME := github.com/hyperledger/fabric-sdk-go ARCH := $(shell uname -m) -OS := $(shell uname -s) +OS_NAME := $(shell uname -s) FIXTURE_PROJECT_NAME := fabsdkgo MAKEFILE_THIS := $(lastword $(MAKEFILE_LIST)) THIS_PATH := $(patsubst %/,%,$(dir $(abspath $(MAKEFILE_THIS)))) TEST_SCRIPTS_PATH := test/scripts +SOCAT_DOCKER_IMG := $(shell docker images -q fabsdkgo-socat 2> /dev/null) # Test fixture paths FIXTURE_SCRIPTS_PATH := $(THIS_PATH)/test/scripts FIXTURE_DOCKERENV_PATH := $(THIS_PATH)/test/fixtures/dockerenv FIXTURE_SOFTHSM2_PATH := $(THIS_PATH)/test/fixtures/softhsm2 +FIXTURE_SOCAT_PATH := $(THIS_PATH)/test/fixtures/socat ifneq ($(GO_LDFLAGS),) GO_LDFLAGS_ARG := -ldflags=$(GO_LDFLAGS) @@ -143,11 +146,11 @@ GO_DEP_COMMIT := v0.4.1 # TODO introduce nightly and adjust verify ifdef JENKINS_URL export FABRIC_SDKGO_DEPEND_INSTALL=true - +FABRIC_SDK_CHAINCODED := true FABRIC_SDK_DEPRECATED_UNITTEST := false FABRIC_STABLE_INTTEST := true FABRIC_STABLE_PKCS11_INTTEST := true -FABRIC_STABLE_NEGATIVE_INTTEST := true +FABRIC_STABLE_NEGATIVE_INTTEST := true FABRIC_PREV_INTTEST := true FABRIC_PRERELEASE_INTTEST := false FABRIC_DEVSTABLE_INTTEST := false @@ -155,6 +158,14 @@ FABRIC_STABLE_LOCAL_INTTEST := false FABRIC_DEVSTABLE_LOCAL_INTTEST := false endif +# Determine if use mock chaincode daemon should be used +FABRIC_SDK_ENABLE_CHAINCODED := false +ifneq ($(SOCAT_DOCKER_IMG),) +ifeq ($(FABRIC_SDK_CHAINCODED),true) +FABRIC_SDK_ENABLE_CHAINCODED := true +endif +endif + # Setup Go Tags GO_TAGS := $(FABRIC_SDK_EXTRA_GO_TAGS) ifeq ($(FABRIC_SDK_EXPERIMENTAL),true) @@ -177,6 +188,15 @@ else FABRIC_ARCH := amd64 endif +# Docker-compose +BASE_DOCKER_COMPOSE_FILES := -f ./docker-compose.yaml +ifeq ($(FABRIC_SDK_ENABLE_CHAINCODED),true) +BASE_DOCKER_COMPOSE_FILES := -f ./docker-compose-chaincoded.yaml $(BASE_DOCKER_COMPOSE_FILES) +export CORE_VM_ENDPOINT=http://chaincoded.example.com:2375 +else +BASE_DOCKER_COMPOSE_FILES := -f ./docker-compose-std.yaml $(BASE_DOCKER_COMPOSE_FILES) +endif + # Global environment exported for scripts export GO_CMD export GO_DEP_CMD @@ -220,11 +240,18 @@ lint-all: populate-noforce .PHONY: build-softhsm2-image build-softhsm2-image: - @$(DOCKER_CMD) build --no-cache -q -t "softhsm2-image" \ + @$(DOCKER_CMD) build --no-cache -q -t "fabsdkgo-softhsm2" \ --build-arg FABRIC_BASE_IMAGE=$(FABRIC_BASE_IMAGE) \ --build-arg FABRIC_BASE_TAG=$(FABRIC_BASE_TAG) \ -f $(FIXTURE_SOFTHSM2_PATH)/Dockerfile . +.PHONY: build-socat-image +build-socat-image: + @$(DOCKER_CMD) build --no-cache -q -t "fabsdkgo-socat" \ + --build-arg FABRIC_BASE_IMAGE=$(FABRIC_BASE_IMAGE) \ + --build-arg FABRIC_BASE_TAG=$(FABRIC_BASE_TAG) \ + -f $(FIXTURE_SOCAT_PATH)/Dockerfile . + .PHONY: unit-test unit-test: clean-tests depend-noforce populate-noforce license @TEST_CHANGED_ONLY=true TEST_WITH_LINTER=true FABRIC_SDKGO_CODELEVEL=$(FABRIC_CODELEVEL_UNITTEST_TAG) FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_CODELEVEL_UNITTEST_VER) $(TEST_SCRIPTS_PATH)/unit.sh @@ -242,43 +269,43 @@ unit-tests-pkcs11: clean-tests depend-noforce populate-noforce license .PHONY: integration-tests-stable integration-tests-stable: clean-tests depend-noforce populate-noforce @cd $(FIXTURE_DOCKERENV_PATH) && \ - TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit - @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "-f ./docker-compose.yaml -f ./docker-compose-nopkcs11-test.yaml" + TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit + @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "$(BASE_DOCKER_COMPOSE_FILES) -f ./docker-compose-nopkcs11-test.yaml" .PHONY: integration-tests-prev integration-tests-prev: clean-tests depend-noforce populate-noforce @. $(FIXTURE_DOCKERENV_PATH)/prev-env.sh && \ cd $(FIXTURE_DOCKERENV_PATH) && \ - TEST_CHANGED_ONLY=true E2E_ONLY="true" FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_PREV_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_PREV_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit - @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "-f ./docker-compose.yaml -f ./docker-compose-nopkcs11-test.yaml" + TEST_CHANGED_ONLY=true E2E_ONLY="true" FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_PREV_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_PREV_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit + @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "$(BASE_DOCKER_COMPOSE_FILES) -f ./docker-compose-nopkcs11-test.yaml" .PHONY: integration-tests-prerelease integration-tests-prerelease: clean-tests depend-noforce populate-noforce @. $(FIXTURE_DOCKERENV_PATH)/prerelease-env.sh && \ cd $(FIXTURE_DOCKERENV_PATH) && \ - TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_PRERELEASE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_PRERELEASE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit - @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "-f ./docker-compose.yaml -f ./docker-compose-nopkcs11-test.yaml" + TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_PRERELEASE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_PRERELEASE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit + @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "$(BASE_DOCKER_COMPOSE_FILES) -f ./docker-compose-nopkcs11-test.yaml" .PHONY: integration-tests-devstable integration-tests-devstable: clean-tests depend-noforce populate-noforce @. $(FIXTURE_DOCKERENV_PATH)/devstable-env.sh && \ $(FABRIC_DEV_REGISTRY_PRE_CMD) && \ cd $(FIXTURE_DOCKERENV_PATH) && \ - TEST_CHANGED_ONLY=true FABRIC_FIXTURE_VERSION=v$(FABRIC_DEVSTABLE_VERSION_MINOR) FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit - @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "-f ./docker-compose.yaml -f ./docker-compose-nopkcs11-test.yaml" + TEST_CHANGED_ONLY=true FABRIC_FIXTURE_VERSION=v$(FABRIC_DEVSTABLE_VERSION_MINOR) FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit + @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "$(BASE_DOCKER_COMPOSE_FILES) -f ./docker-compose-nopkcs11-test.yaml" .PHONY: integration-tests-stable-negative integration-tests-stable-revoked: clean-tests depend-noforce populate-noforce @cd $(FIXTURE_DOCKERENV_PATH) && \ - TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml -f docker-compose-negative.yaml up --force-recreate --abort-on-container-exit - @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "-f ./docker-compose.yaml -f ./docker-compose-negative.yaml" + TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) -f docker-compose-negative.yaml up --force-recreate --abort-on-container-exit + @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "$(BASE_DOCKER_COMPOSE_FILES) -f ./docker-compose-negative.yaml" .PHONY: integration-tests-stable-pkcs11 integration-tests-stable-pkcs11: clean-tests depend-noforce populate-noforce build-softhsm2-image @. $(FIXTURE_DOCKERENV_PATH)/nomutualtls-env.sh && \ cd $(FIXTURE_DOCKERENV_PATH) && \ - TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml -f docker-compose-pkcs11-test.yaml up --force-recreate --abort-on-container-exit - @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "-f ./docker-compose.yaml -f ./docker-compose-pkcs11-test.yaml" + TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) -f docker-compose-pkcs11-test.yaml up --force-recreate --abort-on-container-exit + @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "$(BASE_DOCKER_COMPOSE_FILES) -f ./docker-compose-pkcs11-test.yaml" # Additional test cases that aren't currently run by the CI .PHONY: integration-tests-devstable-nomutualtls @@ -287,8 +314,8 @@ integration-tests-devstable-nomutualtls: clean-tests depend-noforce populate-nof . $(FIXTURE_DOCKERENV_PATH)/nomutualtls-env.sh && \ $(FABRIC_DEV_REGISTRY_PRE_CMD) && \ cd $(FIXTURE_DOCKERENV_PATH) && \ - TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit - @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "-f ./docker-compose.yaml -f ./docker-compose-nopkcs11-test.yaml" + TEST_CHANGED_ONLY=true FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) -f docker-compose-nopkcs11-test.yaml up --force-recreate --abort-on-container-exit + @cd $(FIXTURE_DOCKERENV_PATH) && FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(FIXTURE_SCRIPTS_PATH)/check_status.sh "$(BASE_DOCKER_COMPOSE_FILES) -f ./docker-compose-nopkcs11-test.yaml" .PHONY: integration-tests integration-tests: integration-test @@ -337,47 +364,47 @@ integration-tests-local: clean-temp depend-noforce populate-noforce .PHONY: integration-tests-stable-local integration-tests-stable-local: clean-temp depend-noforce populate-noforce @cd $(FIXTURE_DOCKERENV_PATH) && \ - FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml up -d --force-recreate + FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) up -d --force-recreate FABRIC_CRYPTOCONFIG_VERSION=$(FABRIC_CRYPTOCONFIG_VER) FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_CODELEVEL_TAG) TEST_LOCAL=true $(TEST_SCRIPTS_PATH)/integration.sh - @cd $(FIXTURE_DOCKERENV_PATH) && $(DOCKER_COMPOSE_CMD) down + @cd $(FIXTURE_DOCKERENV_PATH) && $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) down .PHONY: integration-tests-devstable-local integration-tests-devstable-local: clean-temp depend-noforce populate-noforce @. $(FIXTURE_DOCKERENV_PATH)/devstable-env.sh && \ $(FABRIC_DEV_REGISTRY_PRE_CMD) && \ cd $(FIXTURE_DOCKERENV_PATH) && \ - FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml up -d --force-recreate + FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) up -d --force-recreate FABRIC_FIXTURE_VERSION=v$(FABRIC_DEVSTABLE_VERSION_MINOR) FABRIC_CRYPTOCONFIG_VERSION=$(FABRIC_CRYPTOCONFIG_VER) FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) TEST_LOCAL=true $(TEST_SCRIPTS_PATH)/integration.sh - @cd $(FIXTURE_DOCKERENV_PATH) && $(DOCKER_COMPOSE_CMD) down + @cd $(FIXTURE_DOCKERENV_PATH) && $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) down .PHONY: dockerenv-prev-up dockerenv-prev-up: clean-tests @cd $(FIXTURE_DOCKERENV_PATH) && \ - FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_PREV_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_PREV_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml up --force-recreate + FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_PREV_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_PREV_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) up --force-recreate .PHONY: dockerenv-stable-up dockerenv-stable-up: clean-tests @cd $(FIXTURE_DOCKERENV_PATH) && \ - FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml up --force-recreate + FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_STABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_STABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) up --force-recreate .PHONY: dockerenv-prerelease-up dockerenv-prerelease-up: clean-tests @cd $(FIXTURE_DOCKERENV_PATH) && \ - FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_PRERELEASE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_PRERELEASE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml up --force-recreate + FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_PRERELEASE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_PRERELEASE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_RELEASE_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) up --force-recreate .PHONY: dockerenv-devstable-up dockerenv-devstable-up: clean-tests @. $(FIXTURE_DOCKERENV_PATH)/devstable-env.sh && \ $(FABRIC_DEV_REGISTRY_PRE_CMD) && \ cd $(FIXTURE_DOCKERENV_PATH) && \ - FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml up --force-recreate + FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY=$(FABRIC_DEV_REGISTRY) $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) up --force-recreate .PHONY: dockerenv-latest-up dockerenv-latest-up: clean-tests @. $(FIXTURE_DOCKERENV_PATH)/devstable-env.sh && \ . $(FIXTURE_DOCKERENV_PATH)/latest-env.sh && \ cd $(FIXTURE_DOCKERENV_PATH) && \ - FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY="" $(DOCKER_COMPOSE_CMD) -f docker-compose.yaml up --force-recreate + FABRIC_SDKGO_CODELEVEL_VER=$(FABRIC_DEVSTABLE_CODELEVEL_VER) FABRIC_SDKGO_CODELEVEL_TAG=$(FABRIC_DEVSTABLE_CODELEVEL_TAG) FABRIC_DOCKER_REGISTRY="" $(DOCKER_COMPOSE_CMD) $(BASE_DOCKER_COMPOSE_FILES) up --force-recreate .PHONY: mock-gen mock-gen: @@ -461,15 +488,21 @@ clean: clean-temp clean-fixtures clean-cache clean-populate .PHONY: clean-populate clean-populate: rm -Rf vendor + rm -Rf scripts/_go/src/chaincoded/vendor .PHONY: clean-cache clean-cache: -ifeq ($(OS),Darwin) +ifeq ($(OS_NAME),Darwin) rm -Rf ${HOME}/Library/Caches/fabric-sdk-go else rm -Rf ${HOME}/.cache/fabric-sdk-go endif +.PHONY: clean-depend-images +clean-depend-images: clean-tests + docker rmi -f fabsdkgo-socat + docker rmi -f fabsdkgo-softhsm2 + .PHONY: clean-fixtures clean-fixtures: -$(GO_CMD) clean diff --git a/scripts/_go/src/chaincoded/cmd/chaincoded/chaincoded.go b/scripts/_go/src/chaincoded/cmd/chaincoded/chaincoded.go new file mode 100644 index 0000000000..b04648b6c5 --- /dev/null +++ b/scripts/_go/src/chaincoded/cmd/chaincoded/chaincoded.go @@ -0,0 +1,258 @@ +/* +Copyright SecureKey Technologies Inc. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package main + +import ( + "archive/tar" + "compress/gzip" + "io" + "io/ioutil" + "log" + "net/http" + "net/http/httputil" + "net/url" + "os" + "os/exec" + "path" + "regexp" + "strings" +) + +const ( + defaultDockerHost = "http://localhost:2375" +) + +var ( + binaryRegExp = regexp.MustCompile("(.*)_(.*)") + containerNameRegEx = regexp.MustCompile("(.*)-(.*)-(.*)-(.*)") + containerStartRegEx = regexp.MustCompile("/containers/(.+)/start") + containerUploadRegEx = regexp.MustCompile("/containers/(.+)/archive") +) + +var peerEndpoints map[string]string + +type chaincoded struct { + proxy *httputil.ReverseProxy +} + +type chaincodeParams struct { + network string + hostname string + ccID string + ccVersion string +} + +func newChaincoded() *chaincoded { + docker_host, ok := os.LookupEnv("DOCKER_HOST") + if !ok { + docker_host = defaultDockerHost + } + + url, err := url.Parse(docker_host) + if err != nil { + log.Fatalf("invalid URL for docker host: %s", err) + } + + proxy := httputil.NewSingleHostReverseProxy(url) + + d := chaincoded{ + proxy: proxy, + } + + return &d +} + +func launchChaincode(ccParams *chaincodeParams, tlsPath string) error { + rootCertFile := path.Join(tlsPath, "peer.crt") + keyPath := path.Join(tlsPath, "client.key") + certPath := path.Join(tlsPath, "client.crt") + + cmd := exec.Command(ccParams.chaincodeBinary(), tlsPath) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + cmd.Env = append(os.Environ(), + "CORE_PEER_ADDRESS="+ccParams.peerAddr(), + "CORE_CHAINCODE_ID_NAME="+ccParams.chaincodeID(), + "CORE_PEER_TLS_ENABLED=TRUE", + "CORE_PEER_TLS_ROOTCERT_FILE="+rootCertFile, + "CORE_TLS_CLIENT_KEY_PATH="+keyPath, + "CORE_TLS_CLIENT_CERT_PATH="+certPath, + ) + + if err := cmd.Start(); err != nil { + return err + } + + return nil +} + +func extractChaincodeParams(containerName string) (*chaincodeParams, bool) { + m := containerNameRegEx.FindStringSubmatch(containerName) + + if m == nil { + return nil, false + } + + ccParams := chaincodeParams{ + network: m[1], + hostname: m[2], + ccID: m[3], + ccVersion: m[4], + } + + return &ccParams, true +} + +func (cp *chaincodeParams) chaincodeID() string { + return cp.ccID + ":" + cp.ccVersion +} + +func (cp *chaincodeParams) chaincodeBinary() string { + m := binaryRegExp.FindStringSubmatch(cp.ccID) + + if m == nil { + return "example_cc" + } + + return m[1] +} + +func (cp *chaincodeParams) peerAddr() string { + endpoint, ok := peerEndpoints[cp.hostname] + if !ok { + return "localhost:7052" + } + + return endpoint +} + +func (d *chaincoded) handleUploadToContainerRequest(w http.ResponseWriter, r *http.Request, containerName string) { + ccParams, ok := extractChaincodeParams(containerName) + if !ok { + d.proxy.ServeHTTP(w, r) + return + } + + log.Printf("Handling upload to container request [%s]", containerName) + tmpDir, err := ioutil.TempDir("", "chaincoded") + if err != nil { + log.Printf("creation of temporary directory failed: %s", err) + w.WriteHeader(500) + return + } + + err = extractArchive(r.Body, tmpDir) + if err != nil { + log.Printf("extracting archive failed: %s", err) + w.WriteHeader(500) + return + } + + tlsPath := path.Join(tmpDir, "etc", "hyperledger", "fabric") + err = launchChaincode(ccParams, tlsPath) + if err != nil { + log.Printf("launching chaincode failed: %s", err) + w.WriteHeader(500) + return + } + + w.WriteHeader(200) +} + +func (d *chaincoded) handleStartContainerRequest(w http.ResponseWriter, r *http.Request, containerName string) { + log.Printf("Handling start container request [%s]", containerName) + w.WriteHeader(204) +} + +func extractArchive(in io.Reader, basePath string) error { + gr, err := gzip.NewReader(in) + if err != nil { + return err + } + defer gr.Close() + + tr := tar.NewReader(gr) + for { + hdr, err := tr.Next() + if err == io.EOF { + break + } + if err != nil { + return err + } + + switch hdr.Typeflag { + case tar.TypeDir: + outPath := path.Join(basePath, hdr.Name) + + if err := os.Mkdir(outPath, 0755); err != nil { + return err + } + case 0: + fallthrough + case tar.TypeReg: + outPath := path.Join(basePath, hdr.Name) + + dir := path.Dir(outPath) + if err := os.MkdirAll(dir, 0755); err != nil { + return err + } + + outFile, err := os.Create(outPath) + if err != nil { + return err + } + if _, err := io.Copy(outFile, tr); err != nil { + outFile.Close() + return err + } + outFile.Close() + } + } + return nil +} + +func (d *chaincoded) ServeHTTP(w http.ResponseWriter, r *http.Request) { + startMatches := containerStartRegEx.FindStringSubmatch(r.URL.Path) + uploadMatches := containerUploadRegEx.FindStringSubmatch(r.URL.Path) + + if startMatches != nil { + d.handleStartContainerRequest(w, r, startMatches[1]) + } else if uploadMatches != nil { + d.handleUploadToContainerRequest(w, r, uploadMatches[1]) + } else { + d.proxy.ServeHTTP(w, r) + } +} + +func main() { + + const cmdHelp = "arguments are the listen addr followed by a list of chaincode endpoints (hostname:port)" + peerEndpoints = make(map[string]string) + + if len(os.Args) < 2 { + log.Fatal(cmdHelp) + } + + addr := os.Args[1] + log.Printf("Chaincoded starting on %s ...", addr) + + for _, endpoint := range os.Args[2:] { + s := strings.Split(endpoint, ":") + if len(s) != 2 { + log.Fatal(cmdHelp) + } + peerEndpoints[s[0]] = endpoint + } + + dh := newChaincoded() + err := http.ListenAndServe(addr, dh) + + if err != nil { + log.Fatalf("%s", err) + } +} diff --git a/test/fixtures/dockerenv/.env b/test/fixtures/dockerenv/.env index 454075a5f3..179a0c9144 100644 --- a/test/fixtures/dockerenv/.env +++ b/test/fixtures/dockerenv/.env @@ -37,6 +37,7 @@ FABRIC_BUILDER_FIXTURE_IMAGE=hyperledger/fabric-ccenv FABRIC_BASEOS_FIXTURE_IMAGE=hyperledger/fabric-baseos FABRIC_BASEIMAGE_FIXTURE_IMAGE=hyperledger/fabric-baseimage +CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock CORE_PEER_TLS_CLIENTAUTHREQUIRED=true CORE_PEER_TLS_CLIENTROOTCAS_FILES=/etc/hyperledger/tls/peer/ca.crt /etc/hyperledger/mutual_tls/peer/client_sdk_go-ca_root.pem ORDERER_GENERAL_TLS_CLIENTAUTHENABLED=true diff --git a/test/fixtures/dockerenv/docker-compose-chaincoded.yaml b/test/fixtures/dockerenv/docker-compose-chaincoded.yaml new file mode 100644 index 0000000000..e1589ed606 --- /dev/null +++ b/test/fixtures/dockerenv/docker-compose-chaincoded.yaml @@ -0,0 +1,43 @@ +# +# Copyright SecureKey Technologies Inc. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +version: '2' + +services: + + dockerd: + image: fabsdkgo-socat + command: TCP-LISTEN:2375,fork UNIX-CONNECT:/host/var/run/docker.sock + volumes: + - /var/run/:/host/var/run/ + expose: + - "2375" + networks: + default: + aliases: + - dockerd.example.com + + chaincoded: + image: ${FABRIC_DOCKER_REGISTRY}${FABRIC_BASEIMAGE_FIXTURE_IMAGE}:${FABRIC_ARCH}${FABRIC_ARCH_SEP}${FABRIC_BASEIMAGE_FIXTURE_TAG} + environment: + - DOCKER_HOST=http://dockerd.example.com:2375 + #- CORE_CHAINCODE_LOGGING_LEVEL=debug + volumes: + - ../../../scripts/_go/src/chaincoded:/opt/gopath/src/chaincoded + - ../../../:/opt/gopath/src/github.com/hyperledger/fabric-sdk-go + - ../../../test/fixtures/testdata/src/github.com/example_cc:/opt/gopath/src/github.com/example_cc + - ../../../test/fixtures/testdata/src/github.com/example_pvt_cc:/opt/gopath/src/github.com/example_pvt_cc + command: /opt/gopath/src/github.com/hyperledger/fabric-sdk-go/test/scripts/chaincoded.sh + #comment out logging.driver in order to render the debug logs + logging: + driver: none + networks: + default: + aliases: + - chaincoded.example.com + expose: + - "2375" + depends_on: + - dockerd \ No newline at end of file diff --git a/test/fixtures/dockerenv/docker-compose-pkcs11-test.yaml b/test/fixtures/dockerenv/docker-compose-pkcs11-test.yaml index fca612ecc1..6e962964f5 100644 --- a/test/fixtures/dockerenv/docker-compose-pkcs11-test.yaml +++ b/test/fixtures/dockerenv/docker-compose-pkcs11-test.yaml @@ -8,7 +8,7 @@ version: '2' services: pkcs11-integration-tests: - image: softhsm2-image + image: fabsdkgo-softhsm2 environment: - FABRIC_SDK_CLIENT_BCCSP_SECURITY_DEFAULT_PROVIDER=PKCS11 - GO_TAGS diff --git a/test/fixtures/dockerenv/docker-compose-std.yaml b/test/fixtures/dockerenv/docker-compose-std.yaml new file mode 100644 index 0000000000..0e967c073b --- /dev/null +++ b/test/fixtures/dockerenv/docker-compose-std.yaml @@ -0,0 +1,14 @@ +# +# Copyright SecureKey Technologies Inc. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +version: '2' + +services: + + chaincoded: + image: ${FABRIC_DOCKER_REGISTRY}${FABRIC_BASEIMAGE_FIXTURE_IMAGE}:${FABRIC_ARCH}${FABRIC_ARCH_SEP}${FABRIC_BASEIMAGE_FIXTURE_TAG} + command: tail -F anything + logging: + driver: none diff --git a/test/fixtures/dockerenv/docker-compose.yaml b/test/fixtures/dockerenv/docker-compose.yaml index 4c6e8bc7b4..d59d3330c0 100644 --- a/test/fixtures/dockerenv/docker-compose.yaml +++ b/test/fixtures/dockerenv/docker-compose.yaml @@ -73,7 +73,7 @@ services: - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/tls/orderer/ca.crt] - ORDERER_GENERAL_TLS_CLIENTAUTHENABLED - ORDERER_GENERAL_TLS_CLIENTROOTCAS - #comment out logging.driver in order to render the debug logs + #comment out logging.driver in order to render the debug logs logging: driver: none working_dir: /opt/gopath/src/github.com/hyperledger/fabric/orderer @@ -81,10 +81,10 @@ services: ports: - 7050:7050 volumes: - - ../fabric/${FABRIC_FIXTURE_VERSION}/channel:/etc/hyperledger/configtx - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/etc/hyperledger/msp/orderer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls:/etc/hyperledger/tls/orderer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/orderer + - ../fabric/${FABRIC_FIXTURE_VERSION}/channel:/etc/hyperledger/configtx + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/etc/hyperledger/msp/orderer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls:/etc/hyperledger/tls/orderer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/orderer networks: default: aliases: @@ -93,7 +93,7 @@ services: org1peer1: image: ${FABRIC_DOCKER_REGISTRY}${FABRIC_PEER_FIXTURE_IMAGE}:${FABRIC_ARCH}${FABRIC_ARCH_SEP}${FABRIC_PEER_FIXTURE_TAG} environment: - - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - CORE_VM_ENDPOINT - CORE_PEER_ID=peer0.org1.example.com - CORE_LOGGING_PEER=debug # - CORE_LOGGING_GRPC=debug @@ -125,8 +125,8 @@ services: # # bridge network as the peers # # https://docs.docker.com/compose/networking/ - CORE_PEER_NETWORKID=${CORE_PEER_NETWORKID} - - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${CORE_PEER_NETWORKID}_default - #comment out logging.driver in order to render the debug logs + - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${CORE_PEER_NETWORKID}_default + #comment out logging.driver in order to render the debug logs logging: driver: none working_dir: /opt/gopath/src/github.com/hyperledger/fabric @@ -139,10 +139,10 @@ services: - "7052" - "7053" volumes: - - /var/run/:/host/var/run/ - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/msp/peer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/tls/peer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/peer + - /var/run/:/host/var/run/ + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/msp/peer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/tls/peer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/peer networks: default: aliases: @@ -151,11 +151,12 @@ services: - orderer1 - builder - golangruntime + - chaincoded org1peer2: image: ${FABRIC_DOCKER_REGISTRY}${FABRIC_PEER_FIXTURE_IMAGE}:${FABRIC_ARCH}${FABRIC_ARCH_SEP}${FABRIC_PEER_FIXTURE_TAG} environment: - - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - CORE_VM_ENDPOINT - CORE_PEER_ID=peer1.org1.example.com - CORE_LOGGING_PEER=debug # - CORE_LOGGING_GRPC=debug @@ -201,10 +202,10 @@ services: - "7152" - "7153" volumes: - - /var/run/:/host/var/run/ - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/msp/peer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/tls/peer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/peer + - /var/run/:/host/var/run/ + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp:/etc/hyperledger/msp/peer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/tls:/etc/hyperledger/tls/peer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/peer networks: default: aliases: @@ -213,11 +214,12 @@ services: - orderer1 - builder - golangruntime + - chaincoded org2peer1: image: ${FABRIC_DOCKER_REGISTRY}${FABRIC_PEER_FIXTURE_IMAGE}:${FABRIC_ARCH}${FABRIC_ARCH_SEP}${FABRIC_PEER_FIXTURE_TAG} environment: - - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - CORE_VM_ENDPOINT - CORE_PEER_ID=peer0.org2.example.com - CORE_LOGGING_PEER=debug #- CORE_LOGGING_MSP=debug @@ -235,7 +237,7 @@ services: - CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/peer/ - CORE_PEER_LISTENADDRESS=peer0.org2.example.com:8051 - CORE_PEER_ADDRESS=peer0.org2.example.com:8051 - - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:7052 + - CORE_PEER_CHAINCODELISTENADDRESS=peer0.org2.example.com:8052 - CORE_PEER_ADDRESSAUTODETECT=true - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org2.example.com:9051 - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:8051 @@ -250,7 +252,7 @@ services: # # bridge network as the peers # # https://docs.docker.com/compose/networking/ - CORE_PEER_NETWORKID=${CORE_PEER_NETWORKID} - - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${CORE_PEER_NETWORKID}_default + - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${CORE_PEER_NETWORKID}_default #comment out logging.driver in order to render the debug logs logging: driver: none @@ -261,13 +263,13 @@ services: - "8053:8053" expose: - "8051" - - "7052" + - "8052" - "8053" volumes: - - /var/run/:/host/var/run/ - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/msp/peer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/tls/peer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/peer + - /var/run/:/host/var/run/ + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/msp:/etc/hyperledger/msp/peer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls:/etc/hyperledger/tls/peer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/peer networks: default: aliases: @@ -276,11 +278,12 @@ services: - orderer1 - builder - golangruntime + - chaincoded org2peer2: image: ${FABRIC_DOCKER_REGISTRY}${FABRIC_PEER_FIXTURE_IMAGE}:${FABRIC_ARCH}${FABRIC_ARCH_SEP}${FABRIC_PEER_FIXTURE_TAG} environment: - - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock + - CORE_VM_ENDPOINT - CORE_PEER_ID=peer1.org2.example.com - CORE_LOGGING_PEER=debug #- CORE_LOGGING_MSP=debug @@ -313,7 +316,7 @@ services: # # bridge network as the peers # # https://docs.docker.com/compose/networking/ - CORE_PEER_NETWORKID=${CORE_PEER_NETWORKID} - - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${CORE_PEER_NETWORKID}_default + - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=${CORE_PEER_NETWORKID}_default #comment out logging.driver in order to render the debug logs logging: driver: none @@ -327,10 +330,10 @@ services: - "9052" - "9053" volumes: - - /var/run/:/host/var/run/ - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/msp/peer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/tls/peer - - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/peer + - /var/run/:/host/var/run/ + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/msp:/etc/hyperledger/msp/peer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/tls:/etc/hyperledger/tls/peer + - ../fabric/${FABRIC_CRYPTOCONFIG_VERSION}/mutual_tls:/etc/hyperledger/mutual_tls/peer networks: default: aliases: @@ -339,9 +342,7 @@ services: - orderer1 - builder - golangruntime - - - + - chaincoded # builder is only here to create a dependency on the image (not used as part of compose) builder: diff --git a/test/fixtures/socat/Dockerfile b/test/fixtures/socat/Dockerfile new file mode 100644 index 0000000000..5ed2b98b2d --- /dev/null +++ b/test/fixtures/socat/Dockerfile @@ -0,0 +1,17 @@ +# +# Copyright SecureKey Technologies Inc. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# +ARG FABRIC_BASE_IMAGE=hyperledger/fabric-baseimage +ARG FABRIC_BASE_TAG + +FROM ${FABRIC_BASE_IMAGE}:${FABRIC_BASE_TAG} + +ENV GOPATH=/opt/gopath \ + GOROOT=/opt/go \ + PATH=$PATH:/opt/go/bin:/opt/gopath/bin + +COPY test/fixtures/socat/install-socat.sh /tmp +RUN bash /tmp/install-socat.sh +ENTRYPOINT ["socat"] \ No newline at end of file diff --git a/test/fixtures/socat/install-socat.sh b/test/fixtures/socat/install-socat.sh new file mode 100644 index 0000000000..cada82b995 --- /dev/null +++ b/test/fixtures/socat/install-socat.sh @@ -0,0 +1,16 @@ +# +# Copyright SecureKey Technologies Inc. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# + +set -xe + +ARCH=`uname -m` + +if [ $ARCH = "s390x" ]; then + echo "deb http://ftp.us.debian.org/debian sid main" >> /etc/apt/sources.list +fi + +apt-get update +apt-get install -y --no-install-recommends socat \ No newline at end of file diff --git a/test/integration/sdk/channel_client_pvt_test.go b/test/integration/sdk/channel_client_pvt_test.go index 785ce89750..45738dc7e6 100644 --- a/test/integration/sdk/channel_client_pvt_test.go +++ b/test/integration/sdk/channel_client_pvt_test.go @@ -38,7 +38,7 @@ func TestPrivateData(t *testing.T) { require.NoError(t, err) coll1 := "collection1" - ccID := integration.GenerateRandomID() + ccID := "example_pvt_cc" + "_" + integration.GenerateRandomID() collConfig, err := newCollectionConfig(coll1, "OR('Org2MSP.member')", 0, 2, 1000) require.NoError(t, err) err = integration.InstallAndInstantiateChaincode(orgChannelID, ccPkg, ccPath, ccID, ccVersion, "OR('Org1MSP.member','Org2MSP.member')", orgsContext, collConfig) @@ -99,7 +99,7 @@ func TestPrivateDataWithOrgDown(t *testing.T) { require.NoError(t, err) coll1 := "collection1" - ccID := integration.GenerateRandomID() + ccID := "example_pvt_cc" + "_" + integration.GenerateRandomID() collConfig, err := newCollectionConfig(coll1, "OR('Org3MSP.member')", 0, 2, 1000) require.NoError(t, err) err = integration.InstallAndInstantiateChaincode(orgChannelID, ccPkg, ccPath, ccID, ccVersion, "OR('Org1MSP.member','Org2MSP.member','Org3MSP.member')", orgsContext, collConfig) diff --git a/test/scripts/chaincoded.sh b/test/scripts/chaincoded.sh new file mode 100755 index 0000000000..5f95b095a2 --- /dev/null +++ b/test/scripts/chaincoded.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# +# Copyright SecureKey Technologies Inc. All Rights Reserved. +# +# SPDX-License-Identifier: Apache-2.0 +# + +set -e + +GO_CMD="${GO_CMD:-go}" +GOPATH="${GOPATH:-$HOME/go}" + +mkdir -p ${GOPATH}/src/github.com/hyperledger +ln -s ${GOPATH}/src/chaincoded/vendor/github.com/hyperledger/fabric ${GOPATH}/src/github.com/hyperledger/fabric + +go install github.com/example_cc +go install github.com/example_pvt_cc +go install chaincoded/cmd/chaincoded + +PEERS=( + peer0.org1.example.com:7052 + peer1.org1.example.com:7152 + peer0.org2.example.com:8052 + peer1.org2.example.com:9052 +) + +chaincoded ":2375" ${PEERS[@]} \ No newline at end of file diff --git a/test/scripts/clean_integration.sh b/test/scripts/clean_integration.sh index 227f3fdfb4..5b82bbdcd4 100755 --- a/test/scripts/clean_integration.sh +++ b/test/scripts/clean_integration.sh @@ -14,7 +14,7 @@ SCRIPT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" rm -f ${SCRIPT_PATH}/../fixtures/fabricca/tls/certs/server/ca.org*.example.com-cert.pem echo "Removing docker-compose network created from fixtures ..." -COMPOSE_PROJECT_NAME=FIXTURE_PROJECT_NAME cd ${SCRIPT_PATH}/../fixtures/dockerenv && $DOCKER_COMPOSE_CMD -f docker-compose.yaml -f docker-compose-nopkcs11-test.yaml -f docker-compose-pkcs11-test.yaml down +COMPOSE_PROJECT_NAME=FIXTURE_PROJECT_NAME cd ${SCRIPT_PATH}/../fixtures/dockerenv && $DOCKER_COMPOSE_CMD -f docker-compose-chaincoded.yaml -f docker-compose.yaml -f docker-compose-nopkcs11-test.yaml -f docker-compose-pkcs11-test.yaml down DOCKER_REMOVE_ARGS= if [ "$DOCKER_REMOVE_FORCE" = "true" ]; then diff --git a/test/scripts/dependencies.sh b/test/scripts/dependencies.sh index 4b16c4d902..1be7e4a5ce 100755 --- a/test/scripts/dependencies.sh +++ b/test/scripts/dependencies.sh @@ -216,6 +216,12 @@ function installDependencies { rm -Rf ${BUILD_TMP} } +function buildDockerImages { + echo "Creating docker images used by tests ..." + make build-socat-image + make build-softhsm2-image +} + function isForceMode { if [ "${BASH_ARGV[0]}" != "-f" ]; then return 1 @@ -226,6 +232,7 @@ setCachePath if ! isDependencyCurrent || ! isDependenciesInstalled false || isForceMode; then installDependencies + buildDockerImages else echo "No need to install dependencies" fi diff --git a/test/scripts/populate-vendor.sh b/test/scripts/populate-vendor.sh index 72f2434fcb..bc81a927e6 100755 --- a/test/scripts/populate-vendor.sh +++ b/test/scripts/populate-vendor.sh @@ -93,6 +93,13 @@ function isForceMode { function populateVendor { echo "Populating vendor ..." ${GO_DEP_CMD} ensure -vendor-only + + echo "Populating dockerd vendor ..." + declare chaincodedPath="scripts/_go/src/chaincoded" + rm -Rf ${chaincodedPath}/vendor/ + mkdir -p ${chaincodedPath}/vendor/github.com/hyperledger/fabric + git clone --branch release-1.2 --depth=1 https://github.com/hyperledger/fabric.git ${chaincodedPath}/vendor/github.com/hyperledger/fabric + } setCachePath