# Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). You # may not use this file except in compliance with the License. A copy of # the License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "license" file accompanying this file. This file 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. from botocore.compat import six from ebcli.containers.envvarcollector import EnvvarCollector from ebcli.containers.pathconfig import PathConfig from ebcli.core import fileoperations, io from ebcli.lib import utils from ebcli.operations import commonops, envvarops from ebcli.resources.strings import strings cPickle = six.moves.cPickle class LocalState(object): """ Class used for storing local state in a file. """ def __init__(self, envvarcollector): self.envvarcollector = envvarcollector def dumps(self, path): fileoperations.write_to_data_file(data=cPickle.dumps(self, protocol=2), location=path) @classmethod def loads(cls, path): try: data = fileoperations.read_from_data_file(path) return cPickle.loads(data) except IOError: return cls(EnvvarCollector()) @classmethod def get_envvarcollector(cls, path): return cls.loads(path).envvarcollector @classmethod def save_envvarcollector(cls, envvarcollector, path): localstate = cls.loads(path) localstate.envvarcollector = envvarcollector localstate.dumps(path) def print_container_details(cnt_viewmodel): """ Dispalays information about all the services of container. :param cnt_viewmodel: ContainerViewModel: contains view info about container :return: None """ io.echo('Platform:', cnt_viewmodel.soln_stk) for i, service_info in enumerate(cnt_viewmodel.service_infos): _print_service_details(service_info) if i != len(cnt_viewmodel.service_infos) - 1: io.echo() def open_webpage(cnt_viewmodel): """ Open the webpage at container ip and host port we exposed when we ran this container. Raise error if container not running and prompt user to choose host port if multiple host ports exposed under this container. :param cnt_viewmodel: ContainerViewModel: contains view info about container :return: None """ if not cnt_viewmodel.is_running(): raise RuntimeError(strings['local.open.nocontainer']) # Get container id, exposed host port pairs cid_hostports = cnt_viewmodel.get_cid_hostport_pairs() num_exposed_hostports = cnt_viewmodel.num_exposed_hostports() if num_exposed_hostports == 1: _, host_port = cid_hostports[0] elif num_exposed_hostports > 1: io.echo() io.echo('Select a container applcation to open') io.echo() disp = ['Container {}, host port {}'.format(cid, p) for cid, p in cid_hostports] ind = utils.prompt_for_index_in_list(disp) _, host_port = cid_hostports[ind] else: raise RuntimeError(strings['local.open.noexposedport']) url = '{}:{}'.format(cnt_viewmodel.ip, host_port) commonops.open_webpage_in_browser(url) def _print_service_details(service_info): exposed_host_ports_str = ', '.join(service_info.hostports) or None urls = ', '.join(service_info.get_urls()) or None io.echo('Container name:', service_info.cid) io.echo('Container ip:', service_info.ip) io.echo('Container running:', service_info.is_running) io.echo('Exposed host port(s):', exposed_host_ports_str) io.echo('Full local URL(s):', urls) def get_and_print_environment_vars(pathconfig=PathConfig): envvars_map = LocalState.get_envvarcollector(pathconfig.local_state_path()).map envvarops.print_environment_vars(envvars_map) def setenv(var_list, pathconfig=PathConfig): setenv_env = LocalState.get_envvarcollector(pathconfig.local_state_path()) opt_env = EnvvarCollector.from_list(var_list) merged_env = setenv_env.merge(opt_env) LocalState.save_envvarcollector(merged_env.filtered(), pathconfig.local_state_path())