network_test.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import pytest
  4. from .. import mock
  5. from .. import unittest
  6. from compose.network import check_remote_network_config
  7. from compose.network import Network
  8. from compose.network import NetworkConfigChangedError
  9. class NetworkTest(unittest.TestCase):
  10. def test_check_remote_network_config_success(self):
  11. options = {'com.docker.network.driver.foo': 'bar'}
  12. ipam_config = {
  13. 'driver': 'default',
  14. 'config': [
  15. {'subnet': '172.0.0.1/16', },
  16. {
  17. 'subnet': '156.0.0.1/25',
  18. 'gateway': '156.0.0.1',
  19. 'aux_addresses': ['11.0.0.1', '24.25.26.27'],
  20. 'ip_range': '156.0.0.1-254'
  21. }
  22. ],
  23. 'options': {
  24. 'iface': 'eth0',
  25. }
  26. }
  27. labels = {
  28. 'com.project.tests.istest': 'true',
  29. 'com.project.sound.track': 'way out of here',
  30. }
  31. remote_labels = labels.copy()
  32. remote_labels.update({
  33. 'com.docker.compose.project': 'compose_test',
  34. 'com.docker.compose.network': 'net1',
  35. })
  36. net = Network(
  37. None, 'compose_test', 'net1', 'bridge',
  38. options, enable_ipv6=True, ipam=ipam_config,
  39. labels=labels
  40. )
  41. check_remote_network_config(
  42. {
  43. 'Driver': 'bridge',
  44. 'Options': options,
  45. 'EnableIPv6': True,
  46. 'Internal': False,
  47. 'Attachable': True,
  48. 'IPAM': {
  49. 'Driver': 'default',
  50. 'Config': [{
  51. 'Subnet': '156.0.0.1/25',
  52. 'Gateway': '156.0.0.1',
  53. 'AuxiliaryAddresses': ['24.25.26.27', '11.0.0.1'],
  54. 'IPRange': '156.0.0.1-254'
  55. }, {
  56. 'Subnet': '172.0.0.1/16',
  57. 'Gateway': '172.0.0.1'
  58. }],
  59. 'Options': {
  60. 'iface': 'eth0',
  61. },
  62. },
  63. 'Labels': remote_labels
  64. },
  65. net
  66. )
  67. def test_check_remote_network_config_whitelist(self):
  68. options = {'com.docker.network.driver.foo': 'bar'}
  69. remote_options = {
  70. 'com.docker.network.driver.overlay.vxlanid_list': '257',
  71. 'com.docker.network.driver.foo': 'bar',
  72. 'com.docker.network.windowsshim.hnsid': 'aac3fd4887daaec1e3b',
  73. }
  74. net = Network(
  75. None, 'compose_test', 'net1', 'overlay',
  76. options
  77. )
  78. check_remote_network_config(
  79. {'Driver': 'overlay', 'Options': remote_options}, net
  80. )
  81. @mock.patch('compose.network.Network.true_name', lambda n: n.full_name)
  82. def test_check_remote_network_config_driver_mismatch(self):
  83. net = Network(None, 'compose_test', 'net1', 'overlay')
  84. with pytest.raises(NetworkConfigChangedError) as e:
  85. check_remote_network_config(
  86. {'Driver': 'bridge', 'Options': {}}, net
  87. )
  88. assert 'driver has changed' in str(e.value)
  89. @mock.patch('compose.network.Network.true_name', lambda n: n.full_name)
  90. def test_check_remote_network_config_options_mismatch(self):
  91. net = Network(None, 'compose_test', 'net1', 'overlay')
  92. with pytest.raises(NetworkConfigChangedError) as e:
  93. check_remote_network_config({'Driver': 'overlay', 'Options': {
  94. 'com.docker.network.driver.foo': 'baz'
  95. }}, net)
  96. assert 'option "com.docker.network.driver.foo" has changed' in str(e.value)
  97. def test_check_remote_network_config_null_remote(self):
  98. net = Network(None, 'compose_test', 'net1', 'overlay')
  99. check_remote_network_config(
  100. {'Driver': 'overlay', 'Options': None}, net
  101. )
  102. def test_check_remote_network_config_null_remote_ipam_options(self):
  103. ipam_config = {
  104. 'driver': 'default',
  105. 'config': [
  106. {'subnet': '172.0.0.1/16', },
  107. {
  108. 'subnet': '156.0.0.1/25',
  109. 'gateway': '156.0.0.1',
  110. 'aux_addresses': ['11.0.0.1', '24.25.26.27'],
  111. 'ip_range': '156.0.0.1-254'
  112. }
  113. ]
  114. }
  115. net = Network(
  116. None, 'compose_test', 'net1', 'bridge', ipam=ipam_config,
  117. )
  118. check_remote_network_config(
  119. {
  120. 'Driver': 'bridge',
  121. 'Attachable': True,
  122. 'IPAM': {
  123. 'Driver': 'default',
  124. 'Config': [{
  125. 'Subnet': '156.0.0.1/25',
  126. 'Gateway': '156.0.0.1',
  127. 'AuxiliaryAddresses': ['24.25.26.27', '11.0.0.1'],
  128. 'IPRange': '156.0.0.1-254'
  129. }, {
  130. 'Subnet': '172.0.0.1/16',
  131. 'Gateway': '172.0.0.1'
  132. }],
  133. 'Options': None
  134. },
  135. },
  136. net
  137. )
  138. @mock.patch('compose.network.Network.true_name', lambda n: n.full_name)
  139. def test_check_remote_network_labels_mismatch(self):
  140. net = Network(None, 'compose_test', 'net1', 'overlay', labels={
  141. 'com.project.touhou.character': 'sakuya.izayoi'
  142. })
  143. remote = {
  144. 'Driver': 'overlay',
  145. 'Options': None,
  146. 'Labels': {
  147. 'com.docker.compose.network': 'net1',
  148. 'com.docker.compose.project': 'compose_test',
  149. 'com.project.touhou.character': 'marisa.kirisame',
  150. }
  151. }
  152. with mock.patch('compose.network.log') as mock_log:
  153. check_remote_network_config(remote, net)
  154. mock_log.warn.assert_called_once_with(mock.ANY)
  155. _, args, kwargs = mock_log.warn.mock_calls[0]
  156. assert 'label "com.project.touhou.character" has changed' in args[0]