network_test.py 5.5 KB

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