|
| 1 | +# Copyright IBM Corp. 2017 All Rights Reserved. |
| 2 | +# |
| 3 | +# Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | +# you may not use this file except in compliance with the License. |
| 5 | +# You may obtain a copy of the License at |
| 6 | +# |
| 7 | +# http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | +# |
| 9 | +# Unless required by applicable law or agreed to in writing, software |
| 10 | +# distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | +# See the License for the specific language governing permissions and |
| 13 | +# limitations under the License. |
| 14 | +# |
| 15 | + |
| 16 | +import subprocess |
| 17 | +import shutil |
| 18 | + |
| 19 | + |
| 20 | +def getDockerComposeFileArgsFromYamlFile(composeYaml): |
| 21 | + parts = composeYaml.split() |
| 22 | + args = [] |
| 23 | + for part in parts: |
| 24 | + args = args + ["-f"] + [part] |
| 25 | + return args |
| 26 | + |
| 27 | + |
| 28 | +def getLogFiles(containers, fileSuffix): |
| 29 | + """ This will gather the logs for the different component containers as well as |
| 30 | + the chaincode containers. If the containers is a list of strings, it is |
| 31 | + assumed this is a chaincode container list. Otherwise, the list is a list |
| 32 | + of Container objects. |
| 33 | + """ |
| 34 | + for container in containers: |
| 35 | + if isinstance(container, str): |
| 36 | + namePart, sep, _ = container.rpartition("-") |
| 37 | + containerName = container |
| 38 | + else: |
| 39 | + namePart = container.containerName |
| 40 | + containerName = container.containerName |
| 41 | + with open(namePart + fileSuffix, "w+") as logfile: |
| 42 | + rc = subprocess.call(["docker", "logs", containerName], stdout=logfile, stderr=logfile) |
| 43 | + if rc !=0 : |
| 44 | + print("Cannot get logs for {0}. Docker rc = {1}".format(namePart, rc)) |
| 45 | + |
| 46 | + |
| 47 | +def after_scenario(context, scenario): |
| 48 | + getLogs = context.config.userdata.get("logs", "N") |
| 49 | + if getLogs.lower() == "force" or (scenario.status == "failed" and getLogs.lower() == "y" and "compose_containers" in context): |
| 50 | + print("Scenario {0} failed. Getting container logs".format(scenario.name)) |
| 51 | + fileSuffix = "_" + scenario.name.replace(" ", "_") + ".log" |
| 52 | + # get logs from the peer containers |
| 53 | + getLogFiles(containers, fileSuffix) |
| 54 | + # get logs from the chaincode containers |
| 55 | + chaincodeContainers = subprocess.call(["docker", "ps", "-f", "name=dev-", "--format", "{{.Names}}"]) |
| 56 | + getLogFiles(chaincodeContainers.splitlines(), fileSuffix) |
| 57 | + |
| 58 | + if 'doNotDecompose' in scenario.tags: |
| 59 | + if 'compose_yaml' in context: |
| 60 | + print("Not going to decompose after scenario {0}, with yaml '{1}'".format(scenario.name, context.compose_yaml)) |
| 61 | + elif 'composition' in context: |
| 62 | + # Remove config data and docker containers |
| 63 | + shutil.rmtree("configs/%s" % context.composition.projectName) |
| 64 | + context.composition.decompose() |
| 65 | + |
| 66 | +# stop any running peer that could get in the way before starting the tests |
| 67 | +def before_all(context): |
| 68 | + pass |
| 69 | + |
| 70 | +# stop any running peer that could get in the way before starting the tests |
| 71 | +def after_all(context): |
| 72 | + print("context.failed = {0}".format(context.failed)) |
0 commit comments