| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you 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. | |
| # | |
| def env_to_dict(user_data, key="env"): | |
| """ | |
| extract env from user_data and return it as a dict | |
| Keyword arguments: | |
| key -- the key to extract the env from | |
| >>> env_to_dict({"env": [{"key": "VAR1", "value": "value1"}, {"key": "VAR2", "value": "value2"}]}) | |
| {'VAR1': 'value1', 'VAR2': 'value2'} | |
| >>> env_to_dict({"env": []}) | |
| {} | |
| >>> env_to_dict({"other_key": [{"key": "VAR1", "value": "value1"}]}, key="other_key") | |
| {'VAR1': 'value1'} | |
| >>> env_to_dict({"env": [{"key": "VAR1", "value": "value1"}]}, key="env") | |
| {'VAR1': 'value1'} | |
| >>> env_to_dict({"env": [{"key": "VAR1", "value": "value1"}, {"key": "VAR2", "value": "value2"}]}, key="non_existent_key") | |
| {} | |
| >>> env_to_dict({"env": [{"key": "VAR1", "value": "value1"}]}, key="env") | |
| {'VAR1': 'value1'} | |
| """ | |
| body = {} | |
| if key in user_data: | |
| envs = list(user_data[key]) | |
| else: | |
| envs = [] | |
| for env in envs: | |
| body[env['key']] = env['value'] | |
| return body | |
| def dict_to_env(env): | |
| """ | |
| converts an env to a key/pair suitable for user_data storage | |
| >>> dict_to_env({"VAR1": "value1", "VAR2": "value2"}) | |
| [{'key': 'VAR1', 'value': 'value1'}, {'key': 'VAR2', 'value': 'value2'}] | |
| >>> dict_to_env({}) | |
| [] | |
| """ | |
| body = [] | |
| for key in env: | |
| body.append({"key": key, "value": env[key]}) | |
| return body | |
| def join_host_port(host, port): | |
| """ | |
| Join host and port into a URL format. | |
| >>> join_host_port("localhost", "8080") | |
| 'localhost:8080' | |
| >>> join_host_port("localhost", 8080) | |
| 'localhost:8080' | |
| >>> join_host_port("localhost", "80") | |
| 'localhost:80' | |
| >>> join_host_port("localhost", "abcd") | |
| Traceback (most recent call last): | |
| ... | |
| ValueError: Port must be numeric | |
| """ | |
| template = "%s:%s" | |
| try: | |
| port_int = int(port) | |
| port = str(port_int) | |
| except (ValueError, TypeError): | |
| raise ValueError("Port must be numeric") | |
| host_requires_bracketing = ":" in host or "%" in host | |
| if host_requires_bracketing: | |
| template = "[%s]:%s" | |
| return template % (host, port) |