use of com.redhat.service.smartevents.infra.models.gateways.Action in project sandbox by 5733d9e2be6485d52ffa08870cabdee0.
the class ProcessorServiceImpl method updateProcessor.
@Override
@Transactional
public Processor updateProcessor(String bridgeId, String processorId, String customerId, ProcessorRequest processorRequest) {
// Attempt to load the Bridge. We cannot update a Processor if the Bridge is not available.
bridgesService.getReadyBridge(bridgeId, customerId);
// Extract existing definition
Processor existingProcessor = getProcessor(bridgeId, processorId, customerId);
if (existingProcessor.getType() == ProcessorType.ERROR_HANDLER) {
throw new BadRequestException("It is not possible to update this Processor.");
}
if (!isProcessorActionable(existingProcessor)) {
throw new ProcessorLifecycleException(String.format("Processor with id '%s' for customer '%s' is not in an actionable state.", processorId, customerId));
}
ProcessorDefinition existingDefinition = existingProcessor.getDefinition();
Action existingAction = existingDefinition.getRequestedAction();
Action existingResolvedAction = existingDefinition.getResolvedAction();
Source existingSource = existingDefinition.getRequestedSource();
// Name cannot be updated.
if (!Objects.equals(existingProcessor.getName(), processorRequest.getName())) {
throw new BadRequestException("It is not possible to update the Processor's name.");
}
if (!Objects.equals(existingProcessor.getType(), processorRequest.getType())) {
throw new BadRequestException("It is not possible to update the Processor's Type.");
}
// See https://issues.redhat.com/browse/MGDOBR-516 for updating Action support
if (!Objects.equals(existingAction, processorRequest.getAction())) {
throw new BadRequestException("It is not possible to update the Processor's Action.");
}
if (!Objects.equals(existingSource, processorRequest.getSource())) {
throw new BadRequestException("It is not possible to update the Processor's Source.");
}
// Construct updated definition
Set<BaseFilter> updatedFilters = processorRequest.getFilters();
String updatedTransformationTemplate = processorRequest.getTransformationTemplate();
ProcessorDefinition updatedDefinition = existingProcessor.getType() == ProcessorType.SOURCE ? new ProcessorDefinition(updatedFilters, updatedTransformationTemplate, existingSource, existingResolvedAction) : new ProcessorDefinition(updatedFilters, updatedTransformationTemplate, existingAction, existingResolvedAction);
// No need to update CRD if the definition is unchanged
if (existingDefinition.equals(updatedDefinition)) {
return existingProcessor;
}
// Create new definition copying existing properties
existingProcessor.setModifiedAt(ZonedDateTime.now());
existingProcessor.setStatus(ManagedResourceStatus.ACCEPTED);
existingProcessor.setDefinition(updatedDefinition);
// Processor and Work should always be created in the same transaction
// Since updates to the Action are unsupported we do not need to update the Connector record.
workManager.schedule(existingProcessor);
metricsService.onOperationStart(existingProcessor, MetricsOperation.MODIFY);
LOGGER.info("Processor with id '{}' for customer '{}' on bridge '{}' has been marked for update", existingProcessor.getId(), existingProcessor.getBridge().getCustomerId(), existingProcessor.getBridge().getId());
return existingProcessor;
}
use of com.redhat.service.smartevents.infra.models.gateways.Action in project sandbox by 5733d9e2be6485d52ffa08870cabdee0.
the class ProcessorServiceImpl method doCreateProcessor.
private Processor doCreateProcessor(Bridge bridge, String customerId, String owner, ProcessorType processorType, ProcessorRequest processorRequest) {
String bridgeId = bridge.getId();
if (processorDAO.findByBridgeIdAndName(bridgeId, processorRequest.getName()) != null) {
throw new AlreadyExistingItemException("Processor with name '" + processorRequest.getName() + "' already exists for bridge with id '" + bridgeId + "' for customer '" + customerId + "'");
}
Processor newProcessor = new Processor();
newProcessor.setType(processorType);
newProcessor.setName(processorRequest.getName());
newProcessor.setSubmittedAt(ZonedDateTime.now());
newProcessor.setStatus(ManagedResourceStatus.ACCEPTED);
newProcessor.setBridge(bridge);
newProcessor.setShardId(shardService.getAssignedShardId(newProcessor.getId()));
newProcessor.setOwner(owner);
Set<BaseFilter> requestedFilters = processorRequest.getFilters();
String requestedTransformationTemplate = processorRequest.getTransformationTemplate();
Action resolvedAction = processorType == ProcessorType.SOURCE ? resolveSource(processorRequest.getSource(), customerId, bridge.getId(), newProcessor.getId()) : resolveAction(processorRequest.getAction(), customerId, bridge.getId(), newProcessor.getId());
ProcessorDefinition definition = processorType == ProcessorType.SOURCE ? new ProcessorDefinition(requestedFilters, requestedTransformationTemplate, processorRequest.getSource(), resolvedAction) : new ProcessorDefinition(requestedFilters, requestedTransformationTemplate, processorRequest.getAction(), resolvedAction);
newProcessor.setDefinition(definition);
// Processor, Connector and Work should always be created in the same transaction
processorDAO.persist(newProcessor);
connectorService.createConnectorEntity(newProcessor);
workManager.schedule(newProcessor);
metricsService.onOperationStart(newProcessor, MetricsOperation.PROVISION);
LOGGER.info("Processor with id '{}' for customer '{}' on bridge '{}' has been marked for creation", newProcessor.getId(), newProcessor.getBridge().getCustomerId(), newProcessor.getBridge().getId());
return newProcessor;
}
use of com.redhat.service.smartevents.infra.models.gateways.Action in project sandbox by 5733d9e2be6485d52ffa08870cabdee0.
the class ProcessorGatewayConstraintValidator method isValid.
@Override
public boolean isValid(ProcessorRequest value, ConstraintValidatorContext context) {
Action action = value.getAction();
Source source = value.getSource();
if (action == null && source == null) {
addConstraintViolation(context, MISSING_GATEWAY_ERROR, Collections.emptyMap());
return false;
}
if (action != null && source != null) {
addConstraintViolation(context, MULTIPLE_GATEWAY_ERROR, Collections.emptyMap());
return false;
}
// Currently, source processors don't support transformation
if (value.getType() == ProcessorType.SOURCE && value.getTransformationTemplate() != null) {
addConstraintViolation(context, SOURCE_PROCESSOR_WITH_TRANSFORMATION_ERROR, Collections.emptyMap());
return false;
}
return action != null ? isValidGateway(action, context, gatewayConfigurator::getActionValidator) : isValidGateway(source, context, gatewayConfigurator::getSourceValidator);
}
use of com.redhat.service.smartevents.infra.models.gateways.Action in project sandbox by 5733d9e2be6485d52ffa08870cabdee0.
the class ProcessorGatewayConstraintValidatorTest method beforeEach.
@BeforeEach
public void beforeEach() {
lenient().when(actionValidatorMock.isValid(any(Action.class))).thenReturn(ValidationResult.valid());
lenient().when(sourceValidatorMock.isValid(any(Source.class))).thenReturn(ValidationResult.valid());
lenient().when(gatewayConfiguratorMock.getActionValidator(TEST_ACTION_TYPE)).thenReturn(actionValidatorMock);
lenient().when(gatewayConfiguratorMock.getActionValidator(not(eq(TEST_ACTION_TYPE)))).thenThrow(new GatewayProviderException("No action provider found"));
lenient().when(gatewayConfiguratorMock.getSourceValidator(TEST_SOURCE_TYPE)).thenReturn(sourceValidatorMock);
lenient().when(gatewayConfiguratorMock.getSourceValidator(not(eq(TEST_SOURCE_TYPE)))).thenThrow(new GatewayProviderException("No source provider found"));
lenient().when(validatorContextMock.buildConstraintViolationWithTemplate(any(String.class))).thenReturn(builderMock);
lenient().when(validatorContextMock.unwrap(HibernateConstraintValidatorContext.class)).thenReturn(validatorContextMock);
constraintValidator = new ProcessorGatewayConstraintValidator(gatewayConfiguratorMock);
}
use of com.redhat.service.smartevents.infra.models.gateways.Action in project sandbox by 5733d9e2be6485d52ffa08870cabdee0.
the class ConnectorsServiceTest method slackAction.
private static Action slackAction() {
Action action = new Action();
action.setType(SlackAction.TYPE);
action.setMapParameters(Map.of(SlackAction.CHANNEL_PARAM, TEST_ACTION_CHANNEL, SlackAction.WEBHOOK_URL_PARAM, TEST_ACTION_WEBHOOK));
return action;
}
Aggregations