Merge pull request #1897 from coreos-inc/hash-executor-whitelist

Add hash-based staged rollout to build executors
This commit is contained in:
josephschorr 2016-09-30 17:52:19 +02:00 committed by GitHub
commit 0c2b4ed9c1

View file

@ -9,6 +9,7 @@ import trollius
import datetime import datetime
import release import release
import socket import socket
import hashlib
from jinja2 import FileSystemLoader, Environment from jinja2 import FileSystemLoader, Environment
from trollius import coroutine, From, Return, get_event_loop from trollius import coroutine, From, Return, get_event_loop
@ -69,11 +70,21 @@ class BuilderExecutor(object):
def allowed_for_namespace(self, namespace): def allowed_for_namespace(self, namespace):
""" Returns true if this executor can be used for builds in the given namespace. """ """ Returns true if this executor can be used for builds in the given namespace. """
namespace_whitelist = self.executor_config.get('NAMESPACE_WHITELIST')
if namespace_whitelist is not None:
return namespace in namespace_whitelist
return True # Check for an explicit namespace whitelist.
namespace_whitelist = self.executor_config.get('NAMESPACE_WHITELIST')
if namespace_whitelist is not None and namespace in namespace_whitelist:
return True
# Check for a staged rollout percentage. If found, we hash the namespace and, if it is found
# in the first X% of the character space, we allow this executor to be used.
staged_rollout = self.executor_config.get('STAGED_ROLLOUT')
if staged_rollout is not None:
bucket = int(hashlib.sha256(namespace).hexdigest()[-2:], 16)
return bucket < (256 * staged_rollout)
# If there are no restrictions in place, we are free to use this executor.
return staged_rollout is None and namespace_whitelist is None
@property @property
def minimum_retry_threshold(self): def minimum_retry_threshold(self):