void createService(ExternalEvent event, Map<String, Object> serviceData) { Service svc = serviceDao.getServiceByExternalId(event.getAccountId(), event.getExternalId()); if (svc != null) { return; } Stack stack = getStack(event); if (stack == null) { log.info("Can't process service event. Could not get or create stack. Event: [{}]", event); return; } Map<String, Object> service = new HashMap<String, Object>(); if (serviceData != null) { service.putAll(serviceData); } service.put(ObjectMetaDataManager.ACCOUNT_FIELD, event.getAccountId()); service.put(FIELD_STACK_ID, stack.getId()); try { String create = objectProcessManager.getStandardProcessName(StandardProcess.CREATE, Service.class); String activate = objectProcessManager.getStandardProcessName(StandardProcess.ACTIVATE, Service.class); ProcessUtils.chainInData(service, create, activate); resourceDao.createAndSchedule(Service.class, service); } catch (ProcessCancelException e) { log.info( "Create and activate process cancelled for service with account id {}and external id {}", event.getAccountId(), event.getExternalId()); } }
@Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Stack env = (Stack) state.getResource(); List<? extends Service> services = objectManager.find(Service.class, SERVICE.STACK_ID, env.getId(), SERVICE.REMOVED, null); if (!services.isEmpty()) { removeServices(services); } return null; }
Stack getStack(final ExternalEvent event) { final Map<String, Object> env = CollectionUtils.castMap(DataUtils.getFields(event).get(FIELD_ENVIRIONMENT)); Object eId = CollectionUtils.getNestedValue(env, FIELD_EXTERNAL_ID); if (eId == null) { return null; } final String envExtId = eId.toString(); Stack stack = stackDao.getStackByExternalId(event.getAccountId(), envExtId); // If stack has not been created yet if (stack == null) { final Stack newEnv = objectManager.newRecord(Stack.class); Object possibleName = CollectionUtils.getNestedValue(env, "name"); newEnv.setExternalId(envExtId); newEnv.setAccountId(event.getAccountId()); String name = possibleName != null ? possibleName.toString() : envExtId; newEnv.setName(name); stack = DeferredUtils.nest( new Callable<Stack>() { @Override public Stack call() { return resourceDao.createAndSchedule(newEnv); } }); stack = resourceMonitor.waitFor( stack, new ResourcePredicate<Stack>() { @Override public boolean evaluate(Stack obj) { return obj != null && CommonStatesConstants.ACTIVE.equals(obj.getState()); } @Override public String getMessage() { return "active state"; } }); } return stack; }