Skip to content

Commit

Permalink
Creates a memoized provider builder for AWS. (#648)
Browse files Browse the repository at this point in the history
This could speed up stacker by many seconds based on the profiling work
@ejholmes performed in #630

	modified:   stacker/providers/aws/default.py
  • Loading branch information
russellballestrini authored and phobologic committed Aug 28, 2018
1 parent c396146 commit c002087
Showing 1 changed file with 28 additions and 5 deletions.
33 changes: 28 additions & 5 deletions stacker/providers/aws/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
import urllib.parse
import sys

# thread safe, memoized, provider builder.
from threading import Lock

import botocore.exceptions
from botocore.config import Config

Expand Down Expand Up @@ -448,17 +451,37 @@ def generate_stack_policy_args(stack_policy=None):


class ProviderBuilder(object):
"""Implements a ProviderBuilder for the AWS provider."""
"""Implements a Memoized ProviderBuilder for the AWS provider."""

def __init__(self, region=None, **kwargs):
self.region = region
self.kwargs = kwargs
self.providers = {}
self.lock = Lock()

def build(self, region=None, profile=None):
if not region:
region = self.region
session = get_session(region=region, profile=profile)
return Provider(session, region=region, **self.kwargs)
"""Get or create the provider for the given region and profile."""

with self.lock:
# memoization lookup key derived from region + profile.
key = "{}-{}".format(profile, region)
try:
# assume provider is in provider dictionary.
provider = self.providers[key]
except KeyError:
msg = "Missed memoized lookup ({}), creating new AWS Provider."
logger.debug(msg.format(key))
if not region:
region = self.region
# memoize the result for later.
self.providers[key] = Provider(
get_session(region=region, profile=profile),
region=region,
**self.kwargs
)
provider = self.providers[key]

return provider


class Provider(BaseProvider):
Expand Down

0 comments on commit c002087

Please sign in to comment.