@Override protected Long getId(Object obj) { if (obj instanceof Stack) { return ((Stack) obj).getId(); } return null; }
public StackVolumeLock(Stack stack, String volumeName) { super("STACK.VOLUME." + stack.getId() + "." + volumeName); }
protected void createConfigItemStatus(List<Stack> stacks) { for (Stack stack : stacks) { ConfigItemStatus existing = objectManager.findAny(ConfigItemStatus.class, CONFIG_ITEM_STATUS.NAME, CONFIG_NAME, CONFIG_ITEM_STATUS.RESOURCE_ID, stack.getId(), CONFIG_ITEM_STATUS.STACK_ID, stack.getId(), CONFIG_ITEM_STATUS.RESOURCE_TYPE, "environment_id"); if (existing == null) { try { Map<String, Object> props = new HashMap<>(); props.put("name", CONFIG_NAME); props.put("requestedVersion", 1); props.put("appliedVersion", 0); props.put("sourceVersion", ""); props.put("resourceId", stack.getId()); props.put("environmentId", stack.getId()); props.put("resourceType", "environment_id"); objectManager.create(ConfigItemStatus.class, props); } catch (Exception ex) { } } } }
protected String calculateStackHealthState(final Stack stack) { List<Service> services = objectManager.find(Service.class, SERVICE.STACK_ID, stack.getId(), SERVICE.REMOVED, null); List<HealthChecker> hcs = new ArrayList<>(); for (Service svc : services) { hcs.add(new ServiceHealthCheck(svc)); } return calculateHealthState(hcs); }
@Override public Object perform(String name, Object obj, ApiRequest request) { if (!(obj instanceof Stack)) { return null; } Stack env = (Stack) obj; List<? extends Service> services = sdService.listStackServices(env.getId()); activateServices(services); return env; }
@Override public Object perform(String name, Object obj, ApiRequest request) { if (!(obj instanceof Stack)) { return null; } Stack env = (Stack) obj; List<? extends Service> services = objectManager.find(Service.class, SERVICE.STACK_ID, env.getId(), SERVICE.REMOVED, null); deactivateServices(services); return env; }
@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; }
@Override public String buildDockerComposeConfig(List<? extends Service> services, Stack stack) { List<? extends VolumeTemplate> volumes = objectManager.find(VolumeTemplate.class, VOLUME_TEMPLATE.STACK_ID, stack.getId(), VOLUME_TEMPLATE.REMOVED, null); Map<String, Object> dockerComposeData = createComposeData(services, true, volumes); if (dockerComposeData.isEmpty()) { return COMPOSE_PREFIX; } else { return COMPOSE_PREFIX + convertToYml(dockerComposeData); } }
@Override public Object link(String name, Object obj, ApiRequest request) throws IOException { Stack stack = (Stack) obj; List<? extends Service> services = objectManager.find(Service.class, SERVICE.STACK_ID, stack.getId(), SERVICE.REMOVED, null); String dockerCompose = discoverySvc.buildDockerComposeConfig(services, stack); String rancherCompose = discoverySvc.buildRancherComposeConfig(services); if (StringUtils.isNotEmpty(dockerCompose) || StringUtils.isNotEmpty(rancherCompose)) { ByteArrayOutputStream baos = zipFiles(dockerCompose, rancherCompose); HttpServletResponse response = request.getServletContext().getResponse(); response.setContentLength(baos.toByteArray().length); response.setContentType("application/zip"); response.setHeader("Content-Encoding", "zip"); response.setHeader("Content-Disposition", "attachment; filename=compose.zip"); response.setHeader("Cache-Control", "private"); response.setHeader("Pragma", "private"); response.setHeader("Expires", "Wed 24 Feb 1982 18:42:00 GMT"); response.getOutputStream().write(baos.toByteArray()); return new Object(); } return null; }
@Override public Volume doWithLock() { Volume existing = null; List<? extends Volume> volumes = context.objectManager .find(Volume.class, VOLUME.ACCOUNT_ID, service.getAccountId(), VOLUME.REMOVED, null, VOLUME.VOLUME_TEMPLATE_ID, template.getId(), VOLUME.STACK_ID, stack.getId()); for (Volume vol : volumes) { if (vol.getName().startsWith(name)) { existing = vol; break; } } if (existing != null) { return existing; } return createVolume(service, template, new String(name + postfix.substring(0, 5))); } });
private void removeVolumeTemplates(Stack stack) { List<? extends VolumeTemplate> templates = objectManager.find(VolumeTemplate.class, VOLUME_TEMPLATE.ACCOUNT_ID, stack.getAccountId(), VOLUME_TEMPLATE.REMOVED, null, VOLUME_TEMPLATE.STACK_ID, stack.getId()); for (VolumeTemplate template : templates) { objectProcessManager.scheduleStandardProcessAsync(StandardProcess.REMOVE, template, null); } }
protected Service createService(Instance instance) { Map<String, Object> labels = DataAccessor.fieldMap(instance, InstanceConstants.FIELD_LABELS); String project = getString(labels, PROJECT_LABEL); String service = getString(labels, SERVICE_LABEL); Map<String, Object> instanceData = jsonMapper.writeValueAsMap(instance); instanceData.remove(ObjectMetaDataManager.ID_FIELD); instanceData.remove(ObjectMetaDataManager.STATE_FIELD); instanceData.remove("token"); instanceData.remove(ObjectMetaDataManager.DATA_FIELD); instanceData.remove(ObjectMetaDataManager.CREATED_FIELD); Iterator<Entry<String, Object>> iter = instanceData.entrySet().iterator(); while (iter.hasNext()) { Entry<String, Object> entry = iter.next(); if (entry.getValue() == null || entry.getValue() instanceof Number) { iter.remove(); } } Stack stack = getStack(instance.getAccountId(), project); return resourceDao.createAndSchedule(Service.class, SERVICE.NAME, service, SERVICE.ACCOUNT_ID, instance.getAccountId(), SERVICE.STACK_ID, stack.getId(), SERVICE.SELECTOR_CONTAINER, String.format("%s=%s, %s=%s", PROJECT_LABEL, project, SERVICE_LABEL, service), ServiceConstants.FIELD_START_ON_CREATE, true, ServiceConstants.FIELD_LAUNCH_CONFIG, instanceData, SERVICE.KIND, "composeService"); }
protected void validateInUse(String type, String id, ApiRequest request, ResourceManager next) { Object resource = getById(type, id, new ListOptions(), next); List<Service> services = new ArrayList<>(); if (resource instanceof Service) { services.add((Service)resource); } else if (resource instanceof Stack) { services = objectManager.find(Service.class, SERVICE.STACK_ID, ((Stack) resource).getId(), SERVICE.REMOVED, null); } for (Service service : services) { List<Long> ids = networkDao.findInstancesInUseByServiceDriver(service.getId()); if (ids.size() > 0) { throwException(ids); } } }
protected void validateInUse(String type, String id, ApiRequest request, ResourceManager next) { Object resource = getById(type, id, new ListOptions(), next); List<Service> services = new ArrayList<>(); if (resource instanceof Service) { services.add((Service)resource); } else if (resource instanceof Stack) { services = objectManager.find(Service.class, SERVICE.STACK_ID, ((Stack) resource).getId(), SERVICE.REMOVED, null); } for (Service service : services) { List<Long> ids = storagePoolDao.findVolumesInUseByServiceDriver(service.getId()); if (ids.size() > 0) { throwException(ids); } } }
private void removeVolumes(Stack stack) { List<? extends Volume> volumes = objectManager.find(Volume.class, VOLUME.ACCOUNT_ID, stack.getAccountId(), VOLUME.REMOVED, null, VOLUME.STACK_ID, stack.getId()); for (Volume volume : volumes) { String state = volume.getState(); if (!REMOVED.equals(state) && !REMOVING.equals(state)){ try { objectProcessManager.scheduleStandardProcessAsync(StandardProcess.REMOVE, volume, null); } catch (ProcessCancelException e) { volume = resourceMonitor.waitForState(volume, STATE_DETACHED, 3000L); objectProcessManager.scheduleStandardProcessAsync(StandardProcess.REMOVE, volume, null); } } } }
@Override public Resource filter(ApiRequest request, Object original, Resource converted) { if (request == null) { return converted; } if (DataAccessor.fromMap(converted.getFields()).withKey(ObjectMetaDataManager.SYSTEM_FIELD).as(Boolean.class) && !infraAccess.canModifyInfrastructure(ApiUtils.getPolicy())) { converted.getActions().clear(); } if ("v1".equals(request.getVersion())) { return converted; } if (original instanceof Stack) { converted.getFields().put(ServiceConstants.STACK_FIELD_SERVICE_IDS, getCached(request).get(((Stack) original).getId())); } return converted; }
@Override public HandlerResult handle(ProcessState state, ProcessInstance process) { List<Service> services = new ArrayList<>(); Set<Long> stackIds = new HashSet<>(); if (state.getResource() instanceof Stack) { stackIds.add(((Stack) state.getResource()).getId()); } else if (state.getResource() instanceof Service) { services.add((Service) state.getResource()); } else if (state.getResource() instanceof Instance) { services.addAll(instanceDao.findServicesFor((Instance) state.getResource())); } for (Service service : services) { stackIds.add(service.getStackId()); } for (Long stackId : stackIds) { ConfigUpdateRequest request = ConfigUpdateRequest.forResource(Stack.class, stackId); request.addItem(STACK); request.withDeferredTrigger(true); itemManager.updateConfig(request); } return null; }
protected void formatLBConfig(Service service, Map<String, Object> composeServiceData) { if (composeServiceData.get(ServiceConstants.FIELD_LB_CONFIG) != null) { LbConfig lbConfig = DataAccessor.field(service, ServiceConstants.FIELD_LB_CONFIG, jsonMapper, LbConfig.class); Map<Long, Service> serviceIdsToService = new HashMap<>(); Map<Long, Stack> stackIdsToStack = new HashMap<>(); Map<Long, Certificate> certIdsToCert = new HashMap<>(); for (Service svc : objectManager.find(Service.class, SERVICE.ACCOUNT_ID, service.getAccountId(), SERVICE.REMOVED, null)) { serviceIdsToService.put(svc.getId(), svc); } for (Stack stack : objectManager.find(Stack.class, STACK.ACCOUNT_ID, service.getAccountId(), STACK.REMOVED, null)) { stackIdsToStack.put(stack.getId(), stack); } for (Certificate cert : objectManager.find(Certificate.class, CERTIFICATE.ACCOUNT_ID, service.getAccountId(), CERTIFICATE.REMOVED, null)) { certIdsToCert.put(cert.getId(), cert); } composeServiceData.put(ServiceConstants.FIELD_LB_CONFIG, new LBConfigMetadataStyle(lbConfig.getPortRules(), lbConfig.getCertificateIds(), lbConfig.getDefaultCertificateId(), lbConfig.getConfig(), lbConfig.getStickinessPolicy(), serviceIdsToService, stackIdsToStack, certIdsToCert, service.getStackId(), true, false)); } }
@Override public void updateHealthState(final Stack stack) { if (stack == null) { return; } List<Service> services = objectManager.find(Service.class, SERVICE.STACK_ID, stack.getId(), SERVICE.REMOVED, null); List<? extends Host> ActiveHosts = allocatorDao.getActiveHosts(stack.getAccountId()); HashSet<Long> activeHosts = new HashSet<Long>(); for(Host host: ActiveHosts){ activeHosts.add(host.getId()); } setServiceHealthState(services, activeHosts); setStackHealthState(stack); setEnvironmentHealthState(objectManager.loadResource(Account.class, stack.getAccountId())); }
/** * {@inheritDoc} */ @Override public void from(io.cattle.platform.core.model.Stack from) { setId(from.getId()); setName(from.getName()); setAccountId(from.getAccountId()); setKind(from.getKind()); setUuid(from.getUuid()); setDescription(from.getDescription()); setState(from.getState()); setCreated(from.getCreated()); setRemoved(from.getRemoved()); setRemoveTime(from.getRemoveTime()); setData(from.getData()); setExternalId(from.getExternalId()); setHealthState(from.getHealthState()); setGroup(from.getGroup()); setSystem(from.getSystem()); }