org.apache.flink.table.client.config.entries.DeploymentEntry.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.flink.table.client.config.entries.DeploymentEntry.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.flink.table.client.config.entries;

import org.apache.flink.client.cli.CliFrontendParser;
import org.apache.flink.table.client.config.ConfigUtil;
import org.apache.flink.table.client.config.Environment;
import org.apache.flink.table.descriptors.DescriptorProperties;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.apache.flink.table.client.config.Environment.DEPLOYMENT_ENTRY;

/**
 * Configuration of a Flink cluster deployment. This class parses the `deployment` part
 * in an environment file. In the future, we should keep the amount of properties here little and
 * forward most properties to Flink's CLI frontend properties directly.
 *
 * <p>All properties of this entry are optional and evaluated lazily.
 */
public class DeploymentEntry extends ConfigEntry {

    private static final Logger LOG = LoggerFactory.getLogger(DeploymentEntry.class);

    public static final DeploymentEntry DEFAULT_INSTANCE = new DeploymentEntry(new DescriptorProperties(true));

    private static final String DEPLOYMENT_RESPONSE_TIMEOUT = "response-timeout";

    private static final String DEPLOYMENT_GATEWAY_ADDRESS = "gateway-address";

    private static final String DEPLOYMENT_GATEWAY_PORT = "gateway-port";

    private DeploymentEntry(DescriptorProperties properties) {
        super(properties);
    }

    @Override
    protected void validate(DescriptorProperties properties) {
        properties.validateLong(DEPLOYMENT_RESPONSE_TIMEOUT, true, 0);
        properties.validateString(DEPLOYMENT_GATEWAY_ADDRESS, true, 0);
        properties.validateInt(DEPLOYMENT_GATEWAY_PORT, true, 0, 65535);
    }

    public long getResponseTimeout() {
        return properties.getOptionalLong(DEPLOYMENT_RESPONSE_TIMEOUT)
                .orElseGet(() -> useDefaultValue(DEPLOYMENT_RESPONSE_TIMEOUT, 10000L));
    }

    public String getGatewayAddress() {
        return properties.getOptionalString(DEPLOYMENT_GATEWAY_ADDRESS)
                .orElseGet(() -> useDefaultValue(DEPLOYMENT_GATEWAY_ADDRESS, ""));
    }

    public int getGatewayPort() {
        return properties.getOptionalInt(DEPLOYMENT_GATEWAY_PORT)
                .orElseGet(() -> useDefaultValue(DEPLOYMENT_GATEWAY_PORT, 0));
    }

    /**
     * Parses the given command line options from the deployment properties. Ignores properties
     * that are not defined by options.
     */
    public CommandLine getCommandLine(Options commandLineOptions) throws Exception {
        final List<String> args = new ArrayList<>();

        properties.asMap().forEach((k, v) -> {
            // only add supported options
            if (commandLineOptions.hasOption(k)) {
                final Option o = commandLineOptions.getOption(k);
                final String argument = "--" + o.getLongOpt();
                // options without args
                if (!o.hasArg()) {
                    final Boolean flag = Boolean.parseBoolean(v);
                    // add key only
                    if (flag) {
                        args.add(argument);
                    }
                }
                // add key and value
                else if (!o.hasArgs()) {
                    args.add(argument);
                    args.add(v);
                }
                // options with multiple args are not supported yet
                else {
                    throw new IllegalArgumentException("Option '" + o + "' is not supported yet.");
                }
            }
        });

        return CliFrontendParser.parse(commandLineOptions, args.toArray(new String[args.size()]), true);
    }

    private <V> V useDefaultValue(String key, V defaultValue) {
        LOG.info("Property '{}.{}' not specified. Using default value: {}", DEPLOYMENT_ENTRY, key, defaultValue);
        return defaultValue;
    }

    public Map<String, String> asTopLevelMap() {
        return properties.asPrefixedMap(DEPLOYMENT_ENTRY + '.');
    }

    // --------------------------------------------------------------------------------------------

    public static DeploymentEntry create(Map<String, Object> config) {
        return new DeploymentEntry(ConfigUtil.normalizeYaml(config));
    }

    /**
     * Merges two deployments entries. The properties of the first deployment entry might be
     * overwritten by the second one.
     */
    public static DeploymentEntry merge(DeploymentEntry deployment1, DeploymentEntry deployment2) {
        final Map<String, String> mergedProperties = new HashMap<>(deployment1.asMap());
        mergedProperties.putAll(deployment2.asMap());

        final DescriptorProperties properties = new DescriptorProperties(true);
        properties.putProperties(mergedProperties);

        return new DeploymentEntry(properties);
    }

    /**
     * Creates a new deployment entry enriched with additional properties that are prefixed with
     * {@link Environment#DEPLOYMENT_ENTRY}.
     */
    public static DeploymentEntry enrich(DeploymentEntry deployment, Map<String, String> prefixedProperties) {
        final Map<String, String> enrichedProperties = new HashMap<>(deployment.asMap());

        prefixedProperties.forEach((k, v) -> {
            final String normalizedKey = k.toLowerCase();
            if (k.startsWith(DEPLOYMENT_ENTRY + '.')) {
                enrichedProperties.put(normalizedKey.substring(DEPLOYMENT_ENTRY.length() + 1), v);
            }
        });

        final DescriptorProperties properties = new DescriptorProperties(true);
        properties.putProperties(enrichedProperties);

        return new DeploymentEntry(properties);
    }
}