package com.thinkbiganalytics.servicemonitor.rest.client.cdh;
/*-
* #%L
* thinkbig-service-monitor-cloudera
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* 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.
* #L%
*/
import com.cloudera.api.ApiRootResource;
import com.cloudera.api.ClouderaManagerClientBuilder;
import com.thinkbiganalytics.servicemonitor.rest.client.RestClientConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
/**
* Cloudera REST API client.
*/
@Component
public class ClouderaClient {
private static final Logger LOG = LoggerFactory.getLogger(ClouderaClient.class);
@Inject
@Qualifier("clouderaRestClientConfig")
private RestClientConfig clientConfig;
private ClouderaManagerClientBuilder clouderaManagerClientBuilder;
private ClouderaRootResource clouderaRootResource;
private AtomicBoolean creatingResource = new AtomicBoolean(false);
private Integer clientAttempts = 0;
public ClouderaClient() {
}
public ClouderaClient(RestClientConfig clientConfig) {
this.clientConfig = clientConfig;
}
@PostConstruct
public void setClouderaManagerClientBuilder() {
String host = clientConfig.getServerUrl();
String portString = clientConfig.getPort();
if (StringUtils.isBlank(portString)) {
portString = "7180";
}
Integer port = new Integer(portString);
String username = clientConfig.getUsername();
String password = clientConfig.getPassword();
LOG.info("Created New Cloudera Client for Host [" + host + "], user: [" + username + "]");
this.clouderaManagerClientBuilder =
new ClouderaManagerClientBuilder().withHost(host).withPort(port).withUsernamePassword(username, password);
}
public ClouderaRootResource getClouderaResource() {
if (clouderaRootResource == null) {
this.clientAttempts++;
}
if (clouderaRootResource == null && !creatingResource.get()) {
creatingResource.set(true);
try {
ApiRootResource rootResource = this.clouderaManagerClientBuilder.build();
clouderaRootResource = ClouderaRootResourceManager.getRootResource(rootResource);
LOG.info("Successfully Created Cloudera Client");
} catch (Throwable e) {
LOG.error("Failed to create Cloudera Client", e);
creatingResource.set(false);
}
}
if (clientAttempts >= 3) {
//rest
clientAttempts = 0;
creatingResource.set(false);
}
return clouderaRootResource;
}
}