Ejemplo n.º 1
0
 /**
  * Update server's information
  *
  * @param jsonData $servers optional List of servers to check against
  * @throws \Scalr_Exception_InsufficientPermissions
  */
 public function xListServersUpdateAction(JsonData $servers = null)
 {
     if (!$this->request->isAllowed([Acl::RESOURCE_FARMS, Acl::RESOURCE_TEAM_FARMS, Acl::RESOURCE_OWN_FARMS]) && !$this->request->isAllowed(Acl::RESOURCE_IMAGES_ENVIRONMENT, Acl::PERM_IMAGES_ENVIRONMENT_MANAGE)) {
         throw new \Scalr_Exception_InsufficientPermissions();
     }
     $props = $retval = [];
     $args = $servers = (array) $servers;
     $stmt = "\n            SELECT s.server_id, s.status, s.remote_ip, s.local_ip, s.dtadded, s.dtinitialized AS uptime\n            FROM servers s\n            LEFT JOIN farms f ON f.id = s.farm_id\n            WHERE s.server_id IN (" . implode(",", array_fill(0, count($servers), "?")) . ")\n            AND s.env_id = ?\n        ";
     $args[] = $this->getEnvironmentId();
     $where = ["s.farm_id IS NOT NULL AND " . $this->request->getFarmSqlQuery()];
     if ($this->request->isAllowed(Acl::RESOURCE_IMAGES_ENVIRONMENT, Acl::PERM_IMAGES_ENVIRONMENT_MANAGE)) {
         $where[] = "s.farm_id IS NULL AND s.status IN (?, ?)";
         $args[] = Entity\Server::STATUS_IMPORTING;
         $args[] = Entity\Server::STATUS_TEMPORARY;
     }
     $stmt .= " AND (" . join(" OR ", $where) . ")";
     if (!empty($servers)) {
         $srs = $this->db->Execute($stmt, $args);
         $neededProps = [Entity\Server::REBOOTING, Entity\Server::MISSING, Entity\Server::SZR_IS_INIT_FAILED, Entity\Server::LAUNCH_ERROR, Entity\Server::SZR_VESION];
         foreach (Entity\Server\Property::fetch($servers, $neededProps) as $resRow) {
             if (!array_key_exists($resRow->serverId, $props)) {
                 $props[$resRow->serverId] = [];
             }
             $props[$resRow->serverId][$resRow->name] = $resRow->value;
         }
         while ($server = $srs->FetchRow()) {
             if (!array_key_exists($server["server_id"], $props)) {
                 $props[$server["server_id"]] = [];
             }
             $status = $server["status"];
             if (in_array($status, [Entity\Server::STATUS_RUNNING, Entity\Server::STATUS_SUSPENDED])) {
                 if (array_key_exists(Entity\Server::REBOOTING, $props[$server["server_id"]]) && $props[$server["server_id"]][Entity\Server::REBOOTING] != 0) {
                     $server["status"] = "Rebooting";
                 }
                 if (array_key_exists(Entity\Server::MISSING, $props[$server["server_id"]]) && $props[$server["server_id"]][Entity\Server::MISSING] != 0) {
                     $server["status"] = "Missing";
                 }
             }
             if (array_key_exists(Entity\Server::SZR_IS_INIT_FAILED, $props[$server["server_id"]]) && $props[$server["server_id"]][Entity\Server::SZR_IS_INIT_FAILED] == 1 && in_array($server["status"], [Entity\Server::STATUS_INIT, Entity\Server::STATUS_PENDING])) {
                 $server["isInitFailed"] = 1;
             }
             if (array_key_exists(Entity\Server::LAUNCH_ERROR, $props[$server["server_id"]]) && $props[$server["server_id"]][Entity\Server::LAUNCH_ERROR] == 1) {
                 $server["launch_error"] = "1";
             }
             $server["agent_version"] = $props[$server["server_id"]][Entity\Server::SZR_VESION];
             if ($status === Entity\Server::STATUS_RUNNING) {
                 $server['uptime'] = \Scalr_Util_DateTime::getHumanReadableTimeout(time() - strtotime($server['uptime']), false);
             } else {
                 $server['uptime'] = '';
             }
             $retval[$server["server_id"]] = $server;
         }
     }
     $this->response->data(["servers" => $retval]);
 }