from ..errors import InvalidVersion from ..utils import version_lt class SwarmSpec(dict): """ Describe a Swarm's configuration and options. Use :py:meth:`~docker.api.swarm.SwarmApiMixin.create_swarm_spec` to instantiate. """ def __init__(self, version, task_history_retention_limit=None, snapshot_interval=None, keep_old_snapshots=None, log_entries_for_slow_followers=None, heartbeat_tick=None, election_tick=None, dispatcher_heartbeat_period=None, node_cert_expiry=None, external_cas=None, name=None, labels=None, signing_ca_cert=None, signing_ca_key=None, ca_force_rotate=None, autolock_managers=None, log_driver=None): if task_history_retention_limit is not None: self['Orchestration'] = { 'TaskHistoryRetentionLimit': task_history_retention_limit } if any([snapshot_interval, keep_old_snapshots, log_entries_for_slow_followers, heartbeat_tick, election_tick]): self['Raft'] = { 'SnapshotInterval': snapshot_interval, 'KeepOldSnapshots': keep_old_snapshots, 'LogEntriesForSlowFollowers': log_entries_for_slow_followers, 'HeartbeatTick': heartbeat_tick, 'ElectionTick': election_tick } if dispatcher_heartbeat_period: self['Dispatcher'] = { 'HeartbeatPeriod': dispatcher_heartbeat_period } ca_config = {} if node_cert_expiry is not None: ca_config['NodeCertExpiry'] = node_cert_expiry if external_cas: if version_lt(version, '1.25'): if len(external_cas) > 1: raise InvalidVersion( 'Support for multiple external CAs is not available ' 'for API version < 1.25' ) ca_config['ExternalCA'] = external_cas[0] else: ca_config['ExternalCAs'] = external_cas if signing_ca_key: if version_lt(version, '1.30'): raise InvalidVersion( 'signing_ca_key is not supported in API version < 1.30' ) ca_config['SigningCAKey'] = signing_ca_key if signing_ca_cert: if version_lt(version, '1.30'): raise InvalidVersion( 'signing_ca_cert is not supported in API version < 1.30' ) ca_config['SigningCACert'] = signing_ca_cert if ca_force_rotate is not None: if version_lt(version, '1.30'): raise InvalidVersion( 'force_rotate is not supported in API version < 1.30' ) ca_config['ForceRotate'] = ca_force_rotate if ca_config: self['CAConfig'] = ca_config if autolock_managers is not None: if version_lt(version, '1.25'): raise InvalidVersion( 'autolock_managers is not supported in API version < 1.25' ) self['EncryptionConfig'] = {'AutoLockManagers': autolock_managers} if log_driver is not None: if version_lt(version, '1.25'): raise InvalidVersion( 'log_driver is not supported in API version < 1.25' ) self['TaskDefaults'] = {'LogDriver': log_driver} if name is not None: self['Name'] = name if labels is not None: self['Labels'] = labels class SwarmExternalCA(dict): """ Configuration for forwarding signing requests to an external certificate authority. Args: url (string): URL where certificate signing requests should be sent. protocol (string): Protocol for communication with the external CA. options (dict): An object with key/value pairs that are interpreted as protocol-specific options for the external CA driver. ca_cert (string): The root CA certificate (in PEM format) this external CA uses to issue TLS certificates (assumed to be to the current swarm root CA certificate if not provided). """ def __init__(self, url, protocol=None, options=None, ca_cert=None): self['URL'] = url self['Protocol'] = protocol self['Options'] = options self['CACert'] = ca_cert