network.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from __future__ import absolute_import
  2. from __future__ import unicode_literals
  3. import logging
  4. from docker.errors import NotFound
  5. from docker.utils import create_ipam_config
  6. from docker.utils import create_ipam_pool
  7. from .config import ConfigurationError
  8. log = logging.getLogger(__name__)
  9. class Network(object):
  10. def __init__(self, client, project, name, driver=None, driver_opts=None,
  11. ipam=None, external_name=None):
  12. self.client = client
  13. self.project = project
  14. self.name = name
  15. self.driver = driver
  16. self.driver_opts = driver_opts
  17. self.ipam = create_ipam_config_from_dict(ipam)
  18. self.external_name = external_name
  19. def ensure(self):
  20. if self.external_name:
  21. try:
  22. self.inspect()
  23. log.debug(
  24. 'Network {0} declared as external. No new '
  25. 'network will be created.'.format(self.name)
  26. )
  27. except NotFound:
  28. raise ConfigurationError(
  29. 'Network {name} declared as external, but could'
  30. ' not be found. Please create the network manually'
  31. ' using `{command} {name}` and try again.'.format(
  32. name=self.external_name,
  33. command='docker network create'
  34. )
  35. )
  36. return
  37. try:
  38. data = self.inspect()
  39. if self.driver and data['Driver'] != self.driver:
  40. raise ConfigurationError(
  41. 'Network "{}" needs to be recreated - driver has changed'
  42. .format(self.full_name))
  43. if data['Options'] != (self.driver_opts or {}):
  44. raise ConfigurationError(
  45. 'Network "{}" needs to be recreated - options have changed'
  46. .format(self.full_name))
  47. except NotFound:
  48. driver_name = 'the default driver'
  49. if self.driver:
  50. driver_name = 'driver "{}"'.format(self.driver)
  51. log.info(
  52. 'Creating network "{}" with {}'
  53. .format(self.full_name, driver_name)
  54. )
  55. self.client.create_network(
  56. name=self.full_name,
  57. driver=self.driver,
  58. options=self.driver_opts,
  59. ipam=self.ipam,
  60. )
  61. def remove(self):
  62. if self.external_name:
  63. log.info("Network %s is external, skipping", self.full_name)
  64. return
  65. log.info("Removing network {}".format(self.full_name))
  66. self.client.remove_network(self.full_name)
  67. def inspect(self):
  68. return self.client.inspect_network(self.full_name)
  69. @property
  70. def full_name(self):
  71. if self.external_name:
  72. return self.external_name
  73. return '{0}_{1}'.format(self.project, self.name)
  74. def create_ipam_config_from_dict(ipam_dict):
  75. if not ipam_dict:
  76. return None
  77. return create_ipam_config(
  78. driver=ipam_dict.get('driver'),
  79. pool_configs=[
  80. create_ipam_pool(
  81. subnet=config.get('subnet'),
  82. iprange=config.get('ip_range'),
  83. gateway=config.get('gateway'),
  84. aux_addresses=config.get('aux_addresses'),
  85. )
  86. for config in ipam_dict.get('config', [])
  87. ],
  88. )