private PeerDescription getSourcePeerDescription(@Context HttpServletRequest req) { return new PeerDescription(req.getRemoteHost(), req.getRemotePort(), req.isSecure()); }
@Override public String toString() { return "PeerStatus[hostname=" + description.getHostname() + ",port=" + description.getPort() + ",secure=" + description.isSecure() + ",flowFileCount=" + numFlowFiles + "]"; }
@Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (!(obj instanceof PeerStatus)) { return false; } final PeerStatus other = (PeerStatus) obj; return description.equals(other.getPeerDescription()); } }
@Override public int hashCode() { return 9824372 + description.getHostname().hashCode() + description.getPort() * 41; }
final PeerDescription target = new PeerDescription(nodeInfo.getSiteToSiteHostname(), nodeInfo.getSiteToSitePort(), nodeInfo.isSiteToSiteSecure()); final PeerDescription modifiedTarget = peerDescriptionModifier.modify(peer.getDescription(), target, SiteToSiteTransportProtocol.RAW, PeerDescriptionModifier.RequestType.Peers, new HashMap<>()); dos.writeUTF(modifiedTarget.getHostname()); dos.writeInt(modifiedTarget.getPort()); dos.writeBoolean(modifiedTarget.isSecure());
final PeerDescription rawTarget = new PeerDescription(siteToSiteHostname, controller.getRemoteSiteListeningPort(), isSiteToSiteSecure); final PeerDescription modifiedRawTarget = peerDescriptionModifier.modify(source, rawTarget, SiteToSiteTransportProtocol.RAW, PeerDescriptionModifier.RequestType.SiteToSiteDetail, new HashMap<>(httpHeaders)); controller.setRemoteSiteListeningPort(modifiedRawTarget.getPort()); final PeerDescription httpTarget = new PeerDescription(siteToSiteHostname, controller.getRemoteSiteHttpListeningPort(), isSiteToSiteSecure); final PeerDescription modifiedHttpTarget = peerDescriptionModifier.modify(source, httpTarget, SiteToSiteTransportProtocol.HTTP, PeerDescriptionModifier.RequestType.SiteToSiteDetail, new HashMap<>(httpHeaders)); controller.setRemoteSiteHttpListeningPort(modifiedHttpTarget.getPort()); if (!controller.isSiteToSiteSecure() && modifiedHttpTarget.isSecure()) {
@Override public Set<PeerStatus> fetchRemotePeerStatuses(final PeerDescription peerDescription) throws IOException { final String hostname = peerDescription.getHostname(); final int port = peerDescription.getPort(); final URI clusterUrl = siteInfoProvider.getActiveClusterUrl(); final PeerDescription clusterPeerDescription = new PeerDescription(hostname, port, clusterUrl.toString().startsWith("https://")); final CommunicationsSession commsSession = establishSiteToSiteConnection(hostname, port);
final PeerDescription peerDescription = new PeerDescription(clientHostName, clientPort, req.isSecure()); if (peerDescription.isSecure()) { final NiFiUser nifiUser = NiFiUserUtils.getNiFiUser(); logger.debug("initiating peer, nifiUser={}", nifiUser);
@Override public int getPort() { return description.getPort(); }
@Override public String getHost() { return description.getHostname(); }
@Override public Set<PeerStatus> fetchRemotePeerStatuses(PeerDescription peerDescription) throws IOException { // Each node should has the same URL structure and network reach-ability with the proxy configuration. try (final SiteToSiteRestApiClient apiClient = new SiteToSiteRestApiClient(config.getSslContext(), config.getHttpProxy(), config.getEventReporter())) { final String scheme = peerDescription.isSecure() ? "https" : "http"; apiClient.setBaseUrl(scheme, peerDescription.getHostname(), peerDescription.getPort()); final int timeoutMillis = (int) config.getTimeout(TimeUnit.MILLISECONDS); apiClient.setConnectTimeoutMillis(timeoutMillis); apiClient.setReadTimeoutMillis(timeoutMillis); apiClient.setCacheExpirationMillis(config.getCacheExpiration(TimeUnit.MILLISECONDS)); apiClient.setLocalAddress(config.getLocalAddress()); final Collection<PeerDTO> peers = apiClient.getPeers(); if(peers == null || peers.size() == 0){ throw new IOException("Couldn't get any peer to communicate with. " + apiClient.getBaseUrl() + " returned zero peers."); } // Convert the PeerDTO's to PeerStatus objects. Use 'true' for the query-peer-for-peers flag because Site-to-Site over HTTP // was added in NiFi 1.0.0, which means that peer-to-peer queries are always allowed. return peers.stream().map(p -> new PeerStatus(new PeerDescription(p.getHostname(), p.getPort(), p.isSecure()), p.getFlowFileCount(), true)) .collect(Collectors.toSet()); } }
private CommunicationsSession establishSiteToSiteConnection(final PeerStatus peerStatus) throws IOException { final PeerDescription description = peerStatus.getPeerDescription(); return establishSiteToSiteConnection(description.getHostname(), description.getPort()); }
final int siteToSitePort = nodeId.getSiteToSiteHttpApiPort() == null ? nodeId.getApiPort() : nodeId.getSiteToSiteHttpApiPort(); PeerDescription target = new PeerDescription(siteToSiteHostname, siteToSitePort, nodeId.isSiteToSiteSecure()); peer.setHostname(target.getHostname()); peer.setPort(target.getPort()); peer.setSecure(target.isSecure()); peer.setFlowFileCount(workload.getFlowFileCount()); peers.add(peer); PeerDescription target = new PeerDescription(siteToSiteHostname, properties.getRemoteInputHttpPort(), properties.isSiteToSiteSecure()); peer.setHostname(target.getHostname()); peer.setPort(target.getPort()); peer.setSecure(target.isSecure()); peer.setFlowFileCount(0); // doesn't matter how many FlowFiles we have, because we're the only host.
private String resolveNodeApiUrl(final PeerDescription description) { return (description.isSecure() ? "https" : "http") + "://" + description.getHostname() + ":" + description.getPort() + "/nifi-api"; }
} catch (final Exception e) { logger.warn("Could not communicate with {}:{} to determine which nodes exist in the remote NiFi cluster, due to {}", peerDescription.getHostname(), peerDescription.getPort(), e.toString()); lastFailure = e;
private static Set<PeerStatus> recoverPersistedPeerStatuses(final File file) throws IOException { if (!file.exists()) { return null; } final Set<PeerStatus> statuses = new HashSet<>(); try (final InputStream fis = new FileInputStream(file); final BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) { String line; while ((line = reader.readLine()) != null) { final String[] splits = line.split(Pattern.quote(":")); if (splits.length != 3 && splits.length != 4) { continue; } final String hostname = splits[0]; final int port = Integer.parseInt(splits[1]); final boolean secure = Boolean.parseBoolean(splits[2]); final boolean supportQueryForPeer = splits.length == 4 && Boolean.parseBoolean(splits[3]); statuses.add(new PeerStatus(new PeerDescription(hostname, port, secure), 1, supportQueryForPeer)); } } return statuses; }
final PeerDescription target = new PeerDescription(nodeInfo.getSiteToSiteHostname(), nodeInfo.getSiteToSitePort(), nodeInfo.isSiteToSiteSecure()); final PeerDescription modifiedTarget = peerDescriptionModifier.modify(peer.getDescription(), target, SiteToSiteTransportProtocol.RAW, PeerDescriptionModifier.RequestType.Peers, new HashMap<>()); dos.writeUTF(modifiedTarget.getHostname()); dos.writeInt(modifiedTarget.getPort()); dos.writeBoolean(modifiedTarget.isSecure());
private void addVariables(Map<String, String> map, String prefix, PeerDescription peer) { map.put(format("%s.hostname", prefix), peer.getHostname()); map.put(format("%s.port", prefix), String.valueOf(peer.getPort())); map.put(format("%s.secure", prefix), String.valueOf(peer.isSecure())); }
final String peerUrl = "nifi://" + peerDescription.getHostname() + ":" + peerDescription.getPort(); peer = new Peer(peerDescription, commsSession, peerUrl, clusterUrl.toString());
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); } final String targetIsSecure = secure == null ? null : secure.evaluateExpressions(variables, null); return new PeerDescription(targetHostName, Integer.valueOf(targetPortStr), Boolean.valueOf(targetIsSecure)); } }