/** * Licensed to Cloudera, Inc. under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. Cloudera, Inc. 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 com.cloudera.flume.util; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.cloudera.flume.conf.FlumeConfigData; import com.cloudera.flume.conf.thrift.CommandStatusThrift; import com.cloudera.flume.conf.thrift.FlumeMasterCommandThrift; import com.cloudera.flume.conf.thrift.FlumeNodeStatusThrift; import com.cloudera.flume.conf.thrift.ThriftFlumeConfigData; import com.cloudera.flume.conf.thrift.FlumeMasterAdminServer.Client; import com.cloudera.flume.master.Command; import com.cloudera.flume.master.CommandStatus; import com.cloudera.flume.master.MasterAdminServerThrift; import com.cloudera.flume.master.MasterClientServerThrift; import com.cloudera.flume.master.StatusManager.NodeStatus; /** * Thrift implementation of the Flume admin control RPC. This class manages the * connection to a master and provides type conversion. */ public class AdminRPCThrift implements AdminRPC { static final Logger LOG = LoggerFactory.getLogger(AdminRPCThrift.class); Client masterClient; public AdminRPCThrift(String masterHost, int masterPort) throws IOException { TTransport masterTransport = new TSocket(masterHost, masterPort); TProtocol protocol = new TBinaryProtocol(masterTransport); try { masterTransport.open(); } catch (TTransportException e) { throw new IOException(e); } masterClient = new Client(protocol); LOG.info("Connected to master at " + masterHost + ":" + masterPort); } @Override public Map<String, FlumeConfigData> getConfigs() throws IOException { Map<String, ThriftFlumeConfigData> results; try { results = masterClient.getConfigs(); } catch (TException e) { throw new IOException(e); } Map<String, FlumeConfigData> out = new HashMap<String, FlumeConfigData>(); for (String s : results.keySet()) { out.put(s, MasterClientServerThrift.configFromThrift(results.get(s))); } return out; } @Override public Map<String, NodeStatus> getNodeStatuses() throws IOException { Map<String, FlumeNodeStatusThrift> results; try { results = masterClient.getNodeStatuses(); } catch (TException e) { throw new IOException(e); } Map<String, NodeStatus> out = new HashMap<String, NodeStatus>(); for (String s : results.keySet()) { out.put(s, MasterAdminServerThrift.statusFromThrift(results.get(s))); } return out; } @Override public Map<String, List<String>> getMappings(String physicalNode) throws IOException { try { return masterClient.getMappings(physicalNode); } catch (TException e) { throw new IOException(e); } } @Override public boolean hasCmdId(long cmdid) throws IOException { try { return masterClient.hasCmdId(cmdid); } catch (TException e) { throw new IOException(e); } } @Override public CommandStatus getCommandStatus(long cmdid) throws IOException { try { CommandStatusThrift cst = masterClient.getCmdStatus(cmdid); if (cst == null) { throw new IOException("Illegal command id: " + cmdid); } FlumeMasterCommandThrift cmdt = cst.getCmd(); Command cmd = new Command(cmdt.getCommand(), cmdt.arguments .toArray(new String[0])); CommandStatus cs = new CommandStatus(cst.getCmdId(), cmd, CommandStatus.State.valueOf(cst.state), cst.getMessage()); return cs; } catch (TException e) { throw new IOException(e); } } @Override public boolean isFailure(long cmdid) throws IOException { try { return masterClient.isFailure(cmdid); } catch (TException e) { throw new IOException(e); } } @Override public boolean isSuccess(long cmdid) throws IOException { try { return masterClient.isSuccess(cmdid); } catch (TException e) { throw new IOException(e); } } @Override public long submit(Command command) throws IOException { try { return masterClient.submit(MasterAdminServerThrift .commandToThrift(command)); } catch (TException e) { throw new IOException(e); } } }