This is an automated email from the ASF dual-hosted git repository.

tcodehuber028 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/amoro.git


The following commit(s) were added to refs/heads/master by this push:
     new fba4ce9ff [AMORO-3195]: OptimizerController decoupling to 
OptimizerGroupController (#3216)
fba4ce9ff is described below

commit fba4ce9ff1b38ae818fe9014c88ade8c242c96a3
Author: mansonliwh <[email protected]>
AuthorDate: Tue Oct 8 11:19:34 2024 +0800

    [AMORO-3195]: OptimizerController decoupling to OptimizerGroupController 
(#3216)
    
    [AMORO-3195] OptimizerController decoupling to OptimizerGroupController
---
 .../amoro/server/dashboard/DashboardServer.java    |  36 ++--
 .../dashboard/controller/OptimizerController.java  | 197 +--------------------
 ...ntroller.java => OptimizerGroupController.java} |   5 +-
 amoro-web/src/language/en.ts                       |   1 +
 amoro-web/src/language/zh.ts                       |   1 +
 amoro-web/src/services/optimize.service.ts         |  14 +-
 .../resource/components/CreateOptimizerModal.vue   | 126 +++++++++++++
 amoro-web/src/views/resource/components/List.vue   |   9 -
 amoro-web/src/views/resource/index.vue             |  26 +++
 9 files changed, 198 insertions(+), 217 deletions(-)

diff --git 
a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java
 
b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java
index d0f70b1d6..bb773fca6 100644
--- 
a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java
+++ 
b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/DashboardServer.java
@@ -39,6 +39,7 @@ import 
org.apache.amoro.server.dashboard.controller.CatalogController;
 import org.apache.amoro.server.dashboard.controller.HealthCheckController;
 import org.apache.amoro.server.dashboard.controller.LoginController;
 import org.apache.amoro.server.dashboard.controller.OptimizerController;
+import org.apache.amoro.server.dashboard.controller.OptimizerGroupController;
 import org.apache.amoro.server.dashboard.controller.OverviewController;
 import org.apache.amoro.server.dashboard.controller.PlatformFileInfoController;
 import org.apache.amoro.server.dashboard.controller.SettingController;
@@ -77,6 +78,7 @@ public class DashboardServer {
   private final CatalogController catalogController;
   private final HealthCheckController healthCheckController;
   private final LoginController loginController;
+  private final OptimizerGroupController optimizerGroupController;
   private final OptimizerController optimizerController;
   private final PlatformFileInfoController platformFileInfoController;
   private final SettingController settingController;
@@ -98,7 +100,8 @@ public class DashboardServer {
     this.catalogController = new CatalogController(tableService, 
platformFileManager);
     this.healthCheckController = new HealthCheckController();
     this.loginController = new LoginController(serviceConfig);
-    this.optimizerController = new OptimizerController(tableService, 
optimizerManager);
+    this.optimizerGroupController = new OptimizerGroupController(tableService, 
optimizerManager);
+    this.optimizerController = new OptimizerController(optimizerManager);
     this.platformFileInfoController = new 
PlatformFileInfoController(platformFileManager);
     this.settingController = new SettingController(serviceConfig, 
optimizerManager);
     ServerTableDescriptor tableDescriptor = new 
ServerTableDescriptor(tableService, serviceConfig);
@@ -277,26 +280,29 @@ public class DashboardServer {
           () -> {
             get(
                 "/optimizerGroups/{optimizerGroup}/tables",
-                optimizerController::getOptimizerTables);
-            get("/optimizerGroups/{optimizerGroup}/optimizers", 
optimizerController::getOptimizers);
-            get("/optimizerGroups", optimizerController::getOptimizerGroups);
+                optimizerGroupController::getOptimizerTables);
+            get(
+                "/optimizerGroups/{optimizerGroup}/optimizers",
+                optimizerGroupController::getOptimizers);
+            get("/optimizerGroups", 
optimizerGroupController::getOptimizerGroups);
             get(
                 "/optimizerGroups/{optimizerGroup}/info",
-                optimizerController::getOptimizerGroupInfo);
-            delete(
-                "/optimizerGroups/{optimizerGroup}/optimizers/{jobId}",
-                optimizerController::releaseOptimizer);
+                optimizerGroupController::getOptimizerGroupInfo);
             post(
                 "/optimizerGroups/{optimizerGroup}/optimizers",
-                optimizerController::scaleOutOptimizer);
-            get("/resourceGroups", optimizerController::getResourceGroup);
-            post("/resourceGroups", optimizerController::createResourceGroup);
-            put("/resourceGroups", optimizerController::updateResourceGroup);
-            delete("/resourceGroups/{resourceGroupName}", 
optimizerController::deleteResourceGroup);
+                optimizerGroupController::scaleOutOptimizer);
+            post("/optimizers", optimizerController::createOptimizer);
+            delete("/optimizers/{jobId}", 
optimizerController::releaseOptimizer);
+            get("/resourceGroups", optimizerGroupController::getResourceGroup);
+            post("/resourceGroups", 
optimizerGroupController::createResourceGroup);
+            put("/resourceGroups", 
optimizerGroupController::updateResourceGroup);
+            delete(
+                "/resourceGroups/{resourceGroupName}",
+                optimizerGroupController::deleteResourceGroup);
             get(
                 "/resourceGroups/{resourceGroupName}/delete/check",
-                optimizerController::deleteCheckResourceGroup);
-            get("/containers/get", optimizerController::getContainers);
+                optimizerGroupController::deleteCheckResourceGroup);
+            get("/containers/get", optimizerGroupController::getContainers);
           });
 
       // console apis
diff --git 
a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerController.java
 
b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerController.java
index c5770be20..9e34df3ab 100644
--- 
a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerController.java
+++ 
b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerController.java
@@ -23,137 +23,25 @@ import org.apache.amoro.resource.Resource;
 import org.apache.amoro.resource.ResourceGroup;
 import org.apache.amoro.resource.ResourceType;
 import org.apache.amoro.server.DefaultOptimizingService;
-import org.apache.amoro.server.dashboard.model.OptimizerInstanceInfo;
-import org.apache.amoro.server.dashboard.model.OptimizerResourceInfo;
-import org.apache.amoro.server.dashboard.model.TableOptimizingInfo;
 import org.apache.amoro.server.dashboard.response.OkResponse;
-import org.apache.amoro.server.dashboard.response.PageResult;
-import org.apache.amoro.server.dashboard.utils.OptimizingUtil;
-import org.apache.amoro.server.persistence.TableRuntimeMeta;
 import org.apache.amoro.server.resource.ContainerMetadata;
 import org.apache.amoro.server.resource.OptimizerInstance;
 import org.apache.amoro.server.resource.ResourceContainers;
-import org.apache.amoro.server.table.TableRuntime;
-import org.apache.amoro.server.table.TableService;
 import org.apache.amoro.shade.guava32.com.google.common.base.Preconditions;
 
-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;
 
 /** The controller that handles optimizer requests. */
 public class OptimizerController {
-  private static final String ALL_GROUP = "all";
-  private final TableService tableService;
+
   private final DefaultOptimizingService optimizerManager;
 
-  public OptimizerController(TableService tableService, 
DefaultOptimizingService optimizerManager) {
-    this.tableService = tableService;
+  public OptimizerController(DefaultOptimizingService optimizerManager) {
     this.optimizerManager = optimizerManager;
   }
 
-  /** Get optimize tables. * @return List of {@link TableOptimizingInfo} */
-  public void getOptimizerTables(Context ctx) {
-    String optimizerGroup = ctx.pathParam("optimizerGroup");
-    String dbFilterStr = ctx.queryParam("dbSearchInput");
-    String tableFilterStr = ctx.queryParam("tableSearchInput");
-    Integer page = ctx.queryParamAsClass("page", 
Integer.class).getOrDefault(1);
-    Integer pageSize = ctx.queryParamAsClass("pageSize", 
Integer.class).getOrDefault(20);
-    int offset = (page - 1) * pageSize;
-
-    String optimizerGroupUsedInDbFilter = ALL_GROUP.equals(optimizerGroup) ? 
null : optimizerGroup;
-    // get all info from underlying table table_runtime
-    List<TableRuntimeMeta> tableRuntimeBeans =
-        tableService.getTableRuntimes(
-            optimizerGroupUsedInDbFilter, dbFilterStr, tableFilterStr, 
pageSize, offset);
-
-    List<TableRuntime> tableRuntimes =
-        tableRuntimeBeans.stream()
-            .map(meta -> tableService.getRuntime(meta.getTableId()))
-            .collect(Collectors.toList());
-
-    PageResult<TableOptimizingInfo> amsPageResult =
-        PageResult.of(tableRuntimes, offset, pageSize, 
OptimizingUtil::buildTableOptimizeInfo);
-    ctx.json(OkResponse.of(amsPageResult));
-  }
-
-  /** get optimizers. */
-  public void getOptimizers(Context ctx) {
-    String optimizerGroup = ctx.pathParam("optimizerGroup");
-    Integer page = ctx.queryParamAsClass("page", 
Integer.class).getOrDefault(1);
-    Integer pageSize = ctx.queryParamAsClass("pageSize", 
Integer.class).getOrDefault(20);
-
-    int offset = (page - 1) * pageSize;
-    List<OptimizerInstance> optimizers;
-    if (optimizerGroup.equals("all")) {
-      optimizers = optimizerManager.listOptimizers();
-    } else {
-      optimizers = optimizerManager.listOptimizers(optimizerGroup);
-    }
-    List<OptimizerInstance> optimizerList = new ArrayList<>(optimizers);
-    
optimizerList.sort(Comparator.comparingLong(OptimizerInstance::getStartTime).reversed());
-    List<OptimizerInstanceInfo> result =
-        optimizerList.stream()
-            .map(
-                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<OptimizerInstanceInfo> amsPageResult = PageResult.of(result, 
offset, pageSize);
-    ctx.json(OkResponse.of(amsPageResult));
-  }
-
-  /** get optimizerGroup: optimizerGroupId, optimizerGroupName url = 
/optimizerGroups. */
-  public void getOptimizerGroups(Context ctx) {
-    List<Map<String, String>> result =
-        optimizerManager.listResourceGroups().stream()
-            .filter(
-                resourceGroup ->
-                    !ResourceContainers.EXTERNAL_CONTAINER_NAME.equals(
-                        resourceGroup.getContainer()))
-            .map(
-                e -> {
-                  Map<String, String> mapObj = new HashMap<>();
-                  mapObj.put("optimizerGroupName", e.getName());
-                  return mapObj;
-                })
-            .collect(Collectors.toList());
-    ctx.json(OkResponse.of(result));
-  }
-
-  /** get optimizer info: occupationCore, occupationMemory */
-  public void getOptimizerGroupInfo(Context ctx) {
-    String optimizerGroup = ctx.pathParam("optimizerGroup");
-    List<OptimizerInstance> optimizers;
-    if (optimizerGroup.equals("all")) {
-      optimizers = optimizerManager.listOptimizers();
-    } else {
-      optimizers = optimizerManager.listOptimizers(optimizerGroup);
-    }
-    OptimizerResourceInfo optimizerResourceInfo = new OptimizerResourceInfo();
-    optimizers.forEach(
-        e -> {
-          optimizerResourceInfo.addOccupationCore(e.getThreadCount());
-          optimizerResourceInfo.addOccupationMemory(e.getMemoryMb());
-        });
-    ctx.json(OkResponse.of(optimizerResourceInfo));
-  }
-
   /**
    * release optimizer.
    *
@@ -180,12 +68,11 @@ public class OptimizerController {
     ctx.json(OkResponse.of("Success to release optimizer"));
   }
 
-  /** scale out optimizers, url:/optimizerGroups/{optimizerGroup}/optimizers. 
*/
-  public void scaleOutOptimizer(Context ctx) {
-    String optimizerGroup = ctx.pathParam("optimizerGroup");
-    Map<String, Integer> map = ctx.bodyAsClass(Map.class);
-    int parallelism = map.get("parallelism");
-
+  /** scale out optimizers, url:/optimizers. */
+  public void createOptimizer(Context ctx) {
+    Map<String, Object> map = ctx.bodyAsClass(Map.class);
+    int parallelism = Integer.parseInt(map.get("parallelism").toString());
+    String optimizerGroup = map.get("optimizerGroup").toString();
     ResourceGroup resourceGroup = 
optimizerManager.getResourceGroup(optimizerGroup);
     Resource resource =
         new Resource.Builder(
@@ -195,75 +82,7 @@ public class OptimizerController {
             .build();
     
ResourceContainers.get(resource.getContainerName()).requestResource(resource);
     optimizerManager.createResource(resource);
-    ctx.json(OkResponse.of("success to scaleOut optimizer"));
-  }
-
-  /** get {@link List<OptimizerResourceInfo>} url = /optimize/resourceGroups */
-  public void getResourceGroup(Context ctx) {
-    List<OptimizerResourceInfo> result =
-        optimizerManager.listResourceGroups().stream()
-            .map(
-                group -> {
-                  List<OptimizerInstance> optimizers =
-                      optimizerManager.listOptimizers(group.getName());
-                  OptimizerResourceInfo optimizerResourceInfo = new 
OptimizerResourceInfo();
-                  optimizerResourceInfo.setResourceGroup(
-                      optimizerManager.getResourceGroup(group.getName()));
-                  optimizers.forEach(
-                      optimizer -> {
-                        
optimizerResourceInfo.addOccupationCore(optimizer.getThreadCount());
-                        
optimizerResourceInfo.addOccupationMemory(optimizer.getMemoryMb());
-                      });
-                  return optimizerResourceInfo;
-                })
-            .collect(Collectors.toList());
-    ctx.json(OkResponse.of(result));
-  }
-
-  /**
-   * create optimizeGroup: name, container, schedulePolicy, properties url =
-   * /optimize/resourceGroups/create
-   */
-  public void createResourceGroup(Context ctx) {
-    Map<String, Object> map = ctx.bodyAsClass(Map.class);
-    String name = (String) map.get("name");
-    String container = (String) map.get("container");
-    Map<String, String> properties = (Map) map.get("properties");
-    if (optimizerManager.getResourceGroup(name) != null) {
-      throw new BadRequestException(String.format("Optimizer group:%s already 
existed.", name));
-    }
-    ResourceGroup.Builder builder = new ResourceGroup.Builder(name, container);
-    builder.addProperties(properties);
-    optimizerManager.createResourceGroup(builder.build());
-    ctx.json(OkResponse.of("The optimizer group has been successfully 
created."));
-  }
-
-  /**
-   * update optimizeGroup: name, container, schedulePolicy, properties url =
-   * /optimize/resourceGroups/update
-   */
-  public void updateResourceGroup(Context ctx) {
-    Map<String, Object> map = ctx.bodyAsClass(Map.class);
-    String name = (String) map.get("name");
-    String container = (String) map.get("container");
-    Map<String, String> properties = (Map) map.get("properties");
-    ResourceGroup.Builder builder = new ResourceGroup.Builder(name, container);
-    builder.addProperties(properties);
-    optimizerManager.updateResourceGroup(builder.build());
-    ctx.json(OkResponse.of("The optimizer group has been successfully 
updated."));
-  }
-
-  /** delete optimizeGroup url = /optimize/resourceGroups/{resourceGroupName} 
*/
-  public void deleteResourceGroup(Context ctx) {
-    String name = ctx.pathParam("resourceGroupName");
-    optimizerManager.deleteResourceGroup(name);
-    ctx.json(OkResponse.of("The optimizer group has been successfully 
deleted."));
-  }
-
-  /** check if optimizerGroup can be deleted url = 
/optimize/resourceGroups/delete/check */
-  public void deleteCheckResourceGroup(Context ctx) {
-    String name = ctx.pathParam("resourceGroupName");
-    ctx.json(OkResponse.of(optimizerManager.canDeleteResourceGroup(name)));
+    ctx.json(OkResponse.of("success to create optimizer"));
   }
 
   /** check if optimizerGroup can be deleted url = /optimize/containers/get */
diff --git 
a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerController.java
 
b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerGroupController.java
similarity index 98%
copy from 
amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerController.java
copy to 
amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerGroupController.java
index c5770be20..8d8ac3fc7 100644
--- 
a/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerController.java
+++ 
b/amoro-ams/src/main/java/org/apache/amoro/server/dashboard/controller/OptimizerGroupController.java
@@ -47,12 +47,13 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 /** The controller that handles optimizer requests. */
-public class OptimizerController {
+public class OptimizerGroupController {
   private static final String ALL_GROUP = "all";
   private final TableService tableService;
   private final DefaultOptimizingService optimizerManager;
 
-  public OptimizerController(TableService tableService, 
DefaultOptimizingService optimizerManager) {
+  public OptimizerGroupController(
+      TableService tableService, DefaultOptimizingService optimizerManager) {
     this.tableService = tableService;
     this.optimizerManager = optimizerManager;
   }
diff --git a/amoro-web/src/language/en.ts b/amoro-web/src/language/en.ts
index d78bbc6e6..7a8deeabc 100644
--- a/amoro-web/src/language/en.ts
+++ b/amoro-web/src/language/en.ts
@@ -194,6 +194,7 @@ export default {
   search: 'Search',
   reset: 'Reset',
   invalidInput: 'Invalid input',
+  createOptimizer: 'Create Optimizer',
   addgroup: 'Add Group',
   editgroup: 'Edit Group',
   cannotDeleteGroupModalTitle: 'Can\'t remove this group.',
diff --git a/amoro-web/src/language/zh.ts b/amoro-web/src/language/zh.ts
index 036420b78..a794732c5 100644
--- a/amoro-web/src/language/zh.ts
+++ b/amoro-web/src/language/zh.ts
@@ -194,6 +194,7 @@ export default {
   search: '搜索',
   reset: '重置',
   invalidInput: '非法输入',
+  createOptimizer: '创建优化器',
   addgroup: '添加组',
   editgroup: '编辑组',
   cannotDeleteGroupModalTitle: '不能移除这个组',
diff --git a/amoro-web/src/services/optimize.service.ts 
b/amoro-web/src/services/optimize.service.ts
index 75846dc01..cd1c36807 100644
--- a/amoro-web/src/services/optimize.service.ts
+++ b/amoro-web/src/services/optimize.service.ts
@@ -62,14 +62,24 @@ export function scaleoutResource(
   return 
request.post(`ams/v1/optimize/optimizerGroups/${optimizerGroup}/optimizers`, { 
parallelism })
 }
 
+export function createOptimizerResource(
+    params: {
+        optimizerGroup: string
+        parallelism: number
+    },
+) {
+    const { optimizerGroup, parallelism } = params
+    return request.post(`ams/v1/optimize/optimizers`, { optimizerGroup, 
parallelism })
+}
+
 export function releaseResource(
   params: {
     optimizerGroup: string
     jobId: string
   },
 ) {
-  const { optimizerGroup, jobId } = params
-  return 
request.delete(`ams/v1/optimize/optimizerGroups/${optimizerGroup}/optimizers/${jobId}`)
+  const { jobId } = params
+  return request.delete(`ams/v1/optimize/optimizers/${jobId}`)
 }
 
 export async function getResourceGroupsListAPI() {
diff --git a/amoro-web/src/views/resource/components/CreateOptimizerModal.vue 
b/amoro-web/src/views/resource/components/CreateOptimizerModal.vue
new file mode 100644
index 000000000..be668be9b
--- /dev/null
+++ b/amoro-web/src/views/resource/components/CreateOptimizerModal.vue
@@ -0,0 +1,126 @@
+
+<!--
+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.
+/-->
+
+<script lang="ts" setup>
+import { onMounted, reactive, ref } from 'vue'
+import { Modal as AModal } from 'ant-design-vue'
+import { usePlaceholder } from '@/hooks/usePlaceholder'
+import { createOptimizerResource, getOptimizerGroups } from 
'@/services/optimize.service'
+
+interface FormState {
+  resourceGroup: string
+  parallelism: number
+}
+
+const emit = defineEmits<{ (e: 'cancel'): void; (e: 'refresh'): void }>()
+
+const confirmLoading = ref<boolean>(false)
+const placeholder = reactive(usePlaceholder())
+const formRef = ref()
+const formState: FormState = reactive({
+  resourceGroup: '',
+  parallelism: 1,
+})
+
+const resourceGroupOptions = ref<{ label: string, value: string }[]>([])
+
+async function loadResourceGroups() {
+  try {
+    const response = await getOptimizerGroups()
+    resourceGroupOptions.value = response.map((group: any) => ({
+      label: group.optimizerGroupName,
+      value: group.optimizerGroupName,
+    }))
+    console.log('Parsed resourceGroupOptions:', resourceGroupOptions.value)
+  } catch (error) {
+    console.error('Failed to load resource groups:', error)
+  }
+}
+
+function handleOk() {
+  formRef.value
+      .validateFields()
+      .then(async () => {
+        confirmLoading.value = true
+        await createOptimizerResource({
+          optimizerGroup: formState.resourceGroup || '',
+          parallelism: Number(formState.parallelism),
+        })
+        formRef.value.resetFields()
+        emit('cancel')
+        emit('refresh')
+        confirmLoading.value = false
+      })
+      .catch(() => {
+        confirmLoading.value = false
+      })
+}
+
+function handleCancel() {
+  formRef.value.resetFields()
+  emit('cancel')
+}
+
+onMounted(() => {
+  loadResourceGroups()
+})
+</script>
+
+<template>
+  <AModal
+      :open="true"
+      :title="$t('createOptimizer')"
+      :confirm-loading="confirmLoading"
+      :closable="false"
+      @ok="handleOk"
+      @cancel="handleCancel"
+  >
+    <a-form ref="formRef" :model="formState" class="label-120">
+      <a-form-item
+          name="resourceGroup"
+          :label="$t('resourceGroup')"
+          :rules="[{ required: true, message: `${placeholder.resourceGroupPh}` 
}]"
+      >
+        <a-select
+            v-model:value="formState.resourceGroup"
+            :placeholder="placeholder.resourceGroupPh"
+        >
+          <a-select-option
+              v-for="option in resourceGroupOptions"
+              :key="option.value"
+              :value="option.value"
+          >
+            {{ option.label }}
+          </a-select-option>
+        </a-select>
+      </a-form-item>
+      <a-form-item
+          name="parallelism"
+          :label="$t('parallelism')"
+          :rules="[{ required: true, message: `${placeholder.parallelismPh}` 
}]"
+      >
+        <a-input
+            v-model:value="formState.parallelism"
+            type="number"
+            :placeholder="placeholder.parallelismPh"
+        />
+      </a-form-item>
+    </a-form>
+  </AModal>
+</template>
\ No newline at end of file
diff --git a/amoro-web/src/views/resource/components/List.vue 
b/amoro-web/src/views/resource/components/List.vue
index 6e9a206b3..3693d9711 100644
--- a/amoro-web/src/views/resource/components/List.vue
+++ b/amoro-web/src/views/resource/components/List.vue
@@ -25,8 +25,6 @@ import { getOptimizerResourceList, getResourceGroupsListAPI, 
groupDeleteAPI, gro
 import { usePagination } from '@/hooks/usePagination'
 import { dateFormat, mbToSize } from '@/utils'
 
-import ScaleOut from '@/views/resource/components/ScaleOut.vue'
-
 const props = defineProps<{ curGroupName?: string, type: string }>()
 
 const emit = defineEmits<{
@@ -249,12 +247,6 @@ onMounted(() => {
           </span>
         </template>
         <template v-if="column.dataIndex === 'operationGroup'">
-          <span
-            class="primary-link g-mr-12" :class="{ disabled: record.container 
=== 'external' }"
-            @click="scaleOutGroup(record)"
-          >
-            {{ t('scaleOut') }}
-          </span>
           <span class="primary-link g-mr-12" @click="editGroup(record)">
             {{ t('edit') }}
           </span>
@@ -265,7 +257,6 @@ onMounted(() => {
       </template>
     </a-table>
   </div>
-  <ScaleOut v-if="scaleOutVisible" :group-record="groupRecord" 
@cancel="scaleOutVisible = false" @refresh="refresh" />
   <u-loading v-if="releaseLoading" />
 </template>
 
diff --git a/amoro-web/src/views/resource/index.vue 
b/amoro-web/src/views/resource/index.vue
index 20b2858fc..24f6c80d5 100644
--- a/amoro-web/src/views/resource/index.vue
+++ b/amoro-web/src/views/resource/index.vue
@@ -24,6 +24,7 @@ import {
   shallowReactive,
   toRefs,
   watch,
+  ref,
 } from 'vue'
 import { useI18n } from 'vue-i18n'
 import { useRoute, useRouter } from 'vue-router'
@@ -33,6 +34,7 @@ import { usePlaceholder } from '@/hooks/usePlaceholder'
 import { usePagination } from '@/hooks/usePagination'
 import type { IIOptimizeGroupItem, ILableAndValue } from '@/types/common.type'
 import GroupModal from '@/views/resource/components/GroupModal.vue'
+import CreateOptimizerModal from 
'@/views/resource/components/CreateOptimizerModal.vue'
 
 export default defineComponent({
   name: 'Resource',
@@ -40,6 +42,7 @@ export default defineComponent({
     List,
     GroupModal,
     TableList,
+    CreateOptimizerModal,
   },
   setup() {
     const { t } = useI18n()
@@ -69,6 +72,9 @@ export default defineComponent({
       },
       groupKeyCount: 1,
       showTab: false as boolean,
+      showCreateOptimizer: false as boolean,
+      optimizerEdit: false,
+      optimizerEditRecord: null,
     })
 
     watch(
@@ -92,6 +98,16 @@ export default defineComponent({
       state.showGroupModal = true
     }
 
+    const createOptimizer = (editRecord: any | null) => {
+      if (editRecord) {
+        state.optimizerEdit = true
+        state.optimizerEditRecord = { ...editRecord }
+      } else {
+        state.optimizerEdit = false
+      }
+      state.showCreateOptimizer = true
+    }
+
     const onChangeTab = (key: string) => {
       const query = { ...route.query }
       query.tab = key
@@ -102,6 +118,7 @@ export default defineComponent({
       state.showTab = true
     })
 
+    let createOptimizer1 = createOptimizer;
     return {
       placeholder,
       pagination,
@@ -109,6 +126,7 @@ export default defineComponent({
       tabConfig,
       onChangeTab,
       editGroup,
+      createOptimizer,
       t,
     }
   },
@@ -136,6 +154,9 @@ export default defineComponent({
             :tab="t('optimizers')"
             :class="[activeTab === 'optimizers' ? 'active' : '']"
           >
+            <a-button type="primary" class="g-mb-16" 
@click="createOptimizer(null)">
+              {{ t("createOptimizer") }}
+            </a-button>
             <List type="optimizers" />
           </a-tab-pane>
           <a-tab-pane
@@ -165,6 +186,11 @@ export default defineComponent({
         showGroupModal = false;
       "
     />
+    <CreateOptimizerModal
+        v-if="showCreateOptimizer"
+        @cancel="showCreateOptimizer = false"
+        @refresh="showCreateOptimizer = false"
+    />
   </div>
 </template>
 

Reply via email to