Skip to content

Commit f1ba0b0

Browse files
committed
Fixed bug in UI where non indicative banner appears in routing rules page for external service
1 parent e36c3d1 commit f1ba0b0

File tree

3 files changed

+65
-7
lines changed

3 files changed

+65
-7
lines changed

gateway-ha/src/main/java/io/trino/gateway/ha/resource/GatewayWebAppResource.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.trino.gateway.ha.clustermonitor.ClusterStats;
1919
import io.trino.gateway.ha.config.HaGatewayConfiguration;
2020
import io.trino.gateway.ha.config.ProxyBackendConfiguration;
21+
import io.trino.gateway.ha.config.RulesType;
2122
import io.trino.gateway.ha.config.UIConfiguration;
2223
import io.trino.gateway.ha.domain.Result;
2324
import io.trino.gateway.ha.domain.RoutingRule;
@@ -76,6 +77,7 @@ public class GatewayWebAppResource
7677
// TODO Avoid putting mutable objects in fields
7778
private final UIConfiguration uiConfiguration;
7879
private final RoutingRulesManager routingRulesManager;
80+
private final HaGatewayConfiguration haGatewayConfiguration;
7981

8082
@Inject
8183
public GatewayWebAppResource(
@@ -92,6 +94,7 @@ public GatewayWebAppResource(
9294
this.resourceGroupsManager = requireNonNull(resourceGroupsManager, "resourceGroupsManager is null");
9395
this.uiConfiguration = configuration.getUiConfiguration();
9496
this.routingRulesManager = requireNonNull(routingRulesManager, "routingRulesManager is null");
97+
this.haGatewayConfiguration = configuration;
9598
}
9699

97100
@POST
@@ -160,7 +163,7 @@ public Response getDistribution(QueryDistributionRequest query)
160163
Map<String, List<DistributionResponse.LineChart>> lineChartMap = lineChart.stream().collect(Collectors.groupingBy(DistributionResponse.LineChart::getName));
161164
List<DistributionResponse.DistributionChart> distributionChart = lineChartMap.values().stream().map(d -> {
162165
DistributionResponse.DistributionChart dc = new DistributionResponse.DistributionChart();
163-
DistributionResponse.LineChart lc = d.get(0);
166+
DistributionResponse.LineChart lc = d.getFirst();
164167
long sum = d.stream().collect(Collectors.summarizingLong(DistributionResponse.LineChart::getQueryCount)).getSum();
165168
dc.setQueryCount(sum);
166169
dc.setBackendUrl(lc.getBackendUrl());
@@ -446,6 +449,10 @@ public Response readExactMatchSourceSelector()
446449
public Response getRoutingRules()
447450
throws IOException
448451
{
452+
if (haGatewayConfiguration.getRoutingRules().isRulesEngineEnabled() && haGatewayConfiguration.getRoutingRules().getRulesType() == RulesType.EXTERNAL) {
453+
return Response.status(Response.Status.NO_CONTENT)
454+
.entity(Result.fail("Routing rules are managed by an external service")).build();
455+
}
449456
List<RoutingRule> routingRulesList = routingRulesManager.getRoutingRules();
450457
return Response.ok(Result.ok(routingRulesList)).build();
451458
}

webapp/src/api/base.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ export class ClientApi {
1717
if (res.status === 401 || res.status === 403) {
1818
this.authErrorHandler()
1919
}
20+
else if (res.status === 204) {
21+
// handle the case of Response.Status.NO_CONTENT when External Routing Service is used
22+
return { isExternalRouting: true };
23+
}
24+
else if (res.status >= 500) {
25+
const resJson = await res.json();
26+
this.serverErrorHandler(resJson.msg);
27+
}
2028
else if (res.status !== 200) {
2129
Toast.error({
2230
content: Locale.Error.Network,
@@ -119,6 +127,14 @@ export class ClientApi {
119127
accessStore.updateToken("");
120128
throw new Error(Locale.Auth.Expiration);
121129
}
130+
serverErrorHandler(msg: string): void {
131+
Toast.error({
132+
content: msg,
133+
duration: 5,
134+
theme: "light"
135+
});
136+
throw new Error(msg);
137+
}
122138
}
123139

124140
export const api = new ClientApi();

webapp/src/components/routing-rules.tsx

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useEffect, useState } from "react";
22
import { routingRulesApi, updateRoutingRulesApi } from "../api/webapp/routing-rules.ts";
33
import { RoutingRulesData } from "../types/routing-rules";
4-
import { Button, Card, Form, Toast } from "@douyinfe/semi-ui";
4+
import { Button, Card, Form, Toast, Spin } from "@douyinfe/semi-ui";
55
import { FormApi } from "@douyinfe/semi-ui/lib/es/form";
66
import { Role, useAccessStore } from "../store";
77
import Locale from "../locales";
@@ -10,20 +10,31 @@ export function RoutingRules() {
1010
const [rules, setRules] = useState<RoutingRulesData[]>([]);
1111
const [editingStates, setEditingStates] = useState<boolean[]>([]);
1212
const [formApis, setFormApis] = useState<(FormApi<any> | null)[]>([]);
13+
const [isExternalRouting, setIsExternalRouting] = useState(false);
14+
const [isLoading, setIsLoading] = useState(true);
1315
const access = useAccessStore();
1416

1517
useEffect(() => {
1618
fetchRoutingRules();
1719
}, []);
1820

1921
const fetchRoutingRules = () => {
22+
setIsLoading(true);
2023
routingRulesApi()
2124
.then(data => {
22-
setRules(data);
23-
setEditingStates(new Array(data.length).fill(false));
24-
setFormApis(new Array(data.length).fill(null));
25+
if (data.isExternalRouting) {
26+
setIsExternalRouting(true);
27+
setRules([]);
28+
} else {
29+
setRules(data);
30+
setEditingStates(new Array(data.length).fill(false));
31+
setFormApis(new Array(data.length).fill(null));
32+
setIsExternalRouting(false);
33+
}
2534
}).catch(() => {
2635
Toast.error(Locale.RoutingRules.ErrorFetch);
36+
}).finally(() => {
37+
setIsLoading(false);
2738
});
2839
};
2940

@@ -81,7 +92,31 @@ export function RoutingRules() {
8192

8293
return (
8394
<div>
84-
{rules.map((rule, index) => (
95+
{isLoading ? (
96+
<div style={{
97+
display: 'flex',
98+
justifyContent: 'center',
99+
alignItems: 'center',
100+
paddingTop: '40px'
101+
}}>
102+
<Spin size="large" />
103+
</div>
104+
) : rules.length === 0 ? (
105+
<div style={{
106+
display: 'flex',
107+
justifyContent: 'center',
108+
alignItems: 'flex-start',
109+
paddingTop: '40px',
110+
fontSize: '16px',
111+
color: '#666'
112+
}}>
113+
{isExternalRouting ?
114+
"No routing rules available. Routing rules are managed by an external service." :
115+
"No routing rules configured. Add rules to manage query routing."
116+
}
117+
</div>
118+
) : (
119+
rules.map((rule, index) => (
85120
<div key={index} style={{marginBottom: '20px'}}>
86121
<Card
87122
shadows='always'
@@ -170,7 +205,7 @@ export function RoutingRules() {
170205
</Form>
171206
</Card>
172207
</div>
173-
))}
208+
)))}
174209
</div>
175210
);
176211
}

0 commit comments

Comments
 (0)