Repository: vantage6/vantage6
Issue: [Bug] Docker hub images are not pulled

**Describe the bug**
When an image is run that is not local and not on harbor, it is not pulled from docker hub.

```python
2022-12-06 09:33:17 - task_manager   - WARNING  - Could not construct remote URL, are you using a local image?
2022-12-06 09:33:17 - task_manager   - WARNING  - Or an image from docker hub?
2022-12-06 09:33:17 - task_manager   - WARNING  - We'll make an final attempt when running the image to pull it without any checks...
2022-12-06 09:33:17 - task_manager   - ERROR    - Cannot locate image itisfoundation/sleeper
2022-12-06 09:33:18 - node           - ERROR    - 404 Client Error: Not Found ("no such image: itisfoundation/sleeper: No such image: itisfoundation/sleeper:latest")
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/docker/api/client.py", line 261, in _raise_for_status
    response.raise_for_status()
  File "/usr/local/lib/python3.7/site-packages/requests/models.py", line 943, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: http+docker://localhost/v1.35/images/itisfoundation/sleeper/json

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/vantage6/vantage6-node/vantage6/node/__init__.py", line 792, in run_forever
    self.__start_task(task)
  File "/vantage6/vantage6-node/vantage6/node/__init__.py", line 351, in __start_task
    database=task.get('database', 'default')
  File "/vantage6/vantage6-node/vantage6/node/docker/docker_manager.py", line 301, in run
    database=database
  File "/vantage6/vantage6-node/vantage6/node/docker/task_manager.py", line 205, in run
    vpn_ports = self._run_algorithm()
  File "/vantage6/vantage6-node/vantage6/node/docker/task_manager.py", line 258, in _run_algorithm
    algo_image_name=self.image
  File "/vantage6/vantage6-node/vantage6/node/docker/vpn_manager.py", line 226, in forward_vpn_traffic
    helper_container, algo_image_name)
  File "/vantage6/vantage6-node/vantage6/node/docker/vpn_manager.py", line 289, in _forward_traffic_to_algorithm
    ports = self._find_exposed_ports(algo_image_name)
  File "/vantage6/vantage6-node/vantage6/node/docker/vpn_manager.py", line 340, in _find_exposed_ports
    n2n_image = self.docker.images.get(image)
  File "/usr/local/lib/python3.7/site-packages/docker/models/images.py", line 316, in get
    return self.prepare_model(self.client.api.inspect_image(name))
  File "/usr/local/lib/python3.7/site-packages/docker/utils/decorators.py", line 19, in wrapped
    return f(self, resource_id, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/docker/api/image.py", line 246, in inspect_image
    self._get(self._url("/images/{0}/json", image)), True
  File "/usr/local/lib/python3.7/site-packages/docker/api/client.py", line 267, in _result
    self._raise_for_status(response)
  File "/usr/local/lib/python3.7/site-packages/docker/api/client.py", line 263, in _raise_for_status
    raise create_api_error_from_http_exception(e)
  File "/usr/local/lib/python3.7/site-packages/docker/errors.py", line 31, in create_api_error_from_http_exception
    raise cls(e, response=response, explanation=explanation)
docker.errors.ImageNotFound: 404 Client Error: Not Found ("no such image: itisfoundation/sleeper: No such image: itisfoundation/sleeper:latest")
```

**To Reproduce**
Steps to reproduce the behavior:
1. run task using a docker image (which is not local)
2. see node logs

I can fix it by pulling the image manually


Changed files:
vantage6-server/vantage6/server/resource/vpn.py, vantage6-node/vantage6/node/docker/vpn_manager.py, vantage6-common/vantage6/common/docker/addons.py

diff --git a/vantage6-common/vantage6/common/docker/addons.py b/vantage6-common/vantage6/common/docker/addons.py
index 4874542b..a7572528 100644
--- a/vantage6-common/vantage6/common/docker/addons.py
+++ b/vantage6-common/vantage6/common/docker/addons.py
@@ -131,7 +131,7 @@ def inspect_remote_image_timestamp(docker_client, image: str, log=ClickLogger):
         log.warn("Could not construct remote URL, "
                  "are you using a local image?")
         log.warn("Or an image from docker hub?")
-        log.warn("We'll make an final attempt when running the image to pull"
+        log.warn("We'll make a final attempt when running the image to pull"
                  " it without any checks...")
         return
 
diff --git a/vantage6-node/vantage6/node/docker/vpn_manager.py b/vantage6-node/vantage6/node/docker/vpn_manager.py
index d51b33e2..bd1711af 100644
--- a/vantage6-node/vantage6/node/docker/vpn_manager.py
+++ b/vantage6-node/vantage6/node/docker/vpn_manager.py
@@ -10,7 +10,7 @@ from docker.models.containers import Container
 
 from vantage6.common.globals import APPNAME, VPN_CONFIG_FILE
 from vantage6.common.docker.addons import (
-    remove_container_if_exists, remove_container, pull_if_newer
+    remove_container_if_exists, remove_container
 )
 from vantage6.node.util import logger_name
 from vantage6.node.globals import (
@@ -372,22 +372,18 @@ class VPNManager(DockerBaseManager):
             containing port number and label is given
         """
         default_ports = [{'algo_port': DEFAULT_ALGO_VPN_PORT, 'label': None}]
-        try:
-            n2n_image = pull_if_newer(self.docker, image, self.log)
-        except Exception:
-            self.log.warn(f"Could not locate algorithm docker image {image}!")
-            return default_ports
+        algo_image = self.docker.images.get(image)
 
         exposed_ports = []
         try:
-            exposed_ports = n2n_image.attrs['Config']['ExposedPorts']
+            exposed_ports = algo_image.attrs['Config']['ExposedPorts']
         except KeyError:
             return default_ports
 
         # find any labels defined in the docker image
         labels = {}
         try:
-            labels = n2n_image.attrs['Config']['Labels']
+            labels = algo_image.attrs['Config']['Labels']
         except KeyError:
             pass  # No labels found, ignore
 
diff --git a/vantage6-server/vantage6/server/resource/vpn.py b/vantage6-server/vantage6/server/resource/vpn.py
index 0976b49d..19d912e0 100644
--- a/vantage6-server/vantage6/server/resource/vpn.py
+++ b/vantage6-server/vantage6/server/resource/vpn.py
@@ -92,8 +92,11 @@ class VPNConfig(ServicesResources):
             log.error("Could not obtain VPN configuration file")
             log.error(e)
             return {
-                'msg': 'Could not obtain VPN configuration because the ' +
-                       'vantage6 server could not authorize to the VPN portal.'
+                'msg': (
+                    'Could not obtain VPN configuration because the vantage6 '
+                    'server could not authorize to the VPN portal. Please '
+                    'contact your server administrator.'
+                )
             }, HTTPStatus.INTERNAL_SERVER_ERROR
         except VPNConfigException as e:
             log.error("Could not obtain VPN configuration file")
@@ -107,8 +110,8 @@ class VPNConfig(ServicesResources):
             log.critical(f'Node <{g.node.id}> tries to obtain a vpn config. '
                          'However the VPN server is unreachable!')
             log.debug(e)
-            return {'msg': 'VPN server unreachable'}, \\
-                HTTPStatus.SERVICE_UNAVAILABLE
+            return {'msg': 'VPN server unreachable. Please contact your server'
+                           ' administrator'}, HTTPStatus.SERVICE_UNAVAILABLE
 
         return {'ovpn_config': ovpn_config}, HTTPStatus.OK