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