1import six 2 3from .. import errors 4from .. import utils 5 6 7class ExecApiMixin(object): 8 @utils.minimum_version('1.15') 9 @utils.check_resource 10 def exec_create(self, container, cmd, stdout=True, stderr=True, 11 stdin=False, tty=False, privileged=False, user=''): 12 if privileged and utils.compare_version('1.19', self._version) < 0: 13 raise errors.InvalidVersion( 14 'Privileged exec is not supported in API < 1.19' 15 ) 16 if user and utils.compare_version('1.19', self._version) < 0: 17 raise errors.InvalidVersion( 18 'User-specific exec is not supported in API < 1.19' 19 ) 20 if isinstance(cmd, six.string_types): 21 cmd = utils.split_command(cmd) 22 23 data = { 24 'Container': container, 25 'User': user, 26 'Privileged': privileged, 27 'Tty': tty, 28 'AttachStdin': stdin, 29 'AttachStdout': stdout, 30 'AttachStderr': stderr, 31 'Cmd': cmd 32 } 33 34 url = self._url('/containers/{0}/exec', container) 35 res = self._post_json(url, data=data) 36 return self._result(res, True) 37 38 @utils.minimum_version('1.16') 39 def exec_inspect(self, exec_id): 40 if isinstance(exec_id, dict): 41 exec_id = exec_id.get('Id') 42 res = self._get(self._url("/exec/{0}/json", exec_id)) 43 return self._result(res, True) 44 45 @utils.minimum_version('1.15') 46 def exec_resize(self, exec_id, height=None, width=None): 47 if isinstance(exec_id, dict): 48 exec_id = exec_id.get('Id') 49 50 params = {'h': height, 'w': width} 51 url = self._url("/exec/{0}/resize", exec_id) 52 res = self._post(url, params=params) 53 self._raise_for_status(res) 54 55 @utils.minimum_version('1.15') 56 def exec_start(self, exec_id, detach=False, tty=False, stream=False, 57 socket=False): 58 # we want opened socket if socket == True 59 if socket: 60 stream = True 61 if isinstance(exec_id, dict): 62 exec_id = exec_id.get('Id') 63 64 data = { 65 'Tty': tty, 66 'Detach': detach 67 } 68 69 res = self._post_json( 70 self._url('/exec/{0}/start', exec_id), data=data, stream=stream 71 ) 72 73 if socket: 74 return self._get_raw_response_socket(res) 75 return self._get_result_tty(stream, res, tty) 76