/* * Copyright 2015-present Facebook, Inc. * * 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.facebook.buck.slb; import com.facebook.buck.cli.BuckConfig; import com.facebook.buck.event.BuckEventBus; import com.facebook.buck.timing.Clock; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import java.net.URI; import java.util.Optional; public class SlbBuckConfig { // SLB BuckConfig keys. private static final String SERVER_POOL = "slb_server_pool"; private static final String PING_ENDPOINT = "slb_ping_endpoint"; private static final String HEALTH_CHECK_INTERVAL_MILLIS = "slb_health_check_internal_millis"; private static final String TIMEOUT_MILLIS = "slb_timeout_millis"; private static final String ERROR_CHECK_TIME_RANGE_MILLIS = "slb_error_check_time_range_millis"; private static final String MAX_ERROR_PERCENTAGE = "slb_max_error_percentage"; private static final String LATENCY_CHECK_TIME_RANGE_MILLIS = "slb_latency_check_time_range_millis"; private static final String MAX_ACCEPTABLE_LATENCY_MILLIS = "slb_max_acceptable_latency_millis"; private final String parentSection; private final BuckConfig buckConfig; public SlbBuckConfig(BuckConfig config, String parentSection) { this.buckConfig = config; this.parentSection = parentSection; } private ImmutableList<URI> getServerPool() { ImmutableList<String> serverPool = buckConfig.getListWithoutComments(parentSection, SERVER_POOL); ImmutableList.Builder<URI> builder = ImmutableList.builder(); for (String server : serverPool) { URI uri = URI.create(server); Preconditions.checkState( !Strings.isNullOrEmpty(uri.getScheme()), "A scheme must be provided for server [%s] in config [%s::%s].", server, parentSection, SERVER_POOL); builder.add(uri); } return builder.build(); } public ClientSideSlb createClientSideSlb(Clock clock, BuckEventBus eventBus) { return new ClientSideSlb(createConfig(clock, eventBus)); } public Optional<ClientSideSlb> tryCreatingClientSideSlb(Clock clock, BuckEventBus eventBus) { ClientSideSlbConfig config = createConfig(clock, eventBus); return ClientSideSlb.isSafeToCreate(config) ? Optional.of(new ClientSideSlb(config)) : Optional.empty(); } private ClientSideSlbConfig createConfig(Clock clock, BuckEventBus eventBus) { ClientSideSlbConfig.Builder configBuilder = ClientSideSlbConfig.builder() .setClock(clock) .setServerPool(getServerPool()) .setEventBus(eventBus); if (buckConfig.getValue(parentSection, PING_ENDPOINT).isPresent()) { configBuilder.setPingEndpoint(buckConfig.getValue(parentSection, PING_ENDPOINT).get()); } if (buckConfig.getValue(parentSection, TIMEOUT_MILLIS).isPresent()) { configBuilder.setConnectionTimeoutMillis( buckConfig.getLong(parentSection, TIMEOUT_MILLIS).get().intValue()); } if (buckConfig.getValue(parentSection, HEALTH_CHECK_INTERVAL_MILLIS).isPresent()) { configBuilder.setHealthCheckIntervalMillis( buckConfig.getLong(parentSection, HEALTH_CHECK_INTERVAL_MILLIS).get().intValue()); } if (buckConfig.getValue(parentSection, ERROR_CHECK_TIME_RANGE_MILLIS).isPresent()) { configBuilder.setErrorCheckTimeRangeMillis( buckConfig.getLong(parentSection, ERROR_CHECK_TIME_RANGE_MILLIS).get().intValue()); } if (buckConfig.getValue(parentSection, MAX_ACCEPTABLE_LATENCY_MILLIS).isPresent()) { configBuilder.setMaxAcceptableLatencyMillis( buckConfig.getLong(parentSection, MAX_ACCEPTABLE_LATENCY_MILLIS).get().intValue()); } if (buckConfig.getValue(parentSection, LATENCY_CHECK_TIME_RANGE_MILLIS).isPresent()) { configBuilder.setLatencyCheckTimeRangeMillis( buckConfig.getLong(parentSection, LATENCY_CHECK_TIME_RANGE_MILLIS).get().intValue()); } if (buckConfig.getValue(parentSection, MAX_ERROR_PERCENTAGE).isPresent()) { configBuilder.setMaxErrorPercentage( buckConfig.getFloat(parentSection, MAX_ERROR_PERCENTAGE).get()); } return configBuilder.build(); } }