All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hpe.caf.autoscale.source.marathon.MarathonServiceSourceProvider Maven / Gradle / Ivy

/*
 * Copyright 2015-2017 Hewlett Packard Enterprise Development LP.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.hpe.caf.autoscale.source.marathon;


import com.hpe.caf.api.ConfigurationException;
import com.hpe.caf.api.ConfigurationSource;
import com.hpe.caf.api.autoscale.ScalerException;
import com.hpe.caf.api.autoscale.ServiceSource;
import com.hpe.caf.api.autoscale.ServiceSourceProvider;
import com.hpe.caf.autoscale.MarathonAutoscaleConfiguration;
import com.hpe.caf.naming.ServicePath;
import feign.Feign;
import feign.Request;
import mesosphere.marathon.client.Marathon;
import mesosphere.marathon.client.MarathonClient;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;


public class MarathonServiceSourceProvider implements ServiceSourceProvider
{
    private static final int MARATHON_TIMEOUT = 10_000;


    @Override
    public ServiceSource getServiceSource(final ConfigurationSource configurationSource, final ServicePath servicePath)
            throws ScalerException
    {
        try {
            final MarathonAutoscaleConfiguration config = configurationSource.getConfiguration(MarathonAutoscaleConfiguration.class);
            final String groupId = getGroupId(config, servicePath);
            Feign.Builder builder = Feign.builder().options(new Request.Options(MARATHON_TIMEOUT, MARATHON_TIMEOUT));
            Marathon marathon = MarathonClient.getInstance(builder, config.getEndpoint());
            return new MarathonServiceSource(marathon, groupId, new URL(config.getEndpoint()));
        } catch (ConfigurationException | MalformedURLException e) {
            throw new ScalerException("Failed to create service source", e);
        }
    }

    /**
     * Gets the groupId from configuration or falls back to using the autoscaler service path
     */
    private static String getGroupId(final MarathonAutoscaleConfiguration config, final ServicePath servicePath)
    {
        final String groupId = config.getGroupId();

        return (groupId == null || groupId.length() == 0)
            ? getGroupIdFromServicePath(servicePath)
            : groupId;
    }

    /**
     * Gets the groupId from the autoscaler service path
     */
    private static String getGroupIdFromServicePath(final ServicePath servicePath)
    {
        final Iterator groupIterator = servicePath.groupIterator();
        final StringBuilder groupPath = new StringBuilder();
        while (groupIterator.hasNext()) {
            groupPath.append(groupIterator.next()).append('/');
        }

        return groupPath.toString();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy