content: /*
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you under the Apache License, Version 2.0 (the
   * "License"); you may not use this file except in compliance
   * with the License.  You may obtain a copy of the License at
   *
   *     http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.ambari.funtest.server.utils;
  
  import com.google.gson.JsonElement;
  import com.google.gson.JsonObject;
  import org.apache.ambari.funtest.server.ConnectionParams;
  import org.apache.ambari.funtest.server.WebRequest;
  import org.apache.ambari.funtest.server.api.cluster.GetRequestStatusWebRequest;
  import org.apache.ambari.server.actionmanager.HostRoleStatus;
  
  /**
   * Polls the status of a service component host request.
   */
  class RequestStatusPoller implements Runnable {
      private HostRoleStatus hostRoleStatus;
      private ConnectionParams serverParams;
      private String clusterName;
      private int requestId;
  
      public RequestStatusPoller(ConnectionParams serverParams, String clusterName, int requestId) {
          this.hostRoleStatus = HostRoleStatus.IN_PROGRESS;
          this.serverParams = serverParams;
          this.clusterName = clusterName;
          this.requestId = requestId;
      }
  
      public HostRoleStatus getHostRoleStatus() {
          return this.hostRoleStatus;
      }
  
      public static boolean poll(ConnectionParams serverParams, String clusterName, int requestId) throws Exception {
          RequestStatusPoller poller = new RequestStatusPoller(serverParams, clusterName, requestId);
          Thread pollerThread = new Thread(poller);
          pollerThread.start();
          pollerThread.join();
          if (poller.getHostRoleStatus() == HostRoleStatus.COMPLETED)
              return true;
  
          return false;
      }
  
      @Override
      public void run() {
          int retryCount = 5;
          while (true) {
              JsonElement jsonResponse;
  
              try {
                  WebRequest webRequest = new GetRequestStatusWebRequest(serverParams, clusterName, requestId);
                  jsonResponse = RestApiUtils.executeRequest(webRequest);
              } catch (Exception ex) {
                  throw new RuntimeException(ex);
              }
              if (!jsonResponse.isJsonNull()) {
                  JsonObject jsonObj = jsonResponse.getAsJsonObject();
                  JsonObject jsonRequestsObj = jsonObj.getAsJsonObject("Requests");
                  String requestStatus = jsonRequestsObj.get("request_status").getAsString();
                  hostRoleStatus = HostRoleStatus.valueOf(requestStatus);
  
                  if (hostRoleStatus == HostRoleStatus.COMPLETED ||
                          hostRoleStatus == HostRoleStatus.ABORTED ||
                          hostRoleStatus == HostRoleStatus.TIMEDOUT ||
                          retryCount == 0)
                      break;
              }
  
              try {
                  Thread.sleep(5000);
              } catch (InterruptedException ex) {
                  break;
              }
  
              retryCount--;
          }
      }
  }