github.com/leonlxy/hyperledger@v1.0.0-alpha.0.20170427033203-34922035d248/bddtests/steps/bdd_test_util.py (about) 1 2 # Copyright IBM Corp. 2016 All Rights Reserved. 3 # 4 # Licensed under the Apache License, Version 2.0 (the "License"); 5 # you may not use this file except in compliance with the License. 6 # You may obtain a copy of the License at 7 # 8 # http://www.apache.org/licenses/LICENSE-2.0 9 # 10 # Unless required by applicable law or agreed to in writing, software 11 # distributed under the License is distributed on an "AS IS" BASIS, 12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 # See the License for the specific language governing permissions and 14 # limitations under the License. 15 # 16 17 import os 18 import re 19 import subprocess 20 21 def cli_call(arg_list, expect_success=True, env=os.environ.copy()): 22 """Executes a CLI command in a subprocess and return the results. 23 24 @param arg_list: a list command arguments 25 @param expect_success: use False to return even if an error occurred when executing the command 26 @return: (string, string, int) output message, error message, return code 27 """ 28 # We need to run the cli command by actually calling the python command 29 # the update-cli.py script has a #!/bin/python as the first line 30 # which calls the system python, not the virtual env python we 31 # setup for running the update-cli 32 p = subprocess.Popen(arg_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) 33 output, error = p.communicate() 34 if p.returncode != 0: 35 if output is not None: 36 print("Output:\n" + output) 37 if error is not None: 38 print("Error Message:\n" + error) 39 if expect_success: 40 raise subprocess.CalledProcessError(p.returncode, arg_list, output) 41 return output, error, p.returncode 42 43 class UserRegistration: 44 def __init__(self, secretMsg, composeService): 45 self.secretMsg = secretMsg 46 self.composeService = composeService 47 self.tags = {} 48 self.lastResult = None 49 50 def getUserName(self): 51 return self.secretMsg['enrollId'] 52 53 # Registerses a user on a specific composeService 54 def registerUser(context, secretMsg, composeService): 55 userName = secretMsg['enrollId'] 56 if 'users' in context: 57 pass 58 else: 59 context.users = {} 60 if userName in context.users: 61 raise Exception("User already registered: {0}".format(userName)) 62 context.users[userName] = UserRegistration(secretMsg, composeService) 63 64 # Registerses a user on a specific composeService 65 def getUserRegistration(context, enrollId): 66 userRegistration = None 67 if 'users' in context: 68 pass 69 else: 70 context.users = {} 71 if enrollId in context.users: 72 userRegistration = context.users[enrollId] 73 else: 74 raise Exception("User has not been registered: {0}".format(enrollId)) 75 return userRegistration 76 77 78 def ipFromContainerNamePart(namePart, containerDataList): 79 """Returns the IPAddress based upon a name part of the full container name""" 80 containerData = containerDataFromNamePart(namePart, containerDataList) 81 82 if containerData == None: 83 raise Exception("Could not find container with namePart = {0}".format(namePart)) 84 85 return containerData.ipAddress 86 87 def getPortHostMapping(compose_container_data, compose_service_name, port, protocol='tcp'): 88 """returns (host_ip, host_port) 89 Returns the host IP address port and port that maps to a container's exposed port. 90 If the port is not mapped, then the actual container IP address is returned. 91 """ 92 container = containerDataFromNamePart(compose_service_name, compose_container_data) 93 if container: 94 port_protocol = '%s/%s' % (port, protocol) 95 if port_protocol in container.ports: 96 port_mapping = container.ports[port_protocol] 97 host_ip = port_mapping[0]['HostIp'] 98 host_port = int(port_mapping[0]['HostPort']) 99 return host_ip, host_port 100 else: 101 print('WARNING: Could not find port mapping for port {0}'.format(port_protocol)) 102 # TODO so we don't break existing docker-compose tests on Vagrant just yet 103 print('WARNING: Returning the actual container IP address, which might not be routable from the host.') 104 return container.ipAddress, port 105 else: 106 raise Exception("Could not find container for service '{0}'".format(compose_service_name)) 107 108 def fullNameFromContainerNamePart(namePart, containerDataList): 109 containerData = containerDataFromNamePart(namePart, containerDataList) 110 111 if containerData == None: 112 raise Exception("Could not find container with namePart = {0}".format(namePart)) 113 114 return containerData.containerName 115 116 def containerDataFromNamePart(namePart, containerDataList): 117 for containerData in containerDataList: 118 if containerData.composeService == namePart: 119 return containerData 120 raise Exception("composeService not found: {0}".format(namePart)) 121 122 def getContainerDataValuesFromContext(context, aliases, callback): 123 """Returns the IPAddress based upon a name part of the full container name""" 124 assert 'compose_containers' in context, "compose_containers not found in context" 125 values = [] 126 for namePart in aliases: 127 for containerData in context.compose_containers: 128 if containerData.composeService == namePart: 129 values.append(callback(containerData)) 130 break 131 return values 132 133 def start_background_process(context, program_name, arg_list): 134 p = subprocess.Popen(arg_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 135 setattr(context, program_name, p)