I realize that low-level documentation has outdated examples, so I
created issue #2800 to fix that
Signed-off-by: Felipe Ruhland <felipe.ruhland@gmail.com>
I realize that the documentation of low-level `images` was outdated when
answering issue #2798
The issue can reproduce it with a simple test:
```py
In [1]: import docker
In [2]: client = docker.from_env()
In [3]: client.pull
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-d0931943ca5d> in <module>
----> 1 client.pull
~/docker-py/docker/client.py in __getattr__(self, name)
219 "object APIClient. See the low-level API section of the "
220 "documentation for more details.")
--> 221 raise AttributeError(' '.join(s))
222
223
AttributeError: 'DockerClient' object has no attribute 'pull' In Docker SDK for Python 2.0, this method is now on the object APIClient. See the low-level API section of the documentation for more details.
In [4]: client.push
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-f7d5b860a184> in <module>
----> 1 client.push
~/docker-py/docker/client.py in __getattr__(self, name)
219 "object APIClient. See the low-level API section of the "
220 "documentation for more details.")
--> 221 raise AttributeError(' '.join(s))
222
223
AttributeError: 'DockerClient' object has no attribute 'push' In Docker SDK for Python 2.0, this method is now on the object APIClient. See the low-level API section of the documentation for more details.
In [5]: client.tag
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-043bdfd088ca> in <module>
----> 1 client.tag
~/docker-py/docker/client.py in __getattr__(self, name)
219 "object APIClient. See the low-level API section of the "
220 "documentation for more details.")
--> 221 raise AttributeError(' '.join(s))
222
223
AttributeError: 'DockerClient' object has no attribute 'tag' In Docker SDK for Python 2.0, this method is now on the object APIClient. See the low-level API section of the documentation for more details.
In [6]: client.get_image
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-6-477c12713276> in <module>
----> 1 client.get_image
~/docker-py/docker/client.py in __getattr__(self, name)
219 "object APIClient. See the low-level API section of the "
220 "documentation for more details.")
--> 221 raise AttributeError(' '.join(s))
222
223
AttributeError: 'DockerClient' object has no attribute 'get_image' In Docker SDK for Python 2.0, this method is now on the object APIClient. See the low-level API section of the documentation for more details.
In [7]: client.api.get_image
Out[7]: <bound method ImageApiMixin.get_image of <docker.api.client.APIClient object at 0x7fad6a2037c0>>
In [8]: client.api.tag
Out[8]: <bound method ImageApiMixin.tag of <docker.api.client.APIClient object at 0x7fad6a2037c0>>
In [9]: client.api.pull
Out[9]: <bound method ImageApiMixin.pull of <docker.api.client.APIClient object at 0x7fad6a2037c0>>
In [10]: client.api.push
Out[10]: <bound method ImageApiMixin.push of <docker.api.client.APIClient object at 0x7fad6a2037c0>>
```
Signed-off-by: Felipe Ruhland <felipe.ruhland@gmail.com>
Dependabot opened a pull request
93bcc0497d to upgrade cryptography from
2.3 to 3.2.
However, only `requirements.txt` was updated.
The extra requirements were kept outdated.
This commit was made to update the library to the last version.
Fix#2791
Signed-off-by: Felipe Ruhland <felipe.ruhland@gmail.com>
How to reproduce the issue:
```py
>>> import docker
>>> cli = docker.from_env()
>>> cli.secrets.create(name="any_name", data="1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/docker-py/docker/models/secrets.py", line 10, in __repr__
return "<%s: '%s'>" % (self.__class__.__name__, self.name)
File "/home/docker-py/docker/models/secrets.py", line 14, in name
return self.attrs['Spec']['Name']
KeyError: 'Spec'
```
The exception raises because create secrets API `/secrets/create` only
return the `id` attribute:
https://docs.docker.com/engine/api/v1.41/#operation/SecretCreate
The secret model is created using just the `id` attribute and fails
when looking for Spec.Name attribute.
```py
def __repr__(self):
return "<%s: '%s'>" % (self.__class__.__name__, self.name)
```
```py
@property
def name(self):
return self.attrs['Spec']['Name']
```
I came up with a ugly solution but will prevent the problem to happen
again:
```py
def create(self, **kwargs):
obj = self.client.api.create_secret(**kwargs)
+ obj.setdefault("Spec", {})["Name"] = kwargs.get("name")
return self.prepare_model(obj)
```
After the API call, I added the name attribute to the right place to be
used on the property name.
```py
>>> import docker
>>> cli = docker.from_env()
>>> cli.secrets.create(name="any_name", data="1")
<Secret: 'any_name'>
```
It isn't the most elegant solution, but it will do the trick.
I had a previous PR #2517 when I propose using the `id` attribute
instead of `name` on the `__repr__` method, but I think this one will be better.
That fixes#2025
Signed-off-by: Felipe Ruhland <felipe.ruhland@gmail.com>