Browse Source

Handle creating per-thread `DynectSession`s

pull/12/head
Ross McFarland 9 years ago
parent
commit
fe1d1b22d7
1 changed files with 17 additions and 13 deletions
  1. +17
    -13
      octodns/provider/dyn.py

+ 17
- 13
octodns/provider/dyn.py View File

@ -14,6 +14,7 @@ from dyn.tm.services.dsf import DSFARecord, DSFAAAARecord, DSFFailoverChain, \
from dyn.tm.session import DynectSession
from dyn.tm.zones import Zone as DynZone
from logging import getLogger
from threading import local
from uuid import uuid4
from ..record import Record
@ -134,8 +135,7 @@ class DynProvider(BaseProvider):
'AN': 17, # Continental Antartica
}
# Going to be lazy loaded b/c it makes a (slow) request, global
_dyn_sess = None
_thread_local = local()
def __init__(self, id, customer, username, password,
traffic_directors_enabled=False, *args, **kwargs):
@ -159,17 +159,21 @@ class DynProvider(BaseProvider):
return self.traffic_directors_enabled
def _check_dyn_sess(self):
if self._dyn_sess:
self.log.debug('_check_dyn_sess: exists')
return
self.log.debug('_check_dyn_sess: creating')
# Dynect's client is ugly, you create a session object, but then don't
# use it for anything. It just makes the other objects work behind the
# scences. :-( That probably means we can only support a single set of
# dynect creds
self._dyn_sess = DynectSession(self.customer, self.username,
self.password)
try:
DynProvider._thread_local.dyn_sess
except AttributeError:
self.log.debug('_check_dyn_sess: creating')
# Dynect's client is odd, you create a session object, but don't
# use it for anything. It just makes the other objects work behind
# the scences. :-( That probably means we can only support a single
# set of dynect creds, so no split accounts. They're also per
# thread so we need to create one per thread. I originally tried
# calling DynectSession.get_session to see if there was one and
# creating if not, but that was always returning None, so now I'm
# manually creating them once per-thread. I'd imagine this could be
# figured out, but ...
DynectSession(self.customer, self.username, self.password)
DynProvider._thread_local.dyn_sess = True
def _data_for_A(self, _type, records):
return {


Loading…
Cancel
Save