use of com.thinkbiganalytics.kylo.catalog.rest.model.ConnectorPluginNiFiControllerServicePropertyDescriptor in project kylo by Teradata.
the class DataSourceProvider method createOrUpdateNiFiControllerService.
/**
* Creates or updates the NiFi controller service linked to the specified data source.
*/
private void createOrUpdateNiFiControllerService(@Nonnull final DataSource dataSource, @Nonnull final ConnectorPluginDescriptor connectorPluginDescriptor, boolean checkExisting) throws PotentialControllerServiceConflictException {
ConnectorPluginNiFiControllerService plugin = connectorPluginDescriptor.getNifiControllerService();
// Resolve properties
final PropertyPlaceholderHelper.PlaceholderResolver resolver = new DataSourcePlaceholderResolver(dataSource);
final Map<String, String> properties = new HashMap<>(plugin.getProperties().size());
final Map<String, ConnectorPluginNiFiControllerServicePropertyDescriptor> propertyDescriptors = plugin.getPropertyDescriptors();
plugin.getProperties().forEach((key, value) -> {
final String resolvedValue = placeholderHelper.replacePlaceholders(value, resolver);
// set empty string to null
ConnectorPluginNiFiControllerServicePropertyDescriptor descriptor = propertyDescriptors != null ? propertyDescriptors.get(key) : null;
if (StringUtils.isBlank(resolvedValue) && (descriptor == null || (descriptor != null && !descriptor.isEmptyStringIfNull()))) {
// set the value to null if its not explicitly configured to be set to an empty string
properties.put(key, null);
} else if (resolvedValue != null && !resolvedValue.startsWith("{cipher}")) {
properties.put(key, resolvedValue);
}
});
// Update or create the controller service
ControllerServiceDTO controllerService = null;
if (dataSource.getNifiControllerServiceId() != null && dataSource.getId() != null) {
controllerService = new ControllerServiceDTO();
controllerService.setId(dataSource.getNifiControllerServiceId());
controllerService.setName(dataSource.getTitle());
controllerService.setProperties(properties);
try {
controllerService = nifiRestClient.controllerServices().updateServiceAndReferencingComponents(controllerService);
dataSource.setNifiControllerServiceId(controllerService.getId());
} catch (final NifiComponentNotFoundException e) {
log.warn("Controller service is missing for data source: {}", dataSource.getId(), e);
controllerService = null;
}
}
if (controllerService == null && StringUtils.isBlank(dataSource.getNifiControllerServiceId())) {
if (checkExisting) {
List<ControllerServiceDTO> matchingServices = findMatchingControllerService(dataSource, properties, connectorPluginDescriptor);
if (matchingServices != null && !matchingServices.isEmpty()) {
Map<String, String> identityProperties = plugin.getIdentityProperties().stream().collect(Collectors.toMap(propertyKey -> propertyKey, propertyKey -> properties.get(propertyKey)));
throw new PotentialControllerServiceConflictException(new ControllerServiceConflictEntity(dataSource.getTitle(), identityProperties, matchingServices));
}
}
controllerService = new ControllerServiceDTO();
controllerService.setType(plugin.getType());
controllerService.setName(dataSource.getTitle());
controllerService.setProperties(properties);
controllerService = nifiRestClient.controllerServices().create(controllerService);
try {
nifiRestClient.controllerServices().updateStateById(controllerService.getId(), NiFiControllerServicesRestClient.State.ENABLED);
} catch (final NifiClientRuntimeException e) {
log.error("Failed to enable controller service for data source: {}", dataSource.getId(), e);
nifiRestClient.controllerServices().disableAndDeleteAsync(controllerService.getId());
throw e;
}
dataSource.setNifiControllerServiceId(controllerService.getId());
}
}
Aggregations