network_test.py 6.1 KB

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