All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bettercloud.vault.api.Debug Maven / Gradle / Ivy

There is a newer version: 5.1.0
Show newest version
package com.bettercloud.vault.api;

import com.bettercloud.vault.VaultConfig;
import com.bettercloud.vault.VaultException;
import com.bettercloud.vault.response.HealthResponse;
import com.bettercloud.vault.rest.Rest;
import com.bettercloud.vault.rest.RestException;
import com.bettercloud.vault.rest.RestResponse;

import java.util.HashSet;
import java.util.Set;

/**
 * 

The implementing class for operations on REST endpoints, under the "Debug" section of the Vault HTTP API * docs (https://www.vaultproject.io/docs/http/index.html).

* *

This class is not intended to be constructed directly. Rather, it is meant to used by way of * Vault in a DSL-style builder pattern. See the Javadoc comments of each public * method for usage examples.

*/ public class Debug { private final VaultConfig config; public Debug(final VaultConfig config) { this.config = config; } /** *

Returns the health status of Vault. This matches the semantics of a Consul HTTP * health check and provides a simple way to monitor the health of a Vault instance.

* * @see https://www.vaultproject.io/docs/http/sys-health.html * *
*
{@code
     * final VaultConfig config = new VaultConfig.address(...).token(...).build();
     * final Vault vault = new Vault(config);
     *
     * final HealthResponse response = vault.sys().debug().health();
     *
     * final Boolean sealed = response.getSealed();  // Warning: CAN be null!
     * }
*
* * @return The response information returned from Vault * @throws VaultException If any errors occurs with the REST request (e.g. non-200 status code, invalid JSON payload, etc), and the maximum number of retries is exceeded. */ public HealthResponse health() throws VaultException { return health(null, null, null, null); } /** *

An overloaded version of {@link Debug#health()} that allows for passing one or more optional parameters.

* *

WARNING: In testing, we've found that changing the default HTTP status codes can result in the operation * succeeding, but returning an empty JSON payload in the response. For example, this seems to happen when you * set activeCode to 204, but not for 212 (the regular default is 200). When this happens, the * HealthResponse return object will have null values in most of its fields, and you * will need to check HealthReponse.getRestResponse().getStatus() to determine the result of * the operation.

* * @param standbyOk (optional) Indicates that being a standby should still return the active status code instead of the standby code * @param activeCode (optional) Indicates the status code that should be returned for an active node instead of the default of 200 * @param standbyCode (optional) Indicates the status code that should be returned for a standby node instead of the default of 429 * @param sealedCode (optional) Indicates the status code that should be returned for a sealed node instead of the default of 500 * @return The response information returned from Vault * @throws VaultException If an error occurs or unexpected response received from Vault */ public HealthResponse health( final Boolean standbyOk, final Integer activeCode, final Integer standbyCode, final Integer sealedCode ) throws VaultException { final String path = "sys/health"; int retryCount = 0; while (true) { try { // Build an HTTP request for Vault final Rest rest = new Rest()//NOPMD .url(config.getAddress() + "/v1/" + path) .connectTimeoutSeconds(config.getOpenTimeout()) .readTimeoutSeconds(config.getReadTimeout()) .sslVerification(config.getSslConfig().isVerify()) .sslContext(config.getSslConfig().getSslContext()); // Add token if present if (config.getToken() != null) { rest.header("X-Vault-Token", config.getToken()); } // Add params if present if (standbyOk != null) rest.parameter("standbyok", standbyOk.toString()); if (activeCode != null) rest.parameter("activecode", activeCode.toString()); if (standbyCode != null) rest.parameter("standbycode", standbyCode.toString()); if (sealedCode != null) rest.parameter("sealedcode", sealedCode.toString()); // Execute request final RestResponse restResponse = rest.get(); // Validate response final Set validCodes = new HashSet<>();//NOPMD validCodes.add(200); validCodes.add(429); validCodes.add(500); if (activeCode != null) validCodes.add(activeCode); if (standbyCode != null) validCodes.add(standbyCode); if (sealedCode != null) validCodes.add(sealedCode); if (!validCodes.contains(restResponse.getStatus())) { throw new VaultException("Vault responded with HTTP status code: " + restResponse.getStatus(), restResponse.getStatus()); } return new HealthResponse(restResponse, retryCount); } catch (RuntimeException | VaultException | RestException e) { // If there are retries to perform, then pause for the configured interval and then execute the loop again... if (retryCount < config.getMaxRetries()) { retryCount++; try { final int retryIntervalMilliseconds = config.getRetryIntervalMilliseconds(); Thread.sleep(retryIntervalMilliseconds); } catch (InterruptedException e1) { e1.printStackTrace(); } } else if (e instanceof VaultException) { // ... otherwise, give up. throw (VaultException) e; } else { throw new VaultException(e); } } } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy