public ProfileRequirements findProfileRequirements(String profile) { for (ProfileRequirements profileRequirement : profileRequirements) { if (profile.equals(profileRequirement.getProfile())) { return profileRequirement; } } return null; }
public ProfileRequirements findProfileRequirements(String profile) { for (ProfileRequirements profileRequirement : profileRequirements) { if (profile.equals(profileRequirement.getProfile())) { return profileRequirement; } } return null; }
/** * Removes all the empty requirements; usually used just before saving to JSON * @param excludes */ public void removeEmptyRequirements(Set<String> excludes) { Iterator<ProfileRequirements> iterator = profileRequirements.iterator(); while (iterator.hasNext()) { ProfileRequirements requirements = iterator.next(); if( !excludes.contains(requirements.getProfile()) ) { if (requirements.checkIsEmpty()) { iterator.remove(); } } } }
public void addOrUpdateProfileRequirements(ProfileRequirements requirement) { removeProfileRequirements(requirement.getProfile()); profileRequirements.add(requirement); sortProfilesRequirements(); }
public void addOrUpdateProfileRequirements(ProfileRequirements requirement) { removeProfileRequirements(requirement.getProfile()); profileRequirements.add(requirement); sortProfilesRequirements(); }
protected void stopContainers(List<Container> containers, ContainerAutoScaler autoScaler, FabricRequirements requirements, ProfileRequirements profileRequirement, AutoScaleStatus status, int delta) { final String profile = profileRequirement.getProfile(); AutoScaleProfileStatus profileStatus = status.profileStatus(profile); // TODO sort the containers using some kind of requirements sorting order List<Container> sorted = new ArrayList<>(containers); // lets stop the ones at the end of the list by default Collections.reverse(sorted); List<String> stoppingContainerIds = new ArrayList<>(); for (int i = 0; i < delta; i++) { if (i >= sorted.size()) { break; } Container container = sorted.get(i); stoppingContainerIds.add(container.getId()); profileStatus.stoppingContainers(stoppingContainerIds); container.stop(true); } }
protected static void validateProfileRequirements(FabricService fabricService, FabricRequirements requirements, ProfileRequirements profileRequirement, Set<String> profileIds) { profileRequirement.validate(); assertValidProfileId(profileIds, profileRequirement.getProfile()); List<String> dependentProfiles = profileRequirement.getDependentProfiles(); if (dependentProfiles != null) { for (String dependentProfile : dependentProfiles) { assertValidProfileId(profileIds, dependentProfile); } } }
/** * Validates the requirements to ensure the profiles exist etc. and * removes those for a profile that does not exist. */ public static void validateRequirements(FabricService fabricService, FabricRequirements requirements) { ProfileService profileService = fabricService.adapt(ProfileService.class); String versionId = requirements.getVersion(); Version version; if (!Strings.isNullOrEmpty(versionId)) { version = profileService.getRequiredVersion(versionId); } else { version = fabricService.getDefaultVersion(); } Set<String> profileIds = new HashSet<>(Profiles.profileIds(version.getProfiles())); List<ProfileRequirements> profileRequirements = requirements.getProfileRequirements(); List<String> profilesToBeRemoved = new ArrayList<>(); for (ProfileRequirements profileRequirement : profileRequirements) { try { validateProfileRequirements(fabricService, requirements, profileRequirement, profileIds); } catch (IllegalArgumentException e) { LOGGER.info("Removing {}; {}", profileRequirement, e.getMessage()); profilesToBeRemoved.add(profileRequirement.getProfile()); } } for(String profile : profilesToBeRemoved){ requirements.removeProfileRequirements(profile); } }
/** * Filters the available host configurations */ public static <T extends HostConfiguration> SortedSet<LoadSortedHostConfiguration<T>> filterHosts(ProfileRequirements profileRequirements, HostScalingRequirements scalingRequirements, HostProfileCounter hostProfileCounter, List<T> hosts) { SortedSet<LoadSortedHostConfiguration<T>> answer = new TreeSet<>(); int index = 0; Filter<String> hostFilter = createHostAliasFilter(scalingRequirements); Filter<HostConfiguration> configFilter = createHostConfigFilter(scalingRequirements); for (T config : hosts) { String hostName = config.getHostName(); if (hostFilter.matches(hostName) && configFilter.matches(config)) { String profile = profileRequirements.getProfile(); boolean valid = isValidHost(config, profileRequirements, hostProfileCounter, hostName); if (valid) { answer.add(new LoadSortedHostConfiguration<>(hostName, config, profile, hostProfileCounter, index++)); } } } return answer; }
private void autoScale() { FabricService service = fabricService.get(); FabricRequirements requirements = service.getRequirements(); List<ProfileRequirements> profileRequirements = requirements.getProfileRequirements(); if (profileRequirements != null && !profileRequirements.isEmpty()) { AutoScaleStatus status = new AutoScaleStatus(); for (ProfileRequirements profileRequirement : profileRequirements) { ContainerAutoScaler autoScaler = createAutoScaler(requirements, profileRequirement); if (autoScaler != null) { autoScaleProfile(service, autoScaler, requirements, profileRequirement, status); } else { LOGGER.warn("No ContainerAutoScaler available for profile " + profileRequirement.getProfile()); } } if (zkMasterCache != null) { try { String json = RequirementsJson.toJSON(status); String zkPath = ZkPath.AUTO_SCALE_STATUS.getPath(); zkMasterCache.setStringData(zkPath, json, CreateMode.EPHEMERAL); } catch (Exception e) { LOGGER.warn("Failed to write autoscale status " + e, e); } } else { LOGGER.warn("No ZooKeeperMasterCache!"); } } }
public static boolean isValidHost(HostConfiguration config, ProfileRequirements profileRequirements, HostProfileCounter hostProfileCounter, String hostAlias) { boolean valid = true; String profile = profileRequirements.getProfile(); Integer maximumContainerCount = config.getMaximumContainerCount(); if (maximumContainerCount != null) { int count = hostProfileCounter.containerCount(hostAlias); if (count >= maximumContainerCount) { valid = false; } } if (valid) { Integer maximumInstancesPerHost = profileRequirements.getMaximumInstancesPerHost(); if (maximumInstancesPerHost != null) { int count = hostProfileCounter.profileCount(hostAlias, profile); if (count >= maximumInstancesPerHost) { valid = false; } } } return valid; }
/** * Returns true if the requirements are satisfied for the given profile requirements; updating the auto scale status * accordingly */ public static boolean requirementsSatisfied(FabricService service, String version, FabricRequirements requirements, ProfileRequirements profileRequirement, AutoScaleStatus status) { String profile = profileRequirement.getProfile(); List<String> dependentProfiles = profileRequirement.getDependentProfiles(); if (dependentProfiles != null) { for (String dependentProfile : dependentProfiles) { ProfileRequirements dependentProfileRequirements = requirements.getOrCreateProfileRequirement(dependentProfile); Integer minimumInstances = dependentProfileRequirements.getMinimumInstances(); if (minimumInstances != null) { List<Container> containers = Containers.aliveAndSuccessfulContainersForProfile(version, dependentProfile, service); int dependentSize = containers.size(); if (minimumInstances > dependentSize) { status.profileStatus(profile).missingDependency(dependentProfile, dependentSize, minimumInstances); return false; } } } } return true; } }
public void init() { requirements = service.getRequirements(); List<ProfileRequirements> profileRequirements = requirements.getProfileRequirements(); for (ProfileRequirements profileRequirement : profileRequirements) { String key = profileRequirement.getProfile(); ProfileStatus status = profileStatusMap.get(key); if (status == null) { status = createStatus(key, profileRequirement); profileStatusMap.put(key, status); } } Container[] containers = service.getContainers(); for (Container container : containers) { if (container.isAliveAndOK()) { Profile[] profiles = container.getProfiles(); for (Profile profile : profiles) { String key = profile.getId(); ProfileStatus status = profileStatusMap.get(key); if (status == null) { ProfileRequirements profileRequirement = new ProfileRequirements(key); requirements.addOrUpdateProfileRequirements(profileRequirement); status = createStatus(key, profileRequirement); profileStatusMap.put(key, status); } status.incrementCount(); } } } }
public void init() { requirements = service.getRequirements(); List<ProfileRequirements> profileRequirements = requirements.getProfileRequirements(); for (ProfileRequirements profileRequirement : profileRequirements) { String key = profileRequirement.getProfile(); ProfileStatus status = profileStatusMap.get(key); if (status == null) { status = createStatus(key, profileRequirement); profileStatusMap.put(key, status); } } Container[] containers = service.getContainers(); for (Container container : containers) { if (container.isAliveAndOK()) { Profile[] profiles = container.getProfiles(); for (Profile profile : profiles) { String key = profile.getId(); ProfileStatus status = profileStatusMap.get(key); if (status == null) { ProfileRequirements profileRequirement = new ProfileRequirements(key); requirements.addOrUpdateProfileRequirements(profileRequirement); status = createStatus(key, profileRequirement); profileStatusMap.put(key, status); } status.incrementCount(); } } } }
Integer minimumInstances = profileRequirement.getMinimumInstances(); Integer maximumInstances = profileRequirement.getMaximumInstances(); String profile = profileRequirement.getProfile(); boolean wasValid = previousValidProfileIds.contains(profile); valid = valid && isProfileInstancesValid(controller, version, profile, minimumInstances, maximumInstances, wasValid);
private void autoScaleProfile(FabricService service, final ContainerAutoScaler autoScaler, FabricRequirements requirements, ProfileRequirements profileRequirement, AutoScaleStatus status) { final String profile = profileRequirement.getProfile(); Integer minimumInstances = profileRequirement.getMinimumInstances(); Integer maximumInstances = profileRequirement.getMaximumInstances();
@Override protected void printRequirements(PrintStream out, FabricRequirements requirements) { TablePrinter table = new TablePrinter(); table.columns("profile", "# minimum", "# maximum", "depends on"); List<ProfileRequirements> profileRequirements = requirements.getProfileRequirements(); for (ProfileRequirements profile : profileRequirements) { table.row(profile.getProfile(), getStringOrBlank(profile.getMinimumInstances()), getStringOrBlank(profile.getMaximumInstances()), getStringOrBlank(profile.getDependentProfiles())); } table.print(); }