use of com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException in project kylo by Teradata.
the class JcrExtensibleTypeProvider method getTypesList.
private List<ExtensibleType> getTypesList(final String typeName) {
final Session session = getSession();
try {
final List<ExtensibleType> list = new ArrayList<>();
final NodeTypeManager typeMgr = session.getWorkspace().getNodeTypeManager();
final NodeTypeIterator typeItr = typeMgr.getPrimaryNodeTypes();
final NodeType extensibleType = typeMgr.getNodeType(typeName);
while (typeItr.hasNext()) {
final NodeType nodeType = (NodeType) typeItr.next();
if (nodeType.isNodeType(extensibleType.getName()) && !nodeType.equals(extensibleType)) {
String nodeTypePath = ExtensionsConstants.TYPES + "/" + nodeType.getName();
if (session.getRootNode().hasNode(nodeTypePath)) {
final Node typeNode = session.getRootNode().getNode(nodeTypePath);
list.add(new JcrExtensibleType(typeNode, nodeType));
}
}
}
return list;
} catch (RepositoryException e) {
throw new MetadataRepositoryException("Failed to lookup all extensible types", e);
}
}
use of com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException in project kylo by Teradata.
the class EnsureTemplateFeedRelationshipsUpgradeAction method ensureFeedTemplateFeedRelationships.
private void ensureFeedTemplateFeedRelationships() {
// ensure the templates have the feed relationships
List<Feed> feeds = feedProvider.findAll();
if (feeds != null) {
feeds.stream().forEach(feed -> {
FeedManagerTemplate template = feed.getTemplate();
if (template != null) {
// ensure the template has feeds.
List<Feed> templateFeeds = null;
try {
templateFeeds = template.getFeeds();
} catch (MetadataRepositoryException e) {
// templateFeeds are weak references.
// if the template feeds return itemNotExists we need to reset it
Throwable rootCause = ExceptionUtils.getRootCause(e);
if (rootCause != null && rootCause instanceof ItemNotFoundException) {
// reset the reference collection. It will be rebuilt in the subsequent call
JcrPropertyUtil.removeAllFromCollectionProperty(((JcrFeedTemplate) template).getNode(), JcrFeedTemplate.FEEDS);
}
}
if (templateFeeds == null || !templateFeeds.contains(feed)) {
log.info("Updating relationship temlate: {} -> feed: {}", template.getName(), feed.getName());
template.addFeed(feed);
feedManagerTemplateProvider.update(template);
}
}
});
}
feedProvider.populateInverseFeedDependencies();
}
use of com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException in project kylo by Teradata.
the class DefaultFeedManagerFeedService method createAndSaveFeed.
/**
* Create/Update a Feed in NiFi. Save the metadata to Kylo meta store.
*
* @param feedMetadata the feed metadata
* @return an object indicating if the feed creation was successful or not
* @deprecated
*/
@Deprecated
private NifiFeed createAndSaveFeed(final FeedMetadata feedMetadata) {
Stopwatch stopwatch = Stopwatch.createStarted();
NifiFeed feed = null;
feedMetadata.setIsNew(StringUtils.isBlank(feedMetadata.getId()));
metadataAccess.read(() -> {
if (feedMetadata.isNew()) {
// ensure the user has rights to create feeds under the category by checking if it is visible (has read access)
Category domainCategory = categoryProvider.findById(categoryProvider.resolveId(feedMetadata.getCategory().getId()));
if (domainCategory == null) {
// throw exception
throw new MetadataRepositoryException("Unable to find the category " + feedMetadata.getCategory().getSystemName());
}
accessController.checkPermission(domainCategory, CategoryAccessControl.CREATE_FEED);
// ensure the user has rights to create feeds using the template by checking if it is visible.
FeedManagerTemplate domainTemplate = templateProvider.findById(templateProvider.resolveId(feedMetadata.getTemplateId()));
if (domainTemplate == null) {
throw new MetadataRepositoryException("Unable to find the template " + feedMetadata.getTemplateId());
}
// accessController.checkPermission(domainTemplate, TemplateAccessControl.CREATE_FEED);
} else {
// perform explict entity access check here as we dont want to modify the NiFi flow unless user has access to edit the feed
Feed.ID domainId = feedProvider.resolveId(feedMetadata.getId());
Feed domainFeed = feedProvider.findById(domainId);
if (domainFeed != null) {
accessController.checkPermission(domainFeed, FeedAccessControl.EDIT_DETAILS);
} else {
throw new NotFoundException("Feed not found for id " + feedMetadata.getId());
}
}
});
FeedMetadata feedToSave = feedMetadata;
if (!feedToSave.isNew()) {
// create a new version if this is not a new feed
feedToSave = saveDraftFeed(feedToSave);
}
// replace expressions with values
if (feedToSave.getTable() != null) {
feedToSave.getTable().updateMetadataFieldValues();
}
if (feedToSave.getProperties() == null) {
feedToSave.setProperties(new ArrayList<NifiProperty>());
}
FeedMetadata.STATE state = FeedMetadata.STATE.NEW;
try {
state = FeedMetadata.STATE.valueOf(feedToSave.getState());
} catch (Exception e) {
// if the string isnt valid, disregard as it will end up disabling the feed.
}
boolean enabled = (FeedMetadata.STATE.NEW.equals(state) && feedToSave.isActive()) || FeedMetadata.STATE.ENABLED.equals(state);
// store ref to the originalFeedProperties before resolving and merging with the template
List<NifiProperty> originalFeedProperties = feedToSave.getProperties();
// get all the properties for the metadata
RegisteredTemplate registeredTemplate = registeredTemplateService.findRegisteredTemplate(new RegisteredTemplateRequest.Builder().templateId(feedToSave.getTemplateId()).templateName(feedToSave.getTemplateName()).isFeedEdit(true).includeSensitiveProperties(true).build());
// copy the registered template properties it a new list so it doest get updated
List<NifiProperty> templateProperties = registeredTemplate.getProperties().stream().map(nifiProperty -> new NifiProperty(nifiProperty)).collect(Collectors.toList());
// update the template properties with the feedToSave properties
NifiPropertyUtil.matchAndSetPropertyByProcessorName(templateProperties, feedToSave.getProperties(), NifiPropertyUtil.PropertyUpdateMode.UPDATE_ALL_PROPERTIES);
registeredTemplate.setProperties(templateProperties);
feedToSave.setProperties(registeredTemplate.getProperties());
feedToSave.setRegisteredTemplate(registeredTemplate);
// skip any properties that the user supplied which are not ${ values
List<NifiProperty> propertiesToSkip = originalFeedProperties.stream().filter(property -> !propertyExpressionResolver.containsVariablesPatterns(property.getValue())).collect(Collectors.toList());
List<NifiProperty> templatePropertiesToSkip = registeredTemplate.getProperties().stream().filter(property -> property.isSelected() && !propertyExpressionResolver.containsVariablesPatterns(property.getValue())).collect(Collectors.toList());
if (templatePropertiesToSkip != null && !templatePropertiesToSkip.isEmpty()) {
propertiesToSkip.addAll(templatePropertiesToSkip);
}
// resolve any ${metadata.} properties
List<NifiProperty> resolvedProperties = propertyExpressionResolver.resolvePropertyExpressions(feedToSave, propertiesToSkip);
// decrypt the metadata
feedModelTransform.decryptSensitivePropertyValues(feedToSave);
// flag to indicate to enable the feed later
// if this is the first time for this feed and it is set to be enabled, mark it to be enabled after we commit to the JCR store
boolean enableLater = false;
if (enabled && feedToSave.isNew()) {
enableLater = true;
enabled = false;
feedToSave.setState(FeedMetadata.STATE.DISABLED.name());
}
CreateFeedBuilder feedBuilder = CreateFeedBuilder.newFeed(nifiRestClient, nifiFlowCache, feedToSave, registeredTemplate.getNifiTemplateId(), propertyExpressionResolver, propertyDescriptorTransform, niFiObjectCache, templateConnectionUtil).enabled(enabled).setOriginalFeedProperties(originalFeedProperties).removeInactiveVersionedProcessGroup(removeInactiveNifiVersionedFeedFlows).autoAlign(nifiAutoFeedsAlignAfterSave).withNiFiTemplateCache(niFiTemplateCache);
if (registeredTemplate.isReusableTemplate()) {
feedBuilder.setReusableTemplate(true);
feedToSave.setIsReusableFeed(true);
} else {
feedBuilder.inputProcessorType(feedToSave.getInputProcessorType()).feedSchedule(feedToSave.getSchedule()).properties(feedToSave.getProperties());
if (registeredTemplate.usesReusableTemplate()) {
for (ReusableTemplateConnectionInfo connection : registeredTemplate.getReusableTemplateConnections()) {
feedBuilder.addInputOutputPort(new InputOutputPort(connection.getReusableTemplateInputPortName(), connection.getFeedOutputPortName()));
}
}
}
stopwatch.stop();
log.debug("Time to prepare data for saving feed in NiFi: {} ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
stopwatch.reset();
stopwatch.start();
NifiProcessGroup entity = feedBuilder.build();
stopwatch.stop();
log.debug("Time to save feed in NiFi: {} ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
stopwatch.reset();
feed = new NifiFeed(feedToSave, entity);
// set the original feedProperties back to the feed
feedToSave.setProperties(originalFeedProperties);
// encrypt the metadata properties
feedModelTransform.encryptSensitivePropertyValues(feedToSave);
if (entity.isSuccess()) {
feedToSave.setNifiProcessGroupId(entity.getProcessGroupEntity().getId());
try {
stopwatch.start();
saveFeed(feedToSave);
// tell NiFi if this is a streaming feed or not
if (feedToSave.getRegisteredTemplate().isStream()) {
streamingFeedJmsNotificationService.updateNiFiStatusJMSTopic(entity, feedToSave);
}
feed.setEnableAfterSave(enableLater);
feed.setSuccess(true);
stopwatch.stop();
log.debug("Time to saveFeed in Kylo: {} ms", stopwatch.elapsed(TimeUnit.MILLISECONDS));
stopwatch.reset();
stopwatch.start();
feedBuilder.checkAndRemoveVersionedProcessGroup();
} catch (Exception e) {
feed.setSuccess(false);
feed.addErrorMessage(e);
}
} else {
feed.setSuccess(false);
}
if (!feed.isSuccess()) {
if (!entity.isRolledBack()) {
try {
feedBuilder.rollback();
} catch (FeedRollbackException rollbackException) {
log.error("Error rolling back feed {}. {} ", feedToSave.getCategoryAndFeedName(), rollbackException.getMessage());
feed.addErrorMessage("Error occurred in rolling back the Feed.");
}
entity.setRolledBack(true);
}
}
return feed;
}
use of com.thinkbiganalytics.metadata.modeshape.MetadataRepositoryException in project kylo by Teradata.
the class DefaultFeedManagerFeedService method deployFeedVersion.
@Override
public DeployResponseEntityVersion deployFeedVersion(String feedIdStr, String versionIdStr, boolean includeContent) throws DeployFeedException {
Optional<Map.Entry<Feed.ID, ActionGroup>> feedAccess = checkChangeVersions(feedIdStr);
return feedAccess.map(entry -> {
Feed.ID domainFeedId = entry.getKey();
return metadataAccess.commit(() -> {
com.thinkbiganalytics.metadata.api.versioning.EntityVersion.ID versionId = this.feedProvider.resolveVersion(versionIdStr);
return this.feedProvider.findVersion(domainFeedId, versionId, true).map(ver -> {
Feed feed = ver.getEntity().get();
// validate the required user properties
// Set user-defined properties
Set<UserFieldDescriptor> fields = feedModelTransform.getUserFields(feed.getCategory());
if (fields != null && !fields.isEmpty()) {
if (feed.isMissingRequiredProperties(fields)) {
throw new MetadataRepositoryException("Unable to deploy the feed. It is missing required properties ");
}
}
FeedMetadata feedMetadata = feedModelTransform.domainToFeedMetadata(feed, entry.getValue());
NifiFeed deployedFeed = deployFeed(feedMetadata, ver);
EntityVersion entityVersion = feedModelTransform.domainToFeedVersion(feedProvider.findVersion(domainFeedId, versionId, includeContent).get(), entry.getValue());
return new DeployResponseEntityVersion(entityVersion, deployedFeed);
}).orElseThrow(() -> new FeedNotFoundException(domainFeedId));
}, MetadataAccess.SERVICE);
}).orElseThrow(() -> new FeedNotFoundException(this.feedProvider.resolveFeed(feedIdStr)));
}
Aggregations