use of org.apache.nifi.registry.flow.VersionedFlow in project nifi-registry by apache.
the class DataModelMapper method map.
public static VersionedFlow map(final BucketEntity bucketEntity, final FlowEntity flowEntity) {
final VersionedFlow versionedFlow = new VersionedFlow();
versionedFlow.setIdentifier(flowEntity.getId());
versionedFlow.setBucketIdentifier(flowEntity.getBucketId());
versionedFlow.setName(flowEntity.getName());
versionedFlow.setDescription(flowEntity.getDescription());
versionedFlow.setCreatedTimestamp(flowEntity.getCreated().getTime());
versionedFlow.setModifiedTimestamp(flowEntity.getModified().getTime());
versionedFlow.setVersionCount(flowEntity.getSnapshotCount());
if (bucketEntity != null) {
versionedFlow.setBucketName(bucketEntity.getName());
} else {
versionedFlow.setBucketName(flowEntity.getBucketName());
}
return versionedFlow;
}
use of org.apache.nifi.registry.flow.VersionedFlow in project nifi-registry by apache.
the class RegistryService method createFlowSnapshot.
// ---------------------- VersionedFlowSnapshot methods ---------------------------------------------
public VersionedFlowSnapshot createFlowSnapshot(final VersionedFlowSnapshot flowSnapshot) {
if (flowSnapshot == null) {
throw new IllegalArgumentException("Versioned flow snapshot cannot be null");
}
// validation will ensure that the metadata and contents are not null
if (flowSnapshot.getSnapshotMetadata() != null) {
flowSnapshot.getSnapshotMetadata().setTimestamp(System.currentTimeMillis());
}
// these fields aren't used for creation
flowSnapshot.setFlow(null);
flowSnapshot.setBucket(null);
validate(flowSnapshot, "Cannot create versioned flow snapshot");
writeLock.lock();
try {
final VersionedFlowSnapshotMetadata snapshotMetadata = flowSnapshot.getSnapshotMetadata();
// ensure the bucket exists
final BucketEntity existingBucket = metadataService.getBucketById(snapshotMetadata.getBucketIdentifier());
if (existingBucket == null) {
LOGGER.warn("The specified bucket id [{}] does not exist.", snapshotMetadata.getBucketIdentifier());
throw new ResourceNotFoundException("The specified bucket ID does not exist in this registry.");
}
// ensure the flow exists
final FlowEntity existingFlow = metadataService.getFlowById(snapshotMetadata.getFlowIdentifier());
if (existingFlow == null) {
LOGGER.warn("The specified flow id [{}] does not exist.", snapshotMetadata.getFlowIdentifier());
throw new ResourceNotFoundException("The specified flow ID does not exist in this bucket.");
}
if (!existingBucket.getId().equals(existingFlow.getBucketId())) {
throw new IllegalStateException("The requested flow is not located in the given bucket");
}
// convert the set of FlowSnapshotEntity to set of VersionedFlowSnapshotMetadata
final SortedSet<VersionedFlowSnapshotMetadata> sortedSnapshots = new TreeSet<>();
final List<FlowSnapshotEntity> existingFlowSnapshots = metadataService.getSnapshots(existingFlow.getId());
if (existingFlowSnapshots != null) {
existingFlowSnapshots.stream().forEach(s -> sortedSnapshots.add(DataModelMapper.map(existingBucket, s)));
}
// if we already have snapshots we need to verify the new one has the correct version
if (sortedSnapshots != null && sortedSnapshots.size() > 0) {
final VersionedFlowSnapshotMetadata lastSnapshot = sortedSnapshots.last();
if (snapshotMetadata.getVersion() <= lastSnapshot.getVersion()) {
throw new IllegalStateException("A Versioned flow snapshot with the same version already exists: " + snapshotMetadata.getVersion());
}
if (snapshotMetadata.getVersion() > (lastSnapshot.getVersion() + 1)) {
throw new IllegalStateException("Version must be a one-up number, last version was " + lastSnapshot.getVersion() + " and version for this snapshot was " + snapshotMetadata.getVersion());
}
} else if (snapshotMetadata.getVersion() != 1) {
throw new IllegalStateException("Version of first snapshot must be 1");
}
// serialize the snapshot
final ByteArrayOutputStream out = new ByteArrayOutputStream();
processGroupSerializer.serialize(flowSnapshot.getFlowContents(), out);
// save the serialized snapshot to the persistence provider
final Bucket bucket = DataModelMapper.map(existingBucket);
final VersionedFlow versionedFlow = DataModelMapper.map(existingBucket, existingFlow);
final FlowSnapshotContext context = new StandardFlowSnapshotContext.Builder(bucket, versionedFlow, snapshotMetadata).build();
flowPersistenceProvider.saveFlowContent(context, out.toByteArray());
// create snapshot in the metadata provider
metadataService.createFlowSnapshot(DataModelMapper.map(snapshotMetadata));
// update the modified date on the flow
metadataService.updateFlow(existingFlow);
// get the updated flow, we need to use "with counts" here so we can return this is a part of the response
final FlowEntity updatedFlow = metadataService.getFlowByIdWithSnapshotCounts(snapshotMetadata.getFlowIdentifier());
if (updatedFlow == null) {
throw new ResourceNotFoundException("Versioned flow does not exist for identifier " + snapshotMetadata.getFlowIdentifier());
}
final VersionedFlow updatedVersionedFlow = DataModelMapper.map(existingBucket, updatedFlow);
flowSnapshot.setBucket(bucket);
flowSnapshot.setFlow(updatedVersionedFlow);
return flowSnapshot;
} finally {
writeLock.unlock();
}
}
use of org.apache.nifi.registry.flow.VersionedFlow in project nifi-registry by apache.
the class RegistryService method getFlows.
public List<VersionedFlow> getFlows(final String bucketId) {
if (StringUtils.isBlank(bucketId)) {
throw new IllegalArgumentException("Bucket identifier cannot be null");
}
readLock.lock();
try {
final BucketEntity existingBucket = metadataService.getBucketById(bucketId);
if (existingBucket == null) {
LOGGER.warn("The specified bucket id [{}] does not exist.", bucketId);
throw new ResourceNotFoundException("The specified bucket ID does not exist in this registry.");
}
// return non-verbose set of flows for the given bucket
final List<FlowEntity> flows = metadataService.getFlowsByBucket(existingBucket.getId());
return flows.stream().map(f -> DataModelMapper.map(existingBucket, f)).collect(Collectors.toList());
} finally {
readLock.unlock();
}
}
use of org.apache.nifi.registry.flow.VersionedFlow in project nifi-registry by apache.
the class RegistryService method getFlowSnapshot.
public VersionedFlowSnapshot getFlowSnapshot(final String bucketIdentifier, final String flowIdentifier, final Integer version) {
if (StringUtils.isBlank(bucketIdentifier)) {
throw new IllegalArgumentException("Bucket identifier cannot be null or blank");
}
if (StringUtils.isBlank(flowIdentifier)) {
throw new IllegalArgumentException("Flow identifier cannot be null or blank");
}
if (version == null) {
throw new IllegalArgumentException("Version cannot be null or blank");
}
readLock.lock();
try {
final BucketEntity existingBucket = metadataService.getBucketById(bucketIdentifier);
if (existingBucket == null) {
LOGGER.warn("The specified bucket id [{}] does not exist.", bucketIdentifier);
throw new ResourceNotFoundException("The specified bucket ID does not exist in this registry.");
}
// we need to populate the version count here so we have to do this retrieval instead of snapshotEntity.getFlow()
final FlowEntity flowEntityWithCount = metadataService.getFlowByIdWithSnapshotCounts(flowIdentifier);
if (flowEntityWithCount == null) {
LOGGER.warn("The specified flow id [{}] does not exist.", flowIdentifier);
throw new ResourceNotFoundException("The specified flow ID does not exist in this bucket.");
}
if (!existingBucket.getId().equals(flowEntityWithCount.getBucketId())) {
throw new IllegalStateException("The requested flow is not located in the given bucket");
}
// ensure the snapshot exists
final FlowSnapshotEntity snapshotEntity = metadataService.getFlowSnapshot(flowIdentifier, version);
if (snapshotEntity == null) {
LOGGER.warn("The specified flow snapshot id [{}] does not exist for version [{}].", flowIdentifier, version);
throw new ResourceNotFoundException("The specified versioned flow snapshot does not exist for this flow.");
}
// get the serialized bytes of the snapshot
final byte[] serializedSnapshot = flowPersistenceProvider.getFlowContent(bucketIdentifier, flowIdentifier, version);
if (serializedSnapshot == null || serializedSnapshot.length == 0) {
throw new IllegalStateException("No serialized content found for snapshot with flow identifier " + flowIdentifier + " and version " + version);
}
// deserialize the contents
final InputStream input = new ByteArrayInputStream(serializedSnapshot);
final VersionedProcessGroup flowContents = processGroupSerializer.deserialize(input);
// map entities to data model
final Bucket bucket = DataModelMapper.map(existingBucket);
final VersionedFlow versionedFlow = DataModelMapper.map(existingBucket, flowEntityWithCount);
final VersionedFlowSnapshotMetadata snapshotMetadata = DataModelMapper.map(existingBucket, snapshotEntity);
// create the snapshot to return
final VersionedFlowSnapshot snapshot = new VersionedFlowSnapshot();
snapshot.setFlowContents(flowContents);
snapshot.setSnapshotMetadata(snapshotMetadata);
snapshot.setFlow(versionedFlow);
snapshot.setBucket(bucket);
return snapshot;
} finally {
readLock.unlock();
}
}
use of org.apache.nifi.registry.flow.VersionedFlow in project nifi-registry by apache.
the class TestRegistryService method testGetFlowsByBucketExists.
@Test
public void testGetFlowsByBucketExists() {
final BucketEntity existingBucket = new BucketEntity();
existingBucket.setId("b1");
existingBucket.setName("My Bucket");
existingBucket.setDescription("This is my bucket");
existingBucket.setCreated(new Date());
when(metadataService.getBucketById(existingBucket.getId())).thenReturn(existingBucket);
final FlowEntity flowEntity1 = new FlowEntity();
flowEntity1.setId("flow1");
flowEntity1.setName("My Flow");
flowEntity1.setDescription("This is my flow.");
flowEntity1.setCreated(new Date());
flowEntity1.setModified(new Date());
flowEntity1.setBucketId(existingBucket.getId());
final FlowEntity flowEntity2 = new FlowEntity();
flowEntity2.setId("flow2");
flowEntity2.setName("My Flow 2");
flowEntity2.setDescription("This is my flow 2.");
flowEntity2.setCreated(new Date());
flowEntity2.setModified(new Date());
flowEntity2.setBucketId(existingBucket.getId());
final List<FlowEntity> flows = new ArrayList<>();
flows.add(flowEntity1);
flows.add(flowEntity2);
when(metadataService.getFlowsByBucket(eq(existingBucket.getId()))).thenReturn(flows);
final List<VersionedFlow> allFlows = registryService.getFlows(existingBucket.getId());
assertNotNull(allFlows);
assertEquals(2, allFlows.size());
}
Aggregations