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

com.emc.vipr.services.s3.ViPRS3Config Maven / Gradle / Ivy

/*
 * Copyright 2014 EMC Corporation. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 * http://www.apache.org/licenses/LICENSE-2.0.txt
 *
 * or in the "license" file accompanying this file. This file 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.emc.vipr.services.s3;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.emc.vipr.ribbon.SmartClientConfig;
import com.netflix.loadbalancer.Server;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * class to house configuration elements for a ViPR S3 client.
 */
public class ViPRS3Config {
    private Protocol protocol = Protocol.HTTP;
    private List s3Endpoints;
    private String vipHost = "s3.amazonaws.com";
    private AWSCredentialsProvider credentialsProvider;
    private ClientConfiguration clientConfiguration;
    private int pollInterval; // seconds
    private int timeout; // ms

    public Protocol getProtocol() {
        return protocol;
    }

    /**
     * Set the protocol that will be used for connections (HTTP or HTTPS)
     */
    public void setProtocol(Protocol protocol) {
        this.protocol = protocol;
    }

    public List getS3Endpoints() {
        return s3Endpoints;
    }

    /**
     * Set the initial set of S3 data endpoints (data services nodes). This list of nodes will automatically be updated
     * by the client.
     */
    public void setS3Endpoints(List s3Endpoints) {
        this.s3Endpoints = s3Endpoints;
    }

    public String getVipHost() {
        return vipHost;
    }

    public AWSCredentialsProvider getCredentialsProvider() {
        return credentialsProvider;
    }

    /**
     * Set the S3 credentials (access key and secret key)
     */
    public void setCredentialsProvider(AWSCredentialsProvider credentialsProvider) {
        this.credentialsProvider = credentialsProvider;
    }

    public synchronized ClientConfiguration getClientConfiguration() {
        if (clientConfiguration == null) {
            clientConfiguration = new ClientConfiguration();
        }
        return clientConfiguration;
    }

    /**
     * Set specific AWS client configuration parameters
     */
    public void setClientConfiguration(ClientConfiguration clientConfiguration) {
        this.clientConfiguration = clientConfiguration;
    }

    public int getPollInterval() {
        return pollInterval;
    }

    /**
     * Set the delay in seconds between polls to discover data nodes
     */
    public void setPollInterval(int pollInterval) {
        this.pollInterval = pollInterval;
    }

    public int getTimeout() {
        return timeout;
    }

    /**
     * Set the timeout for discovery polls. If a timeout is reached, other servers will be tried until the list
     * is exhausted, in which case the data node list will not be updated until the next poll interval.
     */
    public void setTimeout(int timeout) {
        this.timeout = timeout;
    }

    public ViPRS3Config withProtocol(Protocol protocol) {
        setProtocol(protocol);
        return this;
    }

    public ViPRS3Config withS3Endpoints(URI... s3Endpoints) {
        setS3Endpoints(Arrays.asList(s3Endpoints));
        return this;
    }

    public ViPRS3Config withS3Endpoints(String s3EndpointsString) {
        try {
            List endpoints = new ArrayList();
            String[] uris = s3EndpointsString.split(",");
            for (String uri : uris) {
                endpoints.add(new URI(uri.trim()));
            }
            setS3Endpoints(endpoints);
            return this;
        } catch (URISyntaxException e) {
            throw new IllegalArgumentException("Invalid endpoint URL", e);
        }
    }

    public ViPRS3Config withCredentialsProvider(AWSCredentialsProvider credentialsProvider) {
        setCredentialsProvider(credentialsProvider);
        return this;
    }

    public ViPRS3Config withClientConfiguration(ClientConfiguration clientConfiguration) {
        setClientConfiguration(clientConfiguration);
        return this;
    }

    public ViPRS3Config withPollInterval(int pollInterval) {
        setPollInterval(pollInterval);
        return this;
    }

    public ViPRS3Config withTimeout(int timeout) {
        setTimeout(timeout);
        return this;
    }

    public SmartClientConfig toSmartClientConfig() {
        SmartClientConfig smartConfig = new SmartClientConfig().withInitialNodes(toServers(s3Endpoints)).withVipAddresses(vipHost)
                .withPollProtocol(protocol.toString())
                .withUsername(credentialsProvider.getCredentials().getAWSAccessKeyId())
                .withSecret(credentialsProvider.getCredentials().getAWSSecretKey());
        if (pollInterval > 0) smartConfig.setPollInterval(pollInterval);
        if (timeout > 0) smartConfig.setTimeout(timeout);
        return smartConfig;
    }

    protected Server[] toServers(List uris) {
        List servers = new ArrayList();
        for (URI uri : uris) {
            int port = uri.getPort();
            if (port == -1) port = (uri.getScheme().equalsIgnoreCase("https") ? 443 : 80);
            servers.add(new Server(uri.getHost(), port));
        }
        return servers.toArray(new Server[servers.size()]);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy