This is an automated email from the ASF dual-hosted git repository. xuba pushed a commit to branch v0.7.x-test-front in repository https://gitbox.apache.org/repos/asf/amoro.git
commit 60beca66bf18d59e9d9a9151791af169eab13cd0 Author: tcodehuber <[email protected]> AuthorDate: Fri Mar 22 12:04:06 2024 +0800 [Hotfix] Cannot construct instance of Jsonnode when doing login (#2659) * [Hotfix] Cannot construct instance of Jsonnode when doing login * code refactor * code refactor --------- Co-authored-by: Xavier Bai <[email protected]> (cherry picked from commit 0867c7ce93007cddfc8158bfb2c4a0aaf56f0d16) --- .../dashboard/controller/LoginController.java | 9 +- .../dashboard/controller/OptimizerController.java | 41 ++-- .../dashboard/model/OptimizerInstanceInfo.java | 240 +++++++++++++++++++++ 3 files changed, 264 insertions(+), 26 deletions(-) diff --git a/ams/server/src/main/java/com/netease/arctic/server/dashboard/controller/LoginController.java b/ams/server/src/main/java/com/netease/arctic/server/dashboard/controller/LoginController.java index 32acf84e3..5257cf835 100644 --- a/ams/server/src/main/java/com/netease/arctic/server/dashboard/controller/LoginController.java +++ b/ams/server/src/main/java/com/netease/arctic/server/dashboard/controller/LoginController.java @@ -21,11 +21,10 @@ package com.netease.arctic.server.dashboard.controller; import com.netease.arctic.server.ArcticManagementConf; import com.netease.arctic.server.dashboard.response.OkResponse; import com.netease.arctic.server.utils.Configurations; -import com.netease.arctic.utils.JacksonUtil; import io.javalin.http.Context; -import org.apache.paimon.shade.jackson2.com.fasterxml.jackson.databind.JsonNode; import java.io.Serializable; +import java.util.Map; /** The controller that handles login requests. */ public class LoginController { @@ -47,9 +46,9 @@ public class LoginController { /** handle login post request. */ public void login(Context ctx) { // ok - JsonNode postBody = ctx.bodyAsClass(JsonNode.class); - String user = JacksonUtil.getString(postBody, "user"); - String pwd = JacksonUtil.getString(postBody, "password"); + Map<String, String> bodyParams = ctx.bodyAsClass(Map.class); + String user = bodyParams.get("user"); + String pwd = bodyParams.get("password"); if (adminUser.equals(user) && (adminPassword.equals(pwd))) { ctx.sessionAttribute("user", new SessionInfo(adminUser, System.currentTimeMillis() + "")); ctx.json(OkResponse.of("success")); diff --git a/ams/server/src/main/java/com/netease/arctic/server/dashboard/controller/OptimizerController.java b/ams/server/src/main/java/com/netease/arctic/server/dashboard/controller/OptimizerController.java index 97ba2dd10..8c3706cba 100644 --- a/ams/server/src/main/java/com/netease/arctic/server/dashboard/controller/OptimizerController.java +++ b/ams/server/src/main/java/com/netease/arctic/server/dashboard/controller/OptimizerController.java @@ -23,6 +23,7 @@ import com.netease.arctic.api.resource.Resource; import com.netease.arctic.api.resource.ResourceGroup; import com.netease.arctic.api.resource.ResourceType; import com.netease.arctic.server.DefaultOptimizingService; +import com.netease.arctic.server.dashboard.model.OptimizerInstanceInfo; import com.netease.arctic.server.dashboard.model.OptimizerResourceInfo; import com.netease.arctic.server.dashboard.model.TableOptimizingInfo; import com.netease.arctic.server.dashboard.response.OkResponse; @@ -34,15 +35,13 @@ import com.netease.arctic.server.resource.ResourceContainers; import com.netease.arctic.server.table.ServerTableIdentifier; import com.netease.arctic.server.table.TableRuntime; import com.netease.arctic.server.table.TableService; -import com.netease.arctic.utils.JacksonUtil; import io.javalin.http.Context; -import org.apache.paimon.shade.jackson2.com.fasterxml.jackson.databind.JsonNode; -import org.apache.paimon.shade.jackson2.com.fasterxml.jackson.databind.node.ObjectNode; import javax.ws.rs.BadRequestException; import java.util.ArrayList; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -101,7 +100,6 @@ public class OptimizerController { Integer pageSize = ctx.queryParamAsClass("pageSize", Integer.class).getOrDefault(20); int offset = (page - 1) * pageSize; - List<OptimizerInstance> optimizers; if (optimizerGroup.equals("all")) { optimizers = optimizerManager.listOptimizers(); @@ -110,28 +108,30 @@ public class OptimizerController { } List<OptimizerInstance> optimizerList = new ArrayList<>(optimizers); optimizerList.sort(Comparator.comparingLong(OptimizerInstance::getStartTime).reversed()); - List<JsonNode> result = + List<OptimizerInstanceInfo> result = optimizerList.stream() .map( - e -> { - ObjectNode jsonObject = (ObjectNode) JacksonUtil.fromObjects(e); - jsonObject.put("jobId", e.getResourceId()); - jsonObject.put("optimizerGroup", e.getGroupName()); - jsonObject.put("coreNumber", e.getThreadCount()); - jsonObject.put("memory", e.getMemoryMb()); - jsonObject.put("jobStatus", "RUNNING"); - jsonObject.put("container", e.getContainerName()); - return jsonObject; - }) + e -> + OptimizerInstanceInfo.builder() + .token(e.getToken()) + .startTime(e.getStartTime()) + .touchTime(e.getTouchTime()) + .jobId(e.getResourceId()) + .groupName(e.getGroupName()) + .coreNumber(e.getThreadCount()) + .memory(e.getMemoryMb()) + .jobStatus("RUNNING") + .container(e.getContainerName()) + .build()) .collect(Collectors.toList()); - PageResult<JsonNode> amsPageResult = PageResult.of(result, offset, pageSize); + PageResult<OptimizerInstanceInfo> amsPageResult = PageResult.of(result, offset, pageSize); ctx.json(OkResponse.of(amsPageResult)); } /** get optimizerGroup: optimizerGroupId, optimizerGroupName url = /optimizerGroups. */ public void getOptimizerGroups(Context ctx) { - List<JsonNode> result = + List<Map<String, String>> result = optimizerManager.listResourceGroups().stream() .filter( resourceGroup -> @@ -139,10 +139,9 @@ public class OptimizerController { resourceGroup.getContainer())) .map( e -> { - ObjectNode jsonObject = JacksonUtil.createEmptyObjectNode(); - - jsonObject.put("optimizerGroupName", e.getName()); - return jsonObject; + Map<String, String> mapObj = new HashMap<>(); + mapObj.put("optimizerGroupName", e.getName()); + return mapObj; }) .collect(Collectors.toList()); ctx.json(OkResponse.of(result)); diff --git a/ams/server/src/main/java/com/netease/arctic/server/dashboard/model/OptimizerInstanceInfo.java b/ams/server/src/main/java/com/netease/arctic/server/dashboard/model/OptimizerInstanceInfo.java new file mode 100644 index 000000000..673a0c9d5 --- /dev/null +++ b/ams/server/src/main/java/com/netease/arctic/server/dashboard/model/OptimizerInstanceInfo.java @@ -0,0 +1,240 @@ +/* + * 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 com.netease.arctic.server.dashboard.model; + +import org.apache.iceberg.relocated.com.google.common.base.MoreObjects; + +import java.util.Objects; + +public class OptimizerInstanceInfo { + + private String token; + + private long startTime; + + private long touchTime; + + private String jobId; + + private String groupName; + + private int coreNumber; + + private int memory; + + private String jobStatus; + + private String container; + + public static OptimizerInstanceInfo.Builder builder() { + return new OptimizerInstanceInfo.Builder(); + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getTouchTime() { + return touchTime; + } + + public void setTouchTime(long touchTime) { + this.touchTime = touchTime; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public String getGroupName() { + return groupName; + } + + public void setGroupName(String groupName) { + this.groupName = groupName; + } + + public int getCoreNumber() { + return coreNumber; + } + + public void setCoreNumber(int coreNumber) { + this.coreNumber = coreNumber; + } + + public int getMemory() { + return memory; + } + + public void setMemory(int memory) { + this.memory = memory; + } + + public String getJobStatus() { + return jobStatus; + } + + public void setJobStatus(String jobStatus) { + this.jobStatus = jobStatus; + } + + public String getContainer() { + return container; + } + + public void setContainer(String container) { + this.container = container; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + OptimizerInstanceInfo that = (OptimizerInstanceInfo) o; + return Objects.equals(token, that.token) + && Objects.equals(startTime, that.startTime) + && Objects.equals(touchTime, that.touchTime) + && Objects.equals(jobId, that.jobId) + && Objects.equals(groupName, that.groupName) + && Objects.equals(coreNumber, that.coreNumber) + && Objects.equals(memory, that.memory) + && Objects.equals(jobStatus, that.jobStatus) + && Objects.equals(container, that.container); + } + + @Override + public int hashCode() { + return Objects.hash( + token, startTime, touchTime, jobId, groupName, coreNumber, memory, jobStatus, container); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("token", token) + .add("startTime", startTime) + .add("touchTime", touchTime) + .add("jobId", jobId) + .add("groupName", groupName) + .add("coreNumber", coreNumber) + .add("memory", memory) + .add("jobStatus", jobStatus) + .add("container", container) + .toString(); + } + + public static class Builder { + private String token; + + private long startTime; + + private long touchTime; + + private String jobId; + + private String groupName; + + private int coreNumber; + + private int memory; + + private String jobStatus; + + private String container; + + public Builder token(String token) { + this.token = token; + return this; + } + + public Builder startTime(long startTime) { + this.startTime = startTime; + return this; + } + + public Builder touchTime(long touchTime) { + this.touchTime = touchTime; + return this; + } + + public Builder jobId(String jobId) { + this.jobId = jobId; + return this; + } + + public Builder groupName(String groupName) { + this.groupName = groupName; + return this; + } + + public Builder coreNumber(int coreNumber) { + this.coreNumber = coreNumber; + return this; + } + + public Builder memory(int memory) { + this.memory = memory; + return this; + } + + public Builder jobStatus(String jobStatus) { + this.jobStatus = jobStatus; + return this; + } + + public Builder container(String container) { + this.container = container; + return this; + } + + public OptimizerInstanceInfo build() { + OptimizerInstanceInfo instanceInfo = new OptimizerInstanceInfo(); + instanceInfo.setToken(token); + instanceInfo.setStartTime(startTime); + instanceInfo.setTouchTime(touchTime); + instanceInfo.setJobId(jobId); + instanceInfo.setGroupName(groupName); + instanceInfo.setCoreNumber(coreNumber); + instanceInfo.setMemory(memory); + instanceInfo.setJobStatus(jobStatus); + instanceInfo.setContainer(container); + return instanceInfo; + } + } +}
