diff options
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/components/health/PortalHealthCheckBuilder.java')
-rw-r--r-- | catalog-be/src/main/java/org/openecomp/sdc/be/components/health/PortalHealthCheckBuilder.java | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/health/PortalHealthCheckBuilder.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/health/PortalHealthCheckBuilder.java new file mode 100644 index 0000000000..f9281e1ef2 --- /dev/null +++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/health/PortalHealthCheckBuilder.java @@ -0,0 +1,230 @@ +/*- + * ============LICENSE_START======================================================= + * SDC + * ================================================================================ + * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.sdc.be.components.health; + +import com.google.common.annotations.VisibleForTesting; +import org.apache.commons.lang.StringUtils; +import org.onap.portalsdk.core.onboarding.exception.CipherUtilException; +import org.onap.portalsdk.core.onboarding.util.PortalApiProperties; +import org.openecomp.sdc.be.config.Configuration; +import org.openecomp.sdc.be.config.Configuration.EcompPortalConfig; +import org.openecomp.sdc.be.config.ConfigurationManager; +import org.openecomp.sdc.be.ecomp.PortalPropertiesEnum; +import org.openecomp.sdc.common.api.Constants; +import org.openecomp.sdc.common.api.HealthCheckInfo; +import org.openecomp.sdc.common.api.HealthCheckInfo.HealthCheckStatus; +import org.openecomp.sdc.common.http.client.api.HttpExecuteException; +import org.openecomp.sdc.common.http.client.api.HttpRequest; +import org.openecomp.sdc.common.http.client.api.HttpResponse; +import org.openecomp.sdc.common.http.config.HttpClientConfig; +import org.openecomp.sdc.common.http.config.Timeouts; +import org.openecomp.sdc.common.log.wrappers.Logger; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import java.security.InvalidParameterException; +import java.util.Base64; +import java.util.Properties; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +import static org.apache.http.HttpStatus.SC_OK; +import static org.onap.portalsdk.core.onboarding.util.CipherUtil.decryptPKC; +import static org.openecomp.sdc.common.api.Constants.HC_COMPONENT_ECOMP_PORTAL; +import static org.openecomp.sdc.common.api.HealthCheckInfo.HealthCheckStatus.DOWN; +import static org.openecomp.sdc.common.api.HealthCheckInfo.HealthCheckStatus.UP; + +@Component("portalHealthCheckBusinessLogic") +public class PortalHealthCheckBuilder { + + private static final Logger log = Logger.getLogger(HealthCheckBusinessLogic.class.getName()); + private static final String PORTAL_NOT_AVAILABLE = HC_COMPONENT_ECOMP_PORTAL + " is not available"; + private static final String PROPERTY_NOT_SET = "Property is not found %s"; + private static final String CONFIG_IS_MISSING = HC_COMPONENT_ECOMP_PORTAL + " health check configuration is missing"; + private static final String PORTAL_ERROR = HC_COMPONENT_ECOMP_PORTAL + " responded with %s status code"; + private String decryptedPortalUser; + private String decryptedPortalPass; + private EcompPortalConfig configuration = null ; + private long healthCheckReadTimeout = 20; + private long reconnectInterval = 5; + private HealthCheckScheduledTask healthCheckScheduledTask = null ; + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + private ScheduledFuture<?> scheduledFuture = null; + private HealthCheckInfo healthCheckInfo = new HealthCheckInfo + (HC_COMPONENT_ECOMP_PORTAL, HealthCheckStatus.DOWN, null, CONFIG_IS_MISSING, null); + + @VisibleForTesting + PortalHealthCheckBuilder init(EcompPortalConfig configuration) throws CipherUtilException { + log.trace("Enter init method of Portal healthcheck"); + decryptedPortalUser = decryptPKC + (getPortalProperty(PortalPropertiesEnum.USER.value())); + decryptedPortalPass = decryptPKC + (getPortalProperty(PortalPropertiesEnum.PASSWORD.value())); + synchronized (PortalHealthCheckBuilder.class){ + if (configuration != null) { + Integer pollingInterval = configuration.getPollingInterval(); + if (pollingInterval != null && pollingInterval != 0) { + reconnectInterval = pollingInterval; + } + Integer healthCheckReadTimeoutConfig = configuration.getTimeoutMs(); + if (healthCheckReadTimeoutConfig != null) { + this.healthCheckReadTimeout = healthCheckReadTimeoutConfig; + } + this.healthCheckScheduledTask = new HealthCheckScheduledTask(configuration); + startHealthCheckTask(true); + } + else { + log.error("ECOMP Portal health check configuration is missing."); + } + } + log.trace("Exit init method of Portal healthcheck"); + return this; + } + + @PostConstruct + public PortalHealthCheckBuilder init() throws CipherUtilException { + return init(ConfigurationManager.getConfigurationManager().getConfiguration().getEcompPortal()); + } + + + @PreDestroy + protected void destroy() { + if (scheduledFuture != null) { + scheduledFuture.cancel(true); + scheduledFuture = null; + } + if (scheduler != null) { + scheduler.shutdown(); + } + } + + /** + * Start health check task. + * + * @param startTask + */ + private void startHealthCheckTask(boolean startTask) { + synchronized (PortalHealthCheckBuilder.class){ + if (startTask && this.scheduledFuture == null) { + this.scheduledFuture = this.scheduler.scheduleAtFixedRate(this.healthCheckScheduledTask , 0, reconnectInterval, TimeUnit.SECONDS); + } + } + } + + @VisibleForTesting + void runTask() { + healthCheckScheduledTask.run(); + } + + public HealthCheckInfo getHealthCheckInfo() { + return healthCheckInfo; + } + + /** + * Health Check Task Scheduler - infinite check. + */ + public class HealthCheckScheduledTask implements Runnable { + private final EcompPortalConfig config; + String healthCheckUrl = buildPortalHealthCheckUrl(); + HealthCheckStatus healthCheckStatus = DOWN; + String componentName = HC_COMPONENT_ECOMP_PORTAL; + String description; + final int timeout = 3000; + + HealthCheckScheduledTask(final EcompPortalConfig config){ + this.config = config; + } + @Override + public void run() { + if (healthCheckUrl != null) { + try { + int statusCode = getStatusCode(healthCheckUrl, timeout); + log.trace("{} Health Check response code: {}", componentName, statusCode); + if (statusCode != SC_OK) { + description = String.format(PORTAL_ERROR, statusCode); + } else { + healthCheckStatus = UP; + description = "OK"; + } + } catch (Exception e) { + log.error("{} is not available: ", componentName, e.getMessage()); + description = PORTAL_NOT_AVAILABLE; + } + } else { + description = CONFIG_IS_MISSING; + } + + healthCheckInfo.setHealthCheckStatus(healthCheckStatus); + healthCheckInfo.setDescription(description); + } + } + + private static String getPortalProperty(String key) { + String value = PortalApiProperties.getProperty(key); + if (StringUtils.isEmpty(value)) { + throw new InvalidParameterException(String.format(PROPERTY_NOT_SET, key)); + } + return value; + } + + String buildPortalHealthCheckUrl() { + final String hcUrl = "%s://%s:%s%s"; + Configuration.EcompPortalConfig configuration = ConfigurationManager.getConfigurationManager().getConfiguration().getEcompPortal(); + if (configuration != null) { + return String.format(hcUrl, configuration.getProtocol(), configuration.getHost(), + configuration.getPort(), configuration.getHealthCheckUri()); + } + log.error("ECOMP Portal health check configuration is missing."); + return null; + } + + private Properties createHeaders(){ + Properties headers = new Properties(); + String encodedBasicAuthCred = Base64.getEncoder() + .encodeToString((decryptedPortalUser + ":" + + decryptedPortalPass) + .getBytes()); + headers.put(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON); + headers.put(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); + headers.put(Constants.X_TRANSACTION_ID_HEADER, UUID.randomUUID().toString()); + headers.put("Authorization", "Basic " + encodedBasicAuthCred); + headers.put("cache-control", "no-cache"); + headers.put("uebkey", PortalApiProperties.getProperty("ueb_app_key")); + return headers; + } + + int getStatusCode(String healthCheckUrl, int timeout) throws HttpExecuteException { + HttpResponse<String> httpResponse = HttpRequest.get(healthCheckUrl, createHeaders(), new HttpClientConfig(new Timeouts(timeout, timeout))); + return httpResponse.getStatusCode(); + } + + @VisibleForTesting + public EcompPortalConfig getConfiguration() { + return ConfigurationManager.getConfigurationManager().getConfiguration().getEcompPortal(); + } + +} |