Timeout should probably be higher. In MySqlApp.cc it's 500.

So the service status (which should be called datastore status) in Trove at this point will be NEW. If you look at the Sql code, as soon as it gets prepare, it sets the status to BUILD by calling "status->begin_install()" of the MySqlAppStatus class (https://github.com/TimSimpsonR/sneaky-pete/blob/master/src/nova/guest/mysql/MySqlApp.cc#L219). If anything goes wrong (say an exception is thrown) it calls "end_failed_install" which sets the Status to failed (https://github.com/TimSimpsonR/sneaky-pete/blob/master/src/nova/guest/mysql/MySqlApp.cc#L262). On success it calls end_install_or_restart (https://github.com/TimSimpsonR/sneaky-pete/blob/master/src/nova/guest/mysql/MySqlApp.cc#L258). 

Because this logic isn't too trivial it's put in the MySqlApp class (though I have thought it could be in it's own class just for installing the app). You should probably move the install logic there too, so ops can know if the installation fails (currently it will always be stuck in NEW).

Additionally, as you may have guessed you'll need a status class. If you look at MySqlAppStatus you'll see it extends DatastoreStatus (https://github.com/TimSimpsonR/sneaky-pete/blob/master/src/nova/datastores/DatastoreStatus.h) with just a few extra functions which make some process calls to determine the actual MySQL status (https://github.com/TimSimpsonR/sneaky-pete/blob/master/src/nova/guest/mysql/MySqlAppStatus.cc). You could create a RedisAppStatus class the same way that pings Redis, or does whatever it is you'll need to do to see if it's alive.