import six from .. import errors from .. import utils class ExecApiMixin(object): @utils.minimum_version('1.15') @utils.check_resource def exec_create(self, container, cmd, stdout=True, stderr=True, stdin=False, tty=False, privileged=False, user=''): if privileged and utils.compare_version('1.19', self._version) < 0: raise errors.InvalidVersion( 'Privileged exec is not supported in API < 1.19' ) if user and utils.compare_version('1.19', self._version) < 0: raise errors.InvalidVersion( 'User-specific exec is not supported in API < 1.19' ) if isinstance(cmd, six.string_types): cmd = utils.split_command(cmd) data = { 'Container': container, 'User': user, 'Privileged': privileged, 'Tty': tty, 'AttachStdin': stdin, 'AttachStdout': stdout, 'AttachStderr': stderr, 'Cmd': cmd } url = self._url('/containers/{0}/exec', container) res = self._post_json(url, data=data) return self._result(res, True) @utils.minimum_version('1.16') def exec_inspect(self, exec_id): if isinstance(exec_id, dict): exec_id = exec_id.get('Id') res = self._get(self._url("/exec/{0}/json", exec_id)) return self._result(res, True) @utils.minimum_version('1.15') def exec_resize(self, exec_id, height=None, width=None): if isinstance(exec_id, dict): exec_id = exec_id.get('Id') params = {'h': height, 'w': width} url = self._url("/exec/{0}/resize", exec_id) res = self._post(url, params=params) self._raise_for_status(res) @utils.minimum_version('1.15') def exec_start(self, exec_id, detach=False, tty=False, stream=False, socket=False): # we want opened socket if socket == True if isinstance(exec_id, dict): exec_id = exec_id.get('Id') data = { 'Tty': tty, 'Detach': detach } headers = {} if detach else { 'Connection': 'Upgrade', 'Upgrade': 'tcp' } res = self._post_json( self._url('/exec/{0}/start', exec_id), headers=headers, data=data, stream=True ) if socket: return self._get_raw_response_socket(res) return self._read_from_socket(res, stream)