package com.thinkbiganalytics.feedmgr.nifi;
/*-
* #%L
* thinkbig-feed-manager-controller
* %%
* 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.thinkbiganalytics.nifi.feedmgr.NifiEnvironmentProperties;
import com.thinkbiganalytics.nifi.rest.client.LegacyNifiRestClient;
import com.thinkbiganalytics.nifi.rest.client.NifiClientRuntimeException;
import com.thinkbiganalytics.nifi.rest.client.NifiComponentNotFoundException;
import org.apache.commons.collections.map.CaseInsensitiveMap;
import org.apache.nifi.web.api.dto.ControllerServiceDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* Helper class to get Controller Service Properties from Nifi and also merge any of these properties specified in our .properties file
*/
@Service
public class NifiControllerServiceProperties {
private static final Logger log = LoggerFactory.getLogger(NifiControllerServiceProperties.class);
@Autowired
SpringEnvironmentProperties environmentProperties;
@Autowired
LegacyNifiRestClient nifiRestClient;
/**
* Call out to Nifi and get all the Properties for a service by Service Name
*/
public Map<String, String> getPropertiesForServiceName(String serviceName) {
ControllerServiceDTO controllerService = getControllerServiceByName(serviceName);
if (controllerService != null) {
return controllerService.getProperties();
}
return null;
}
/**
* Call out to Nifi and get all the Properties for a service by Service Id
*/
public Map<String, String> getPropertiesForServiceId(String serviceId) {
ControllerServiceDTO controllerService = getControllerServiceById(serviceId);
if (controllerService != null) {
return controllerService.getProperties();
}
return null;
}
/**
* Call out to Nifi and get the Controller Service Properties and then merge it with any properties in our environment properties file.
* Env service properties need to start with the ENVIRONMENT_PROPERTY_SERVICE_PREFIX ("nifi.service.")
*/
public Map<String, String> getPropertiesForServiceIdMergedWithEnvironmentProperties(String serviceId) {
ControllerServiceDTO controllerService = getControllerServiceById(serviceId);
if (controllerService != null) {
String serviceName = controllerService.getName();
Map<String, String> properties = controllerService.getProperties();
properties = mergeNifiAndEnvProperties(properties, serviceName);
return properties;
}
return null;
}
public Map<String, String> getPropertiesForServiceNameMergedWithEnvironmentProperties(String serviceName) {
Map<String, String> properties = getPropertiesForServiceName(serviceName);
properties = mergeNifiAndEnvProperties(properties, serviceName);
return properties;
}
public Map<String, String> mergeNifiAndEnvProperties(Map<String, String> nifiProperties, String serviceName) {
if (nifiProperties != null) {
CaseInsensitiveMap propertyMap = new CaseInsensitiveMap(nifiProperties);
String servicePrefix = NifiEnvironmentProperties.getEnvironmentControllerServicePropertyPrefix(serviceName);
Map<String, Object> map = environmentProperties.getPropertiesStartingWith(servicePrefix);
if (map != null && !map.isEmpty()) {
for (Map.Entry<String, Object> entry : map.entrySet()) {
String key = NifiEnvironmentProperties.environmentPropertyToControllerServiceProperty(entry.getKey());
if (propertyMap.containsKey(key) && entry.getValue() != null) {
propertyMap.put(key, entry.getValue());
}
}
}
return propertyMap;
}
return null;
}
/**
* for a given nifi controller service return the application.properties value for the passed in key suffix
* example
* mysql, password
* will return the value from the property nifi.service.mysql.password
*/
public String getEnvironmentPropertyValueForControllerService(String serviceName, String envPropertyKeySuffix) {
String servicePrefix = NifiEnvironmentProperties.getEnvironmentControllerServicePropertyPrefix(serviceName);
return environmentProperties.getPropertyValueAsString(servicePrefix + "." + envPropertyKeySuffix);
}
/**
* returns all properties configured with the prefix
*/
public Map<String, Object> getAllServiceProperties() {
return environmentProperties.getPropertiesStartingWith(NifiEnvironmentProperties.getPrefix());
}
/**
* Find a Controller service with a given display name
*
* @param serviceName a controller service name
* @return a Controller service with a given display name or null if not found
*/
public ControllerServiceDTO getControllerServiceByName(String serviceName) {
ControllerServiceDTO controllerService = null;
try {
controllerService = nifiRestClient.getControllerServiceByName(null, serviceName);
} catch (NifiClientRuntimeException e) {
log.error("Unable to find Nifi Controller Service with name: " + serviceName + ". " + e.getMessage(), e);
}
return controllerService;
}
/**
* Find a controller service with a given NiFi id or null if not found
*
* @param serviceId a controller service id
* @return a controller service with a given NiFi id or null if not found
*/
public ControllerServiceDTO getControllerServiceById(String serviceId) {
ControllerServiceDTO controllerService = null;
try {
ControllerServiceDTO entity = nifiRestClient.getControllerService(null, serviceId);
if (entity != null) {
controllerService = entity;
}
} catch (NifiComponentNotFoundException e) {
log.error("Unable to find Nifi Controller Service with ID: " + serviceId + ". " + e.getMessage(), e);
}
return controllerService;
}
/**
* return the property prepended with the prefix used in the .properties file to denote nifi controller service settings.
* the default prefix is 'nifi.'
*
* @param serviceName a service name
* @return the property prepended with the prefix used in the .properties file to denote nifi controller service settings.
*/
public String getEnvironmentControllerServicePropertyPrefix(String serviceName) {
return NifiEnvironmentProperties.getEnvironmentControllerServicePropertyPrefix(serviceName);
}
}