Advanced
Create a test interface for your application
You can define a series of tests for your application.
Such tests will be run when issuing the command test
.
The logic is similar to the application interface - you need to define a test client.
This is a handler for a Python requests session
.
When running gc-ssf test
an instance of your server will run
and a test client will issue the standard SSF tests as well as your custom tests.
For example:
In the same Python file where you defined the SSFApplicationInterface
, define a child class of SSFApplicationTestInterface
and implement the required methods:
from ssf.application import SSFApplicationTestInterface
logger = logging.getLogger()
class MyTestClient(SSFApplicationTestInterface):
def begin(self, session, ipaddr: str) -> int:
"""
Begin application testing.
session: The Python requests library session (credentials are initialised before calling into application tests).
ipaddr (str): IP address including port (e.g. "http://0.0.0.0:8100")
Returns:
0 if successful.
"""
logger.info("MyApp test begin")
return 0
def subtest(self, session, ipaddr: str, index: int) -> Tuple[bool, str, bool]:
"""
Issue test.
Parameters:
session: The Python requests library session (credentials are initialised before calling into application tests).
ipaddr (str): IP address including port (e.g. "http://0.0.0.0:8100")
index (int): Subtest index, starting at zero after 'begin' and incrementing with each call to subtest.
Returns:
tuple ((bool, str, bool)):
True if test passed,
A human-readable description of the result (for logging),
True to continue running tests.
"""
max_iter = 9
test_inputs = [1,2,3,4,5,6,7,8,9,10]
logger.debug(
f"MyApp test index={index} out of {max_iter}"
)
test_input = test_inputs[index]
url = f"{ipaddr}/tested_endpoint/"
params = {"x": f"{test_input}"}
response = session.post(url, params=params, headers={"accept": "application/json"}, timeout=5
)
def eval_result(response):
if response.status_code == 200:
return (True, "Test passed")
else:
return (False, "Test failed")
status, message = eval_result(response)
if index >= max_iter:
# stop testing
return (status, message, False)
else:
# continue testing
return (status, message, True)
def end(self, session, ipaddr: str) -> int:
"""
End application testing.
session: The Python requests library session (credentials are initialised before calling into application tests).
ipaddr (str): IP address including port (e.g. "http://0.0.0.0:8100")
Returns:
0 if successful.
"""
logger.info("MyApp test ends")
return 0
def create_ssf_application_test_instance(ssf_config: SSFConfig) -> SSFApplicationTestInterface:
logger.info("Create a test instance")
return MyTestClient()
The method subtest
will run in a loop as long as the last value of the output tuple is True
. For each iteration, the input index
is incremented.
Additional checks can be written in the begin
and end
methods.
Note that you also need to define the builder create_ssf_application_test_instance
to enable SSF to get the instance.
SSFConfig object passed to the test instance factory captures as a copy both the current ssf config and run-time arguments in a single structure and is provided as additional context for the test.
Check the available IPUs
SSF provides a few utilities that you can use when implementing SSFApplicationInterface
,
You can use get_ipu_count
to check how many IPUs are available on the system where your application is executed.
Building an SSF image
SSF can self package:
The diagram below shows what happens when this command is run:The resulting SSF image can be run as an interactive Bash session:
Or it can be used to start an application dynamically by passing options with the SSF_OPTIONS environment variable. The following example shows how the SSF container might be used for rapid deployment of an application:
gc-docker -- --rm -d --env SSF_OPTIONS='--config git@github.com:graphcore/simple-server-framework.git|examples/simple/ssf_config.yaml init build run' ssf:latest
Building the wheel from sources
Build the wheel:
Installing the built wheel
Then install the wheel:
Running the CLI from Python
You can run the SSF CLI from Python. For example: