public function testComplex()
{
/* @var $farm Farm */
$farm = $this->createTestFarm('server', ['base-ubuntu1404']);
/* @var $farmRole FarmRole */
$farmRole = $farm->farmRoles->current();
$server = null;
static::toDelete(Farm::class, [$farm->id]);
$uri = self::getUserApiUrl("/farms/{$farm->id}/actions/launch");
$this->request($uri, Request::METHOD_POST);
for ($time = time(), $sleep = 50; time() - $time < 400 && (empty($server) || $server->status != Server::STATUS_RUNNING); $sleep += 50) {
sleep($sleep);
$testServers = $this->listServers(['farmId' => $farm->id]);
if (count($testServers) > 0) {
$server = reset($testServers);
/* @var $server Server */
continue;
}
}
$this->assertNotEmpty($server);
$this->assertEquals($server->status, 'running');
$testDescribe = [['farmId' => $farm->id], ['farmRoleId' => $farmRole->id], ['serverId' => 'all']];
// testing describe and fetch action
foreach ($testDescribe as $value) {
$servers = $this->listServers($value);
$serverAdapter = $this->getAdapter('server');
$filterable = $serverAdapter->getRules()[ApiEntityAdapter::RULE_TYPE_FILTERABLE];
foreach ($servers as $server) {
/* @var $server Server */
foreach ($filterable as $property) {
$filterValue = $server->{$property};
$listResult = $this->listServers($value, [$property => $filterValue]);
if (!static::isRecursivelyEmpty($filterValue)) {
foreach ($listResult as $filtered) {
$this->assertEquals($filterValue, $filtered->{$property}, "Property '{$property}' mismatch");
}
}
}
$response = $this->getServer($server->id);
$this->assertEquals(200, $response->status, $this->printResponseError($response));
$dbServer = Server::findPk($server->id);
$this->assertObjectEqualsEntity($response->getBody()->data, $dbServer, $serverAdapter);
}
}
$entity = Server::findPk($server->id);
/* @var $entity Server */
$DBServerObject = $entity->__getDBServer();
$oldModel = DBServer::LoadByID($server->id);
$this->assertEquals($DBServerObject, $oldModel);
$serverEntity = (new Server())->__getEntityFromDBServer($oldModel);
$this->assertEquals($entity, $serverEntity);
// testing reboot action
$response = $this->rebootServer($server->id, true);
$this->assertEquals(200, $response->status, $this->printResponseError($response));
$data = $response->getBody()->data;
$this->assertEquals($server->id, $data->id);
$propertyReboot = ServerProperty::findOne([['serverId' => $server->id], ['name' => SERVER_PROPERTIES::REBOOTING]]);
/* @var $propertyReboot ServerProperty */
for ($time = time(), $sleep = 50; time() - $time < 300 && (!$propertyReboot || $propertyReboot->value); $sleep += 50) {
$propertyReboot = ServerProperty::findOne([['serverId' => $server->id], ['name' => SERVER_PROPERTIES::REBOOTING]]);
}
$server = $this->waitForChanges($server->id, Server::STATUS_RUNNING);
// testing suspend action
$response = $this->suspendServer($server->id);
$this->assertEquals(200, $response->status, $this->printResponseError($response));
$data = $response->getBody()->data;
$this->assertEquals($server->id, $data->id);
$this->assertEquals($data->status, 'pending_suspend');
$server = $this->waitForChanges($server->id, Server::STATUS_SUSPENDED, 600);
// testing resume action
$sleep = 0;
do {
try {
$response = $this->resumeServer($server->id);
if ($response->status == 200) {
break;
}
} catch (Exception $e) {
if (strpos($e->getMessage(), "is not in a state from which it can be started") !== false) {
$sleep += 60;
sleep(60);
} else {
throw $e;
}
}
} while ($sleep < 300);
$this->assertEquals(200, $response->status, $this->printResponseError($response));
$data = $response->getBody()->data;
$this->assertEquals($server->id, $data->id);
$this->assertEquals($data->status, 'resuming');
$server = $this->waitForChanges($server->id, Server::STATUS_RUNNING);
}