Scalr\Tests\Functional\Api\Service\User\V1beta0\Controller\ServersTest::testComplex PHP Method

testComplex() public method

public testComplex ( )
    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);
    }