Search in sources :

Example 26 with FabricRequirements

use of io.fabric8.api.FabricRequirements in project fabric8 by jboss-fuse.

the class AutoScaleController method stopContainers.

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);
    }
}
Also used : Container(io.fabric8.api.Container) AutoScaleProfileStatus(io.fabric8.api.AutoScaleProfileStatus) ArrayList(java.util.ArrayList)

Example 27 with FabricRequirements

use of io.fabric8.api.FabricRequirements in project fabric8 by jboss-fuse.

the class AutoScaleController method autoScaleProfile.

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();
    String requirementsVersion = requirements.getVersion();
    final String version = Strings.isNotBlank(requirementsVersion) ? requirementsVersion : service.getDefaultVersionId();
    if (maximumInstances != null || minimumInstances != null) {
        if (maximumInstances != null) {
            List<Container> containers = Containers.aliveAndSuccessfulContainersForProfile(version, profile, service);
            int count = containers.size();
            int delta = count - maximumInstances;
            if (delta > 0) {
                stopContainers(containers, autoScaler, requirements, profileRequirement, status, delta);
            }
        }
        if (minimumInstances != null) {
            // lets check if we need to provision more
            List<Container> containers = Containers.aliveOrPendingContainersForProfile(version, profile, service);
            int count = containers.size();
            int delta = minimumInstances - count;
            try {
                AutoScaleProfileStatus profileStatus = status.profileStatus(profile);
                if (delta < 0) {
                    FabricService fs = this.fabricService.get();
                    if (fs != null) {
                        profileStatus.destroyingContainer();
                        for (int i = delta; i < 0; i++) {
                            while (!containers.isEmpty()) {
                                Container container = containers.remove(0);
                                if (container.getId().startsWith("auto_")) {
                                    fs.destroyContainer(container);
                                    break;
                                }
                            }
                        }
                    }
                } else if (delta > 0) {
                    if (AutoScalers.requirementsSatisfied(service, version, requirements, profileRequirement, status)) {
                        profileStatus.creatingContainer();
                        final AutoScaleRequest command = new AutoScaleRequest(service, version, profile, delta, requirements, profileRequirement, status);
                        new Thread("Creating container for " + command.getProfile()) {

                            @Override
                            public void run() {
                                try {
                                    autoScaler.createContainers(command);
                                } catch (Exception e) {
                                    LOGGER.error("Failed to create container of profile: " + profile + ". Caught: " + e, e);
                                }
                            }
                        }.start();
                    }
                } else {
                    profileStatus.provisioned();
                }
            } catch (Exception e) {
                LOGGER.error("Failed to auto-scale " + profile + ". Caught: " + e, e);
            }
        }
    }
}
Also used : Container(io.fabric8.api.Container) FabricService(io.fabric8.api.FabricService) AutoScaleProfileStatus(io.fabric8.api.AutoScaleProfileStatus) AutoScaleRequest(io.fabric8.api.AutoScaleRequest)

Example 28 with FabricRequirements

use of io.fabric8.api.FabricRequirements in project fabric8 by jboss-fuse.

the class AutoScaleController method autoScale.

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!");
        }
    }
}
Also used : ProfileRequirements(io.fabric8.api.ProfileRequirements) FabricService(io.fabric8.api.FabricService) AutoScaleStatus(io.fabric8.api.AutoScaleStatus) ContainerAutoScaler(io.fabric8.api.ContainerAutoScaler) FabricRequirements(io.fabric8.api.FabricRequirements)

Example 29 with FabricRequirements

use of io.fabric8.api.FabricRequirements in project fabric8 by jboss-fuse.

the class ProfileResource method setRequirements.

@POST
@Path("requirements")
public void setRequirements(ProfileRequirements profileRequirements) throws IOException {
    FabricService service = getFabricService();
    FabricRequirements requirements = service.getRequirements();
    if (requirements != null) {
        requirements.addOrUpdateProfileRequirements(profileRequirements);
        service.setRequirements(requirements);
    }
}
Also used : FabricService(io.fabric8.api.FabricService) FabricRequirements(io.fabric8.api.FabricRequirements) Path(javax.ws.rs.Path) POST(javax.ws.rs.POST)

Example 30 with FabricRequirements

use of io.fabric8.api.FabricRequirements in project fabric8 by jboss-fuse.

the class SshAutoScalerTest method testAllocateInHostListOrder.

@Test
public void testAllocateInHostListOrder() throws Exception {
    String[] esbBoxes = { "esb1", "esb2", "esb3", "esb4" };
    FabricRequirements requirements = new FabricRequirements();
    requirements.sshConfiguration().defaultUsername("root");
    for (String box : esbBoxes) {
        requirements.sshHost(box);
    }
    requirements.profile(exampleProfileId).minimumInstances(2);
    HostProfileCounter hostProfileCounter = assertSshAutoScale(requirements);
    assertHostHasProfileCount(hostProfileCounter, "esb1", exampleProfileId, 1);
    assertHostHasProfileCount(hostProfileCounter, "esb2", exampleProfileId, 1);
    assertHostHasProfileCount(hostProfileCounter, "esb3", exampleProfileId, 0);
    assertHostHasProfileCount(hostProfileCounter, "esb4", exampleProfileId, 0);
    dumpHostProfiles(hostProfileCounter);
}
Also used : FabricRequirements(io.fabric8.api.FabricRequirements) HostProfileCounter(io.fabric8.internal.autoscale.HostProfileCounter) Test(org.junit.Test)

Aggregations

FabricRequirements (io.fabric8.api.FabricRequirements)21 ProfileRequirements (io.fabric8.api.ProfileRequirements)13 Container (io.fabric8.api.Container)8 FabricService (io.fabric8.api.FabricService)5 Profile (io.fabric8.api.Profile)5 HostProfileCounter (io.fabric8.internal.autoscale.HostProfileCounter)5 ArrayList (java.util.ArrayList)5 Test (org.junit.Test)5 IOException (java.io.IOException)4 Map (java.util.Map)4 ProfileService (io.fabric8.api.ProfileService)3 CountingMap (io.fabric8.utils.CountingMap)3 HashSet (java.util.HashSet)3 AutoScaleProfileStatus (io.fabric8.api.AutoScaleProfileStatus)2 AutoScaleRequest (io.fabric8.api.AutoScaleRequest)2 ContainerAutoScaler (io.fabric8.api.ContainerAutoScaler)2 FabricException (io.fabric8.api.FabricException)2 SshHostConfiguration (io.fabric8.api.SshHostConfiguration)2 Version (io.fabric8.api.Version)2 MQBrokerConfigDTO (io.fabric8.api.jmx.MQBrokerConfigDTO)2