| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- from __future__ import absolute_import
- from __future__ import unicode_literals
- import logging
- from docker.errors import NotFound
- from docker.utils import create_ipam_config
- from docker.utils import create_ipam_pool
- from .config import ConfigurationError
- log = logging.getLogger(__name__)
- class Network(object):
- def __init__(self, client, project, name, driver=None, driver_opts=None,
- ipam=None, external_name=None):
- self.client = client
- self.project = project
- self.name = name
- self.driver = driver
- self.driver_opts = driver_opts
- self.ipam = create_ipam_config_from_dict(ipam)
- self.external_name = external_name
- def ensure(self):
- if self.external_name:
- try:
- self.inspect()
- log.debug(
- 'Network {0} declared as external. No new '
- 'network will be created.'.format(self.name)
- )
- except NotFound:
- raise ConfigurationError(
- 'Network {name} declared as external, but could'
- ' not be found. Please create the network manually'
- ' using `{command} {name}` and try again.'.format(
- name=self.external_name,
- command='docker network create'
- )
- )
- return
- try:
- data = self.inspect()
- if self.driver and data['Driver'] != self.driver:
- raise ConfigurationError(
- 'Network "{}" needs to be recreated - driver has changed'
- .format(self.full_name))
- if data['Options'] != (self.driver_opts or {}):
- raise ConfigurationError(
- 'Network "{}" needs to be recreated - options have changed'
- .format(self.full_name))
- except NotFound:
- driver_name = 'the default driver'
- if self.driver:
- driver_name = 'driver "{}"'.format(self.driver)
- log.info(
- 'Creating network "{}" with {}'
- .format(self.full_name, driver_name)
- )
- self.client.create_network(
- name=self.full_name,
- driver=self.driver,
- options=self.driver_opts,
- ipam=self.ipam,
- )
- def remove(self):
- if self.external_name:
- log.info("Network %s is external, skipping", self.full_name)
- return
- log.info("Removing network {}".format(self.full_name))
- self.client.remove_network(self.full_name)
- def inspect(self):
- return self.client.inspect_network(self.full_name)
- @property
- def full_name(self):
- if self.external_name:
- return self.external_name
- return '{0}_{1}'.format(self.project, self.name)
- def create_ipam_config_from_dict(ipam_dict):
- if not ipam_dict:
- return None
- return create_ipam_config(
- driver=ipam_dict.get('driver'),
- pool_configs=[
- create_ipam_pool(
- subnet=config.get('subnet'),
- iprange=config.get('ip_range'),
- gateway=config.get('gateway'),
- aux_addresses=config.get('aux_addresses'),
- )
- for config in ipam_dict.get('config', [])
- ],
- )
|