Skip to content

Commit

Permalink
patches
Browse files Browse the repository at this point in the history
  • Loading branch information
bentheiii committed Nov 17, 2020
1 parent d3c86e5 commit ed9b5ff
Show file tree
Hide file tree
Showing 11 changed files with 42 additions and 20 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# Yellowbox Changelog
## 0.2.1
### Fixed
* logstash is now fixed
* all `retry_specs` parameters have been replaced with `retry_spec`
## 0.2.0
### Added
* all extra-containers with retrying startup mechanisms now support retry
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "yellowbox"
version = "0.2.0"
version = "0.2.1"
description = ""
authors = ["biocatch ltd"]
license = "MIT"
Expand Down
7 changes: 7 additions & 0 deletions tests/extras/test_logstash.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from yellowbox.extras.logstash import LogstashService

# rebuilding the logstash service is an ongoing ticket, for now we just want to make sure it runs alright

def test_make(docker_client):
with LogstashService.run(docker_client):
pass
2 changes: 1 addition & 1 deletion yellowbox/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = '0.2.0'
__version__ = '0.2.1'
6 changes: 3 additions & 3 deletions yellowbox/extras/azure_storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,16 @@ def container_connection_string(self):
f"BlobEndpoint="
f"http://{short_id(self.container)}:{BLOB_STORAGE_DEFAULT_PORT}/{self.account_name};")

def start(self, retry_specs: Optional[RetrySpec] = None):
def start(self, retry_spec: Optional[RetrySpec] = None):
super().start()

def check_ready():
if b"Azurite Blob service successfully listens on" not in self.container.logs():
raise _ResourceNotReady

retry_specs = retry_specs or RetrySpec(attempts=10)
retry_spec = retry_spec or RetrySpec(attempts=10)

retry_specs.retry(check_ready, _ResourceNotReady)
retry_spec.retry(check_ready, _ResourceNotReady)
return self

def connect(self, network: Network, aliases: Optional[List[str]] = None,
Expand Down
6 changes: 3 additions & 3 deletions yellowbox/extras/http_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,11 +219,11 @@ def _helper():

return _helper()

def start(self, retry_specs: Optional[RetrySpec] = None):
def start(self, retry_spec: Optional[RetrySpec] = None):
with self.patch_route('GET', '/health', 200):
self.server_thread.start()
retry_specs = retry_specs or RetrySpec(attempts=10)
retry_specs.retry(
retry_spec = retry_spec or RetrySpec(attempts=10)
retry_spec.retry(
lambda: requests.get(self.local_url + '/health').raise_for_status(),
(ConnectionError, HTTPError)
)
Expand Down
6 changes: 3 additions & 3 deletions yellowbox/extras/kafka.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@ def producer(self, **kwargs) -> ContextManager[KafkaProducer]:
closing(KafkaProducer(bootstrap_servers=[f'localhost:{port}'], security_protocol="PLAINTEXT", **kwargs))
)

def start(self, retry_specs: Optional[RetrySpec] = None):
def start(self, retry_spec: Optional[RetrySpec] = None):
super().start()
retry_specs = retry_specs or RetrySpec(attempts=20)
with retry_specs.retry(self.consumer, (KafkaError, ConnectionError, ValueError)):
retry_spec = retry_spec or RetrySpec(attempts=20)
with retry_spec.retry(self.consumer, (KafkaError, ConnectionError, ValueError)):
pass
return self

Expand Down
11 changes: 11 additions & 0 deletions yellowbox/extras/logstash.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
from typing import Optional

from docker import DockerClient

from yellowbox.retry import RetrySpec
from yellowbox.containers import get_ports, create_and_pull
from yellowbox.subclasses import SingleContainerService, RunMixin

Expand All @@ -15,5 +18,13 @@ def __init__(self, docker_client: DockerClient, image='logstash:7.8.1', **kwargs
ports={LOGSTASH_DEFAULT_PORT: None}
), **kwargs)

def start(self, retry_spec: Optional[RetrySpec] = None):
# for now we just start the service, re-implementing this service is an ongoing ticket
return super().start(retry_spec)

def client_port(self):
return get_ports(self.container)[LOGSTASH_DEFAULT_PORT]

def stop(self, signal='SIGKILL'):
# change in default
return super().stop(signal)
6 changes: 3 additions & 3 deletions yellowbox/extras/rabbit_mq.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ def connection(self, **kwargs):
)
return BlockingConnection(connection_params)

def start(self, retry_specs: Optional[RetrySpec] = None):
def start(self, retry_spec: Optional[RetrySpec] = None):
super().start()
retry_specs = retry_specs or RetrySpec(attempts=20)
conn = retry_specs.retry(self.connection, AMQPConnectionError)
retry_spec = retry_spec or RetrySpec(attempts=20)
conn = retry_spec.retry(self.connection, AMQPConnectionError)
conn.close()
return self

Expand Down
6 changes: 3 additions & 3 deletions yellowbox/extras/redis.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ def client(self, *, client_cls: Callable[..., _T] = Redis, **kwargs) -> _T:
port = self.client_port()
return client_cls(host='localhost', port=port, **kwargs)

def start(self, retry_specs: Optional[RetrySpec] = None):
def start(self, retry_spec: Optional[RetrySpec] = None):
super().start()
with self.client() as client:
retry_specs = retry_specs or RetrySpec(attempts=10)
retry_specs.retry(client.ping, RedisConnectionError)
retry_spec = retry_spec or RetrySpec(attempts=10)
retry_spec.retry(client.ping, RedisConnectionError)
self.started = True
return self

Expand Down
6 changes: 3 additions & 3 deletions yellowbox/subclasses.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,22 +101,22 @@ def service_name(cls):
@classmethod
@contextmanager
def run(cls: Type[_T], docker_client: DockerClient, *, spinner: bool = True,
retry_specs: Optional[RetrySpec] = None, **kwargs) -> Generator[_T, None, None]:
retry_spec: Optional[RetrySpec] = None, **kwargs) -> Generator[_T, None, None]:
"""
Same as RunMixin.run, but allows to forward retry arguments to the blocking start method.
Args:
docker_client: a DockerClient instance to use when creating the service
spinner: whether or not to use a yaspin spinner
retry_specs: forwarded to cls.start
retry_spec: forwarded to cls.start
**kwargs: all keyword arguments are forwarded to the class's constructor
"""
spinner = _get_spinner(spinner)
with spinner(f"Fetching {cls.service_name()} ..."):
service = cls(docker_client, **kwargs)

with spinner(f"Waiting for {cls.service_name()} to start..."):
service.start(retry_specs=retry_specs)
service.start(retry_spec=retry_spec)

with service:
yield service

0 comments on commit ed9b5ff

Please sign in to comment.