[bug] Fix the bug that http redirects to master cannot be authenticated, and redirect several http interfaces to master. (#6557)

Redirect the following http requests to master:
    /rest/v2/api/cluster_overview
    /rest/v2/manager/node/frontends
    /rest/v2/manager/node/backends
    /rest/v2/manager/node/brokers
This commit is contained in:
luozenglin
2021-09-06 11:00:39 +08:00
committed by GitHub
parent 00ecb2904b
commit b3cb1e271d
3 changed files with 24 additions and 12 deletions

View File

@ -66,14 +66,18 @@ public class RestBaseController extends BaseController {
return authInfo;
}
public RedirectView redirectTo(HttpServletRequest request, TNetworkAddress addr) {
URI urlObj = null;
URI resultUriObj = null;
String urlStr = request.getRequestURI();
String userInfo = null;
if (!Strings.isNullOrEmpty(request.getHeader("Authorization"))) {
ActionAuthorizationInfo authInfo = getAuthorizationInfo(request);
userInfo = authInfo.fullUserName + ":" + authInfo.password;
}
try {
urlObj = new URI(urlStr);
resultUriObj = new URI("http", null, addr.getHostname(),
resultUriObj = new URI("http", userInfo, addr.getHostname(),
addr.getPort(), urlObj.getPath(), "", null);
} catch (Exception e) {
throw new RuntimeException(e);
@ -94,8 +98,7 @@ public class RestBaseController extends BaseController {
if (catalog.isMaster()) {
return null;
}
RedirectView redirectView = redirectTo(request, new TNetworkAddress(catalog.getMasterIp(), catalog.getMasterHttpPort()));
return redirectView;
return redirectTo(request, new TNetworkAddress(catalog.getMasterIp(), catalog.getMasterHttpPort()));
}
public void getFile(HttpServletRequest request, HttpServletResponse response, Object obj, String fileName)

View File

@ -109,7 +109,7 @@ public class NodeAction extends RestBaseController {
executeCheckPassword(request, response);
checkGlobalAuth(ConnectContext.get().getCurrentUserIdentity(), PrivPredicate.ADMIN);
return fetchNodeInfo("/frontends");
return fetchNodeInfo(request, response, "/frontends");
}
// Returns all be information, similar to 'show backends'.
@ -118,7 +118,7 @@ public class NodeAction extends RestBaseController {
executeCheckPassword(request, response);
checkGlobalAuth(ConnectContext.get().getCurrentUserIdentity(), PrivPredicate.ADMIN);
return fetchNodeInfo("/backends");
return fetchNodeInfo(request, response, "/backends");
}
// Returns all broker information, similar to 'show broker'.
@ -127,7 +127,7 @@ public class NodeAction extends RestBaseController {
executeCheckPassword(request, response);
checkGlobalAuth(ConnectContext.get().getCurrentUserIdentity(), PrivPredicate.ADMIN);
return fetchNodeInfo("/brokers");
return fetchNodeInfo(request, response, "/brokers");
}
// {
@ -140,7 +140,12 @@ public class NodeAction extends RestBaseController {
// ]
// ]
// }
private Object fetchNodeInfo(String procPath) throws AnalysisException {
private Object fetchNodeInfo(HttpServletRequest request, HttpServletResponse response, String procPath)
throws AnalysisException {
if (!Catalog.getCurrentCatalog().isMaster()) {
return redirectToMaster(request, response);
}
try {
ProcResult procResult = ProcService.getInstance().open(procPath).fetchResult();
List<String> columnNames = Lists.newArrayList(procResult.getColumnNames());
@ -202,7 +207,7 @@ public class NodeAction extends RestBaseController {
return ResponseEntityBuilder.ok(result);
}
// Return all living fe and be nodes.
// Return all fe and be nodes.
// {
// "frontend": [
// "host:httpPort"
@ -224,13 +229,13 @@ public class NodeAction extends RestBaseController {
private static List<String> getFeList() {
return Catalog.getCurrentCatalog().getFrontends(null)
.stream().filter(Frontend::isAlive)
.stream()
.map(fe -> fe.getHost() + ":" + Config.http_port)
.collect(Collectors.toList());
}
private static List<String> getBeList() {
return Catalog.getCurrentSystemInfo().getBackendIds(true)
return Catalog.getCurrentSystemInfo().getBackendIds(false)
.stream().map(beId -> {
Backend be = Catalog.getCurrentSystemInfo().getBackend(beId);
return be.getHost() + ":" + be.getHttpPort();

View File

@ -33,6 +33,7 @@ import com.google.common.collect.Maps;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -45,6 +46,9 @@ public class StatisticAction extends RestBaseController {
@RequestMapping(path = "/api/cluster_overview", method = RequestMethod.GET)
public Object clusterOverview(HttpServletRequest request, HttpServletResponse response) {
if (!Catalog.getCurrentCatalog().isMaster()) {
return redirectToMaster(request, response);
}
Map<String, Object> resultMap = Maps.newHashMap();
Catalog catalog = Catalog.getCurrentCatalog();
SystemInfoService infoService = Catalog.getCurrentSystemInfo();
@ -56,7 +60,7 @@ public class StatisticAction extends RestBaseController {
resultMap.put("feCount", catalog.getFrontends(null).size());
resultMap.put("remainDisk", getRemainDisk(infoService));
return ResponseEntityBuilder.ok(resultMap);
return ResponseEntityBuilder.ok(resultMap);
}
private int getTblCount(Catalog catalog) {