def start(self, container, binds=None, volumes_from=None, port_bindings=None, lxc_conf=None, publish_all_ports=False, links=None, privileged=False, network_mode=None): if isinstance(container, dict): container = container.get('Id') if isinstance(lxc_conf, dict): formatted = [] for k, v in six.iteritems(lxc_conf): formatted.append({'Key': k, 'Value': str(v)}) lxc_conf = formatted start_config = { 'LxcConf': lxc_conf } if binds: bind_pairs = [ '%s:%s:%s' % ( h, d['bind'], 'ro' if 'ro' in d and d['ro'] else 'rw' ) for h, d in binds.items() ] start_config['Binds'] = bind_pairs if volumes_from and not isinstance(volumes_from, six.string_types): volumes_from = ','.join(volumes_from) start_config['VolumesFrom'] = volumes_from if port_bindings: start_config['PortBindings'] = utils.convert_port_bindings( port_bindings ) start_config['PublishAllPorts'] = publish_all_ports if links: if isinstance(links, dict): links = six.iteritems(links) formatted_links = [ '{0}:{1}'.format(k, v) for k, v in sorted(links) ] start_config['Links'] = formatted_links start_config['Privileged'] = privileged if network_mode: start_config['NetworkMode'] = network_mode url = self._url("/containers/{0}/start".format(container)) res = self._post_json(url, data=start_config) self._raise_for_status(res)
def start(self, container, binds=None, volumes_from=None, port_bindings=None, lxc_conf=None, publish_all_ports=False, links=None, privileged=False): if isinstance(container, dict): container = container.get('Id') if isinstance(lxc_conf, dict): formatted = [] for k, v in six.iteritems(lxc_conf): formatted.append({'Key': k, 'Value': str(v)}) lxc_conf = formatted start_config = { 'LxcConf': lxc_conf } if binds: bind_pairs = [ '%s:%s:%s' % ( h, d['bind'], 'ro' if 'ro' in d and d['ro'] else 'rw' ) for h, d in binds.items() ] start_config['Binds'] = bind_pairs if volumes_from and not isinstance(volumes_from, six.string_types): volumes_from = ','.join(volumes_from) start_config['VolumesFrom'] = volumes_from if port_bindings: start_config['PortBindings'] = utils.convert_port_bindings( port_bindings ) start_config['PublishAllPorts'] = publish_all_ports if links: if isinstance(links, dict): links = six.iteritems(links) formatted_links = [ '{0}:{1}'.format(k, v) for k, v in sorted(links) ] start_config['Links'] = formatted_links start_config['Privileged'] = privileged url = self._url("/containers/{0}/start".format(container)) res = self._post_json(url, data=start_config) self._raise_for_status(res)
def start(self, container, binds=None, port_bindings=None, lxc_conf=None, publish_all_ports=False, links=None, privileged=False): if isinstance(container, dict): container = container.get('Id') if isinstance(lxc_conf, dict): formatted = [] for k, v in six.iteritems(lxc_conf): formatted.append({'Key': k, 'Value': str(v)}) lxc_conf = formatted start_config = {'LxcConf': lxc_conf} if binds: bind_pairs = [ '{0}:{1}'.format(host, dest) for host, dest in binds.items() ] start_config['Binds'] = bind_pairs if port_bindings: start_config['PortBindings'] = utils.convert_port_bindings( port_bindings) start_config['PublishAllPorts'] = publish_all_ports if links: if isinstance(links, dict): links = six.iteritems(links) formatted_links = [ '{0}:{1}'.format(k, v) for k, v in sorted(links) ] start_config['Links'] = formatted_links start_config['Privileged'] = privileged url = self._url("/containers/{0}/start".format(container)) res = self._post_json(url, data=start_config) self._raise_for_status(res)
def convert_port_bindings(port_bindings): result = {} for k, v in six.iteritems(port_bindings): key = str(k) if '/' not in key: key = key + '/tcp' if isinstance(v, list): result[key] = [_convert_port_binding(binding) for binding in v] else: result[key] = [_convert_port_binding(v)] return result
def load_config(root=None): """Loads authentication data from a Docker configuration file in the given root directory.""" conf = {} data = None config_file = os.path.join(root or os.environ.get('HOME', '.'), DOCKER_CONFIG_FILENAME) # First try as JSON try: with open(config_file) as f: conf = {} for registry, entry in six.iteritems(json.load(f)): username, password = decode_auth(entry['auth']) conf[registry] = { 'username': username, 'password': password, 'email': entry['email'], 'serveraddress': registry, } return conf except: pass # If that fails, we assume the configuration file contains a single # authentication token for the public registry in the following format: # # auth = AUTH_TOKEN # email = [email protected] try: data = [] for line in fileinput.input(config_file): data.append(line.strip().split(' = ')[1]) if len(data) < 2: # Not enough data raise errors.InvalidConfigFile( 'Invalid or empty configuration file!') username, password = decode_auth(data[0]) conf[INDEX_URL] = { 'username': username, 'password': password, 'email': data[1], 'serveraddress': INDEX_URL, } return conf except: pass # If all fails, return an empty config return {}
def _post_json(self, url, data, **kwargs): # Go <1.1 can't unserialize null to a string # so we do this disgusting thing here. data2 = {} if data is not None: for k, v in six.iteritems(data): if v is not None: data2[k] = v if 'headers' not in kwargs: kwargs['headers'] = {} kwargs['headers']['Content-Type'] = 'application/json' return self._post(url, data=json.dumps(data2), **kwargs)
def load_config(root=None): """Loads authentication data from a Docker configuration file in the given root directory.""" conf = {} data = None config_file = os.path.join(root or os.environ.get('HOME', '.'), DOCKER_CONFIG_FILENAME) # First try as JSON try: with open(config_file) as f: conf = {} for registry, entry in six.iteritems(json.load(f)): username, password = decode_auth(entry['auth']) conf[registry] = { 'username': username, 'password': password, 'email': entry['email'], 'serveraddress': registry, } return conf except: pass # If that fails, we assume the configuration file contains a single # authentication token for the public registry in the following format: # # auth = AUTH_TOKEN # email = [email protected] try: data = [] for line in fileinput.input(config_file): data.append(line.strip().split(' = ')[1]) if len(data) < 2: # Not enough data raise Exception('Invalid or empty configuration file!') username, password = decode_auth(data[0]) conf[INDEX_URL] = { 'username': username, 'password': password, 'email': data[1], 'serveraddress': INDEX_URL, } return conf except: pass # If all fails, return an empty config return {}
def load_config(root=None): """Loads authentication data from a Docker configuration file in the given root directory.""" conf = {} data = None config_file = os.path.join(root or os.environ.get("HOME", "."), DOCKER_CONFIG_FILENAME) # First try as JSON try: with open(config_file) as f: conf = {} for registry, entry in six.iteritems(json.load(f)): username, password = decode_auth(entry["auth"]) conf[registry] = { "username": username, "password": password, "email": entry["email"], "serveraddress": registry, } return conf except: pass # If that fails, we assume the configuration file contains a single # authentication token for the public registry in the following format: # # auth = AUTH_TOKEN # email = [email protected] try: data = [] for line in fileinput.input(config_file): data.append(line.strip().split(" = ")[1]) if len(data) < 2: # Not enough data raise errors.InvalidConfigFile("Invalid or empty configuration file!") username, password = decode_auth(data[0]) conf[INDEX_URL] = {"username": username, "password": password, "email": data[1], "serveraddress": INDEX_URL} return conf except: pass # If all fails, return an empty config return {}
def format_call(args, kwargs): args = (repr(a) for a in args) kwargs = ("{0!s}={1!r}".format(*item) for item in six.iteritems(kwargs)) return "({0})".format(", ".join(chain(args, kwargs)))
def start(self, container, binds=None, port_bindings=None, lxc_conf=None, publish_all_ports=False, links=None, privileged=False, dns=None, dns_search=None, volumes_from=None, network_mode=None): if isinstance(container, dict): container = container.get('Id') if isinstance(lxc_conf, dict): formatted = [] for k, v in six.iteritems(lxc_conf): formatted.append({'Key': k, 'Value': str(v)}) lxc_conf = formatted start_config = { 'LxcConf': lxc_conf } if binds: start_config['Binds'] = utils.convert_volume_binds(binds) if port_bindings: start_config['PortBindings'] = utils.convert_port_bindings( port_bindings ) start_config['PublishAllPorts'] = publish_all_ports if links: if isinstance(links, dict): links = six.iteritems(links) formatted_links = [ '{0}:{1}'.format(k, v) for k, v in sorted(links) ] start_config['Links'] = formatted_links start_config['Privileged'] = privileged if utils.compare_version('1.10', self._version) >= 0: if dns is not None: start_config['Dns'] = dns if volumes_from is not None: if isinstance(volumes_from, six.string_types): volumes_from = volumes_from.split(',') start_config['VolumesFrom'] = volumes_from else: warning_message = ('{0!r} parameter is discarded. It is only' ' available for API version greater or equal' ' than 1.10') if dns is not None: warnings.warn(warning_message.format('dns'), DeprecationWarning) if volumes_from is not None: warnings.warn(warning_message.format('volumes_from'), DeprecationWarning) if dns_search: start_config['DnsSearch'] = dns_search if network_mode: start_config['NetworkMode'] = network_mode url = self._url("/containers/{0}/start".format(container)) res = self._post_json(url, data=start_config) self._raise_for_status(res)
def start(self, container, binds=None, port_bindings=None, lxc_conf=None, publish_all_ports=False, links=None, privileged=False, dns=None, dns_search=None, volumes_from=None, network_mode=None): if isinstance(container, dict): container = container.get('Id') if isinstance(lxc_conf, dict): formatted = [] for k, v in six.iteritems(lxc_conf): formatted.append({'Key': k, 'Value': str(v)}) lxc_conf = formatted start_config = {'LxcConf': lxc_conf} if binds: start_config['Binds'] = utils.convert_volume_binds(binds) if port_bindings: start_config['PortBindings'] = utils.convert_port_bindings( port_bindings) start_config['PublishAllPorts'] = publish_all_ports if links: if isinstance(links, dict): links = six.iteritems(links) formatted_links = [ '{0}:{1}'.format(k, v) for k, v in sorted(links) ] start_config['Links'] = formatted_links start_config['Privileged'] = privileged if utils.compare_version('1.10', self._version) >= 0: if dns is not None: start_config['Dns'] = dns if volumes_from is not None: if isinstance(volumes_from, six.string_types): volumes_from = volumes_from.split(',') start_config['VolumesFrom'] = volumes_from else: warning_message = ('{0!r} parameter is discarded. It is only' ' available for API version greater or equal' ' than 1.10') if dns is not None: warnings.warn(warning_message.format('dns'), DeprecationWarning) if volumes_from is not None: warnings.warn(warning_message.format('volumes_from'), DeprecationWarning) if dns_search: start_config['DnsSearch'] = dns_search if network_mode: start_config['NetworkMode'] = network_mode url = self._url("/containers/{0}/start".format(container)) res = self._post_json(url, data=start_config) self._raise_for_status(res)