Passed
Push — master ( 61e6a6...28b40d )
by Emmanuel
07:42
created

stakkr.proxy   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 53
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
eloc 36
dl 0
loc 53
ccs 0
cts 29
cp 0
rs 10
c 0
b 0
f 0
wmc 8

4 Methods

Rating   Name   Duplication   Size   Complexity  
A Proxy.start() 0 9 3
A Proxy.__init__() 0 5 1
A Proxy._start_container() 0 15 2
A Proxy.stop() 0 8 2
1
# coding: utf-8
2
"""Manage public proxy to expose containers."""
3
4
import click
5
from docker.errors import DockerException
6
from stakkr import docker_actions as docker
7
from stakkr.file_utils import get_dir
8
9
10
class Proxy:
11
    """Main class that does actions asked by the cli."""
12
13
    def __init__(self, http_port: int = 80, https_port: int = 443, ct_name: str = 'proxy_stakkr'):
14
        """Set the right values to start the proxy."""
15
        self.ports = {'http': http_port, 'https': https_port}
16
        self.ct_name = ct_name
17
        self.docker_client = docker.get_client()
18
19
    def start(self, stakkr_network: str = None):
20
        """Start stakkr proxy if stopped."""
21
        if docker.container_running(self.ct_name) is False:
22
            print(click.style('[STARTING]', fg='green') + ' traefik')
23
            self._start_container()
24
25
        # Connect it to network if asked
26
        if stakkr_network is not None:
27
            docker.add_container_to_network(self.ct_name, stakkr_network)
28
29
    def stop(self):
30
        """Stop stakkr proxy."""
31
        if docker.container_running(self.ct_name) is False:
32
            return
33
34
        print(click.style('[STOPPING]', fg='green') + ' traefik')
35
        proxy_ct = self.docker_client.containers.get(self.ct_name)
36
        proxy_ct.stop()
37
38
    def _start_container(self):
39
        """Start proxy."""
40
        proxy_conf_dir = get_dir('static/proxy')
41
        try:
42
            self.docker_client.images.pull('traefik:latest')
43
            self.docker_client.containers.run(
44
                'traefik:latest', remove=True, detach=True,
45
                hostname=self.ct_name, name=self.ct_name,
46
                volumes=[
47
                    '/var/run/docker.sock:/var/run/docker.sock',
48
                    '{}/traefik.toml:/etc/traefik/traefik.toml'.format(proxy_conf_dir),
49
                    '{}/ssl:/etc/traefik/ssl'.format(proxy_conf_dir)],
50
                ports={80: self.ports['http'], 8080: 8080, 443: self.ports['https']})
51
        except DockerException as error:
52
            raise RuntimeError("Can't start proxy ...({})".format(error))
53