[ 
https://issues.apache.org/jira/browse/NIFI-4932?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16418350#comment-16418350
 ] 

ASF GitHub Bot commented on NIFI-4932:
--------------------------------------

Github user ijokarumawak commented on a diff in the pull request:

    https://github.com/apache/nifi/pull/2510#discussion_r177941458
  
    --- Diff: 
nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-site-to-site/src/main/java/org/apache/nifi/remote/PeerDescriptionModifier.java
 ---
    @@ -0,0 +1,160 @@
    +/*
    + * 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.nifi.remote;
    +
    +import org.apache.nifi.attribute.expression.language.PreparedQuery;
    +import org.apache.nifi.attribute.expression.language.Query;
    +import org.apache.nifi.remote.protocol.SiteToSiteTransportProtocol;
    +import org.apache.nifi.util.NiFiProperties;
    +import org.slf4j.Logger;
    +import org.slf4j.LoggerFactory;
    +
    +import java.util.List;
    +import java.util.Map;
    +import java.util.stream.Collectors;
    +
    +import static java.lang.String.format;
    +import static org.apache.commons.lang3.StringUtils.isBlank;
    +
    +public class PeerDescriptionModifier {
    +
    +    private static final Logger logger = 
LoggerFactory.getLogger(PeerDescriptionModifier.class);
    +
    +    public enum RequestType {
    +        SiteToSiteDetail,
    +        Peers
    +    }
    +
    +    private static class Route {
    +        private String name;
    +        private SiteToSiteTransportProtocol protocol;
    +        private PreparedQuery predicate;
    +        private PreparedQuery hostname;
    +        private PreparedQuery port;
    +        private PreparedQuery secure;
    +
    +        private boolean isValid() {
    +            if (hostname == null) {
    +                logger.warn("Ignore invalid route definition {} because 
'hostname' is not specified.", name);return false;
    +            }
    +            if (port == null) {
    +                logger.warn("Ignore invalid route definition {} because 
'port' is not specified.", name);
    +                return false;
    +            }
    +            return true;
    +        }
    +
    +        private PeerDescription getTarget(final Map<String, String> 
variables) {
    +            final String targetHostName = 
hostname.evaluateExpressions(variables, null);
    +            if (isBlank(targetHostName)) {
    +                throw new IllegalStateException("Target hostname was not 
resolved for the route definition " + name);
    +            }
    +
    +            final String targetPortStr = 
port.evaluateExpressions(variables, null);
    +            if (isBlank(targetPortStr)) {
    +                throw new IllegalStateException("Target port was not 
resolved for the route definition " + name);
    +            }
    +
    +            String targetIsSecure = secure == null ? null : 
secure.evaluateExpressions(variables, null);
    +            if (isBlank(targetIsSecure)) {
    +                targetIsSecure = "false";
    +            }
    +            return new PeerDescription(targetHostName, 
Integer.valueOf(targetPortStr), Boolean.valueOf(targetIsSecure));
    +        }
    +    }
    +
    +    private Map<SiteToSiteTransportProtocol, List<Route>> routes;
    +
    +
    +    private static final String PROPERTY_PREFIX = "nifi.remote.route.";
    +
    +    public PeerDescriptionModifier(final NiFiProperties properties) {
    +        final Map<String, List<String>> routeDefinitions = 
properties.getPropertyKeys().stream()
    +                .filter(k -> k.startsWith(PROPERTY_PREFIX))
    +                .collect(Collectors.groupingBy(k -> 
k.substring(PROPERTY_PREFIX.length(), k.lastIndexOf('.'))));
    +
    +        routes = routeDefinitions.entrySet().stream().map(r -> {
    +            final Route route = new Route();
    +            final String[] key = r.getKey().split("\\.");
    +            route.protocol = 
SiteToSiteTransportProtocol.valueOf(key[0].toUpperCase());
    +            route.name = key[1];
    +            r.getValue().forEach(k -> {
    +                final String name = k.substring(k.lastIndexOf('.') + 1);
    +                final String value = properties.getProperty(k);
    +                switch (name) {
    +                    case "when":
    +                        route.predicate = Query.prepare(value);
    +                        break;
    +                    case "hostname":
    +                        route.hostname = Query.prepare(value);
    +                        break;
    +                    case "port":
    +                        route.port = Query.prepare(value);
    +                        break;
    +                    case "secure":
    +                        route.secure = Query.prepare(value);
    +                        break;
    +                }
    +            });
    +            return route;
    +        }).filter(Route::isValid).collect(Collectors.groupingBy(r -> 
r.protocol));
    --- End diff --
    
    I changed it to throw Exceptions if invalid.


> Enable S2S work behind a Reverse Proxy
> --------------------------------------
>
>                 Key: NIFI-4932
>                 URL: https://issues.apache.org/jira/browse/NIFI-4932
>             Project: Apache NiFi
>          Issue Type: Improvement
>          Components: Core Framework
>            Reporter: Koji Kawamura
>            Assignee: Koji Kawamura
>            Priority: Major
>
> Currently, NiFi UI and REST API work through a reverse proxy, but NiFi 
> Site-to-Site does not. The core issue is how a NiFi node introduce remote 
> peers to Site-to-Site clients. NiFi should provide more flexible 
> configuration so that user can define remote Site-to-Site endpoints those can 
> work for both routes, through a reverse proxy, and directly.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to