Skip to main content

ReadyCondition

The ReadyCondition can be used to execute a readiness check after a service is started to confirm that it is ready to receive connections and traffic.

As you will see below, using ReadyCondition is a flexible and highly configurable way to define a readiness check for a given service. However, if all you need is a check upon service startup for whether or not a port is open and ready for traffic, then we recommend relying on the default wait field in the PortSpec constructor (as part of the ServiceConfig type).

ready_conditions = ReadyCondition(

# The recipe that will be used to check service's readiness.
# Valid values are of the following types: (ExecRecipe, GetHttpRequestRecipe or PostHttpRequestRecipe)
# MANDATORY
recipe = GetHttpRequestRecipe(
port_id = "http",
endpoint = "/ping",
),

# The `field's value` will be used to do the asssertions. To learn more about available fields,
# that can be used for assertions, please refer to exec and request instructions.
# MANDATORY
field = "code",

# The assertion is the comparison operation between value and target_value.
# Valid values are "==", "!=", ">=", "<=", ">", "<" or "IN" and "NOT_IN" (if target_value is list).
# MANDATORY
assertion = "==",

# The target value that value will be compared against.
# MANDATORY
target_value = 200,

# The interval value is the initial interval suggestion for the command to wait between calls
# It follows a exponential backoff process, where the i-th backoff interval is rand(0.5, 1.5)*interval*2^i
# Follows Go "time.Duration" format https://pkg.go.dev/time#ParseDuration
# OPTIONAL (Default: "1s")
interval = "1s",

# The timeout value is the maximum time that the readiness check waits for the assertion to be true
# Follows Go "time.Duration" format https://pkg.go.dev/time#ParseDuration
# OPTIONAL (Default: "15m")
timeout = "5m",
)

An example of using ReadyCondition:

def run(plan):
# we define the recipe first
get_recipe = GetHttpRequestRecipe(
port_id = "http-port",
endpoint = "?input=foo/bar",
extract = {
"exploded-slash": ".query.input | split(\"/\") | .[1]"
}
)

# then the ready conditions using the ReadyCondition type which contain the recipe already created
ready_conditions_config = ReadyCondition(
recipe = get_recipe,
field = "code",
assertion = "==",
target_value = 200,
interval = "10s",
timeout = "200s",
)

# we set the ready conditions in the ServiceConfig
service_config = ServiceConfig(
image = "mendhak/http-https-echo:26",
ports = {
"http-port": PortSpec(number = 8080, transport_protocol = "TCP")
},
ready_conditions= ready_conditions_config,
)

# finally we execute the add_service instruction using all the pre-configured data
plan.add_service(name = "web-server", config = service_config)

and with an ExecRecipe:

def run(plan):
# we define the recipe first
exec_recipe = ExecRecipe(
command = ["echo '{"key":"Hi}'],
)

ready_conditions_config = ReadyCondition(
recipe = exec_recipe,
# note how the possible fields are based on the result of executing the ExecRecipe - in this case, .extract
field = "output"
assertion = "!=",
target_value = "",
interval = "10s",
timeout = "200s",
)

service_config = ServiceConfig(
image = "ubuntu",
ready_conditions= ready_conditions_config,
)

plan.add_service(name = "web-server", config = service_config)