Passed
Push — master ( e8584f...303446 )
by Emmanuel
04:55
created

docker_actions_test   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 180
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 119
dl 0
loc 180
rs 10
c 0
b 0
f 0
wmc 18

9 Methods

Rating   Name   Duplication   Size   Complexity  
A DockerActionsTest.test_guess_shell_bash() 0 10 1
A DockerActionsTest.test_get_container_info() 0 47 4
A DockerActionsTest.test_container_not_running() 0 5 1
A DockerActionsTest.test_create_network() 0 26 1
A DockerActionsTest.test_get_container_info_not_exists() 0 2 1
A DockerActionsTest.test_guess_shell_sh() 0 10 1
A DockerActionsTest.tearDownClass() 0 7 1
A DockerActionsTest.test_get_container_info_network_set() 0 17 2
A DockerActionsTest.test_container_running() 0 7 1

3 Functions

Rating   Name   Duplication   Size   Complexity  
A stop_remove_container() 0 7 2
A exec_cmd() 0 3 1
A remove_network() 0 6 2
1
import os
2
import subprocess
3
import sys
4
from docker.errors import NotFound
5
import unittest
6
from stakkr import docker_actions
7
8
9
base_dir = os.path.abspath(os.path.dirname(__file__))
10
sys.path.insert(0, base_dir + '/../')
11
12
13
# https://docs.python.org/3/library/unittest.html#assert-methods
14
class DockerActionsTest(unittest.TestCase):
15
    def test_container_running(self):
16
        """Make sure, even in another directory, the venv base dir is correct."""
17
        stop_remove_container('pytest')
18
        docker_actions.get_client().containers.run(
19
            'edyan/adminer:latest', detach=True, name='pytest')
20
21
        self.assertTrue(docker_actions.container_running('pytest'))
22
23
    def test_container_not_running(self):
24
        """Make sure, even in another directory, the venv base dir is correct."""
25
        stop_remove_container('pytest')
26
27
        self.assertFalse(docker_actions.container_running('pytest'))
28
29
    def test_get_container_info(self):
30
        """
31
        Start docker compose with another configuration fileself.
32
        Then extract VM Info.
33
        """
34
35
        config = base_dir + '/static/config_valid.ini'
36
37
        # Clean
38
        exec_cmd(['stakkr-compose', '-c', config, 'stop'])
39
        remove_network('test_stakkr')
40
41
        # Start again
42
        cmd = ['stakkr-compose', '-c', config, 'up', '-d', '--force-recreate']
43
        exec_cmd(cmd)
44
        numcts, cts = docker_actions.get_running_containers('test')
45
        self.assertIs(len(cts), 3)
46
        for ct_id, ct_info in cts.items():
47
            if ct_info['name'] in ('test_maildev', 'test_portainer'):
48
                continue
49
50
            self.assertTrue('name' in ct_info)
51
            self.assertTrue('compose_name' in ct_info)
52
            self.assertTrue('ports' in ct_info)
53
            self.assertTrue('running' in ct_info)
54
            self.assertTrue('ip' in ct_info)
55
            self.assertTrue('image' in ct_info)
56
57
            self.assertEqual(ct_info['name'], 'test_php')
58
            self.assertEqual(ct_info['compose_name'], 'php')
59
            self.assertTrue(ct_info['running'])
60
            self.assertNotEqual(ct_info['ip'][:10], '192.168.23')
61
            self.assertEqual(ct_info['image'], 'edyan/php:7.2')
62
63
        self.assertTrue(docker_actions._container_in_network('test_php', 'test_stakkr'))
64
        self.assertTrue(docker_actions.network_exists('test_stakkr'))
65
        self.assertFalse(docker_actions._container_in_network('test_php', 'bridge'))
66
67
        exec_cmd(['stakkr-compose', '-c', config, 'stop'])
68
        stop_remove_container('test_php')
69
70
        with self.assertRaisesRegex(LookupError, 'Container test_php does not seem to exist'):
71
            docker_actions._container_in_network('test_php', 'bridge')
72
73
        exec_cmd(['stakkr', 'stop'])
74
        remove_network('test_stakkr')
75
        self.assertFalse(docker_actions.network_exists('test_stakkr'))
76
77
    def test_get_container_info_network_set(self):
78
        """
79
        Start docker compose with another configuration file,
80
        definint a network, then extract VM Info
81
82
        """
83
        exec_cmd(['stakkr-compose', '-c', base_dir + '/static/config_valid_network.ini', 'stop'])
84
        exec_cmd([
85
            'stakkr-compose', '-c', base_dir + '/static/config_valid_network.ini',
86
            'up', '-d', '--force-recreate', '--remove-orphans'])
87
        numcts, cts = docker_actions.get_running_containers('testnet')
88
89
        self.assertIs(numcts, 1)
90
        self.assertIs(len(cts), 1)
91
        for ct_id, ct_info in cts.items():
92
            self.assertEqual(ct_info['ip'][:10], '192.168.23')
93
            self.assertEqual(ct_info['image'], 'edyan/php:7.2')
94
95
    def test_create_network(self):
96
        """
97
        Create a network then a container, attache one to the other
98
        And verify everything is OK
99
100
        """
101
        stop_remove_container('pytest')
102
103
        docker_actions.get_client().containers.run(
104
            'edyan/adminer:latest', detach=True, name='pytest')
105
106
        self.assertTrue(docker_actions.container_running('pytest'))
107
        self.assertFalse(docker_actions._container_in_network('pytest', 'pytest'))
108
        self.assertFalse(docker_actions.network_exists('nw_pytest'))
109
110
        network_created = docker_actions.create_network('nw_pytest')
111
        self.assertNotEqual(False, network_created)
112
        self.assertIs(str, type(network_created))
113
114
        self.assertFalse(docker_actions.create_network('nw_pytest'))
115
        self.assertTrue(docker_actions.add_container_to_network('pytest', 'nw_pytest'))
116
        self.assertFalse(docker_actions.add_container_to_network('pytest', 'nw_pytest'))
117
        self.assertTrue(docker_actions._container_in_network('pytest', 'nw_pytest'))
118
119
        stop_remove_container('pytest')
120
        remove_network('nw_pytest')
121
122
    def test_get_container_info_not_exists(self):
123
        self.assertIs(None, docker_actions._extract_container_info('not_exists', 'not_exists'))
124
125
    def test_guess_shell_sh(self):
126
        stop_remove_container('pytest')
127
128
        docker_actions.get_client().containers.run(
129
            'edyan/adminer:latest', detach=True, name='pytest')
130
131
        shell = docker_actions.guess_shell('pytest')
132
        self.assertEqual('/bin/sh', shell)
133
134
        stop_remove_container('pytest')
135
136
    def test_guess_shell_bash(self):
137
        stop_remove_container('pytest')
138
139
        docker_actions.get_client().containers.run(
140
            'edyan/php:7.2', detach=True, name='pytest')
141
142
        shell = docker_actions.guess_shell('pytest')
143
        self.assertEqual('/bin/bash', shell)
144
145
        stop_remove_container('pytest')
146
147
    def tearDownClass():
148
        stop_remove_container('pytest')
149
        stop_remove_container('test_maildev')
150
        stop_remove_container('test_php')
151
        stop_remove_container('test_portainer')
152
        remove_network('nw_pytest')
153
        remove_network('test_stakkr')
154
155
156
def exec_cmd(cmd: list):
157
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
158
    p.communicate()
159
160
161
def stop_remove_container(ct_name: str):
162
    try:
163
        ct = docker_actions.get_client().containers.get(ct_name)
164
        ct.stop()
165
        ct.remove()
166
    except NotFound:
167
        pass
168
169
170
def remove_network(network_name: str):
171
    try:
172
        network = docker_actions.get_client().networks.get(network_name)
173
        network.remove()
174
    except NotFound:
175
        pass
176
177
178
if __name__ == "__main__":
179
    unittest.main()
180