/* * 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--; } } }