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

min pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo-ops.git


The following commit(s) were added to refs/heads/develop by this push:
     new c48f1da  LoadBalance page
c48f1da is described below

commit c48f1da9cea63f8a4a1240dd3eea3400ba8b4959
Author: nzomkxia <[email protected]>
AuthorDate: Thu Sep 20 13:40:42 2018 +0800

    LoadBalance page
---
 .../admin/controller/LoadBalanceController.java    | 115 +++++++
 .../web/mvc/governance/LoadbalancesController.java | 378 ++++++++++-----------
 .../src/components/LoadBalance.vue                 | 320 ++++++++++++++++-
 3 files changed, 619 insertions(+), 194 deletions(-)

diff --git 
a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/LoadBalanceController.java
 
b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/LoadBalanceController.java
new file mode 100644
index 0000000..2993c85
--- /dev/null
+++ 
b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/LoadBalanceController.java
@@ -0,0 +1,115 @@
+/*
+ * 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
+ *  he 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 org.apache.dubbo.admin.controller;
+
+import org.apache.dubbo.admin.governance.service.OverrideService;
+import org.apache.dubbo.admin.registry.common.domain.LoadBalance;
+import org.apache.dubbo.admin.registry.common.domain.Override;
+import org.apache.dubbo.admin.registry.common.util.OverrideUtils;
+import org.apache.dubbo.admin.util.YamlUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/balancing")
+public class LoadBalanceController {
+
+    @Autowired
+    private OverrideService overrideService;
+
+    @RequestMapping("/create")
+    public boolean createLoadbalance(@RequestParam String serviceName, 
@RequestParam String rule) {
+        if (serviceName == null || serviceName.length() == 0) {
+            //TODO throw exception
+        }
+
+        Map<String, Object> result = YamlUtil.loadString(rule);
+        LoadBalance loadBalance = generateLoadbalance(result);
+        loadBalance.setService(serviceName);
+        
overrideService.saveOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
+        return true;
+    }
+
+    @RequestMapping("/update")
+    public boolean updateLoadbalance(@RequestParam Long id, @RequestParam 
String rule) {
+        Override override = overrideService.findById(id);
+        if (override == null) {
+            //TODO throw exception
+        }
+        LoadBalance old = OverrideUtils.overrideToLoadBalance(override);
+        Map<String, Object> result = YamlUtil.loadString(rule);
+        LoadBalance loadBalance = generateLoadbalance(result);
+        loadBalance.setService(old.getService());
+        loadBalance.setId(old.getId());
+        
overrideService.updateOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
+        return true;
+    }
+
+    @RequestMapping("/all")
+    public List<LoadBalance> allLoadbalances(@RequestParam String serviceName) 
{
+        if (serviceName == null || serviceName.length() == 0) {
+           //TODO throw Exception
+        }
+        List<Override> overrides = overrideService.findByService(serviceName);
+        List<LoadBalance> loadBalances = new ArrayList<>();
+        if (overrides != null) {
+            for (Override override : overrides) {
+                LoadBalance l = OverrideUtils.overrideToLoadBalance(override);
+                if (l != null) {
+                    loadBalances.add(l);
+                }
+            }
+        }
+        return loadBalances;
+    }
+
+    @RequestMapping("/detail")
+    public LoadBalance detail(@RequestParam Long id) {
+        Override override =  overrideService.findById(id);
+        if (override == null) {
+            //TODO throw exception
+        }
+        return OverrideUtils.overrideToLoadBalance(override);
+    }
+
+    @RequestMapping("/delete")
+    public boolean delete(@RequestParam Long id) {
+        overrideService.deleteOverride(id);
+        return true;
+    }
+
+    private LoadBalance generateLoadbalance(Map<String, Object> yaml) {
+        LoadBalance loadBalance = new LoadBalance();
+        String methodName;
+        if (yaml.get("methodName").equals(0)) {
+            methodName = "*";
+        } else {
+            methodName = (String)yaml.get("methodName");
+        }
+        String strategy = (String)yaml.get("strategy");
+        loadBalance.setMethod(methodName);
+        loadBalance.setStrategy(strategy);
+        return loadBalance;
+    }
+}
diff --git 
a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/web/mvc/governance/LoadbalancesController.java
 
b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/web/mvc/governance/LoadbalancesController.java
index 96771c8..fe2bda8 100644
--- 
a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/web/mvc/governance/LoadbalancesController.java
+++ 
b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/web/mvc/governance/LoadbalancesController.java
@@ -1,189 +1,189 @@
-/*
- * 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 org.apache.dubbo.admin.web.mvc.governance;
-
-import com.alibaba.dubbo.common.utils.CollectionUtils;
-import org.apache.dubbo.admin.governance.service.OverrideService;
-import org.apache.dubbo.admin.governance.service.ProviderService;
-import org.apache.dubbo.admin.registry.common.domain.LoadBalance;
-import org.apache.dubbo.admin.registry.common.domain.Provider;
-import org.apache.dubbo.admin.registry.common.util.OverrideUtils;
-import org.apache.dubbo.admin.web.mvc.BaseController;
-import org.apache.dubbo.admin.web.pulltool.Tool;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.support.BindingAwareModelMap;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * ProvidersController.
- * URI: /services/$service/loadbalances
- *
- */
-@Controller
-@RequestMapping("/governance/loadbalances")
-public class LoadbalancesController extends BaseController {
-
-    @Autowired
-    private OverrideService overrideService;
-
-    @Autowired
-    private ProviderService providerService;
-
-    @RequestMapping("")
-    public String index(HttpServletRequest request, HttpServletResponse 
response, Model model) {
-        prepare(request, response, model, "index", "loadbalances");
-        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
-        String service = (String)newModel.get("service");
-        service = StringUtils.trimToNull(service);
-
-        List<LoadBalance> loadbalances;
-        if (service != null && service.length() > 0) {
-            loadbalances = 
OverrideUtils.overridesToLoadBalances(overrideService.findByService(service));
-        } else {
-            loadbalances = 
OverrideUtils.overridesToLoadBalances(overrideService.findAll());
-        }
-        model.addAttribute("loadbalances", loadbalances);
-        return "governance/screen/loadbalances/index";
-    }
-
-    @RequestMapping("/detail")
-    public String show(@RequestParam("id") Long id, HttpServletRequest 
request, HttpServletResponse response, Model model) {
-        prepare(request, response, model, "show", "loadbalances");
-        LoadBalance loadbalance = 
OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
-        model.addAttribute("loadbalance", loadbalance);
-        return "governance/screen/loadbalances/show";
-    }
-
-    @RequestMapping("/add")
-    public String add(HttpServletRequest request, HttpServletResponse 
response, Model model) {
-        prepare(request, response, model, "add", "loadbalances");
-        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
-        String service = (String)newModel.get("service");
-
-        if (service != null && service.length() > 0 && !service.contains("*")) 
{
-            List<Provider> providerList = 
providerService.findByService(service);
-            List<String> addressList = new ArrayList<String>();
-            for (Provider provider : providerList) {
-                
addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
-            }
-            model.addAttribute("addressList", addressList);
-            model.addAttribute("service", service);
-            model.addAttribute("methods", 
CollectionUtils.sort(providerService.findMethodsByService(service)));
-        } else {
-            List<String> serviceList = 
Tool.sortSimpleName(providerService.findServices());
-            model.addAttribute("serviceList", serviceList);
-        }
-        //if (input != null) model.addAttribute("input", input);
-        return "governance/screen/loadbalances/add";
-    }
-
-    @RequestMapping("/edit")
-    public String edit(@RequestParam("id") Long id, HttpServletRequest 
request, HttpServletResponse response, Model model) {
-        prepare(request, response, model, "edit", "loadbalances");
-        String service = request.getParameter("service");
-        String input = request.getParameter("input");
-
-        if (service != null && service.length() > 0 && !service.contains("*")) 
{
-            List<Provider> providerList = 
providerService.findByService(service);
-            List<String> addressList = new ArrayList<String>();
-            for (Provider provider : providerList) {
-                
addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
-            }
-            model.addAttribute("addressList", addressList);
-            model.addAttribute("service", service);
-            model.addAttribute("methods", 
CollectionUtils.sort(providerService.findMethodsByService(service)));
-        } else {
-            List<String> serviceList = 
Tool.sortSimpleName(providerService.findServices());
-            model.addAttribute("serviceList", serviceList);
-        }
-        if (input != null) model.addAttribute("input", input);
-        LoadBalance loadbalance = 
OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
-        model.addAttribute("loadbalance", loadbalance);
-        return "governance/screen/loadbalances/edit";
-    }
-
-    @RequestMapping("/create")
-    public String create(LoadBalance loadBalance, HttpServletRequest request, 
HttpServletResponse response, Model model) {
-        prepare(request, response, model, "create", "loadbalances");
-        boolean success = true;
-        if (!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
-            model.addAttribute("message", getMessage("HaveNoServicePrivilege", 
loadBalance.getService()));
-            success = false;
-        } else {
-            loadBalance.setUsername((String) 
((BindingAwareModelMap)model).get("operator"));
-            
overrideService.saveOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
-        }
-        model.addAttribute("success", success);
-        model.addAttribute("redirect", "../loadbalances");
-        return "governance/screen/redirect";
-    }
-
-
-    @RequestMapping("/update")
-    public String update(LoadBalance loadBalance, HttpServletRequest request, 
HttpServletResponse response, Model model) {
-        prepare(request, response, model, "update", "loadbalances");
-        boolean success = true;
-        if (!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
-            model.addAttribute("message", getMessage("HaveNoServicePrivilege", 
loadBalance.getService()));
-            success = false;
-        } else {
-            
overrideService.updateOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
-        }
-        model.addAttribute("success", success);
-        model.addAttribute("redirect", "../loadbalances");
-        return "governance/screen/redirect";
-
-    }
-
-    /**
-     *
-     * @param ids
-     * @return
-     */
-    @RequestMapping("/delete")
-    public String delete(@RequestParam("ids") Long[] ids, HttpServletRequest 
request, HttpServletResponse response, Model model) {
-        prepare(request, response, model, "delete", "loadbalances");
-        boolean success = true;
-        for (Long id : ids) {
-            LoadBalance lb = 
OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
-            if (!super.currentUser.hasServicePrivilege(lb.getService())) {
-                model.addAttribute("message", 
getMessage("HaveNoServicePrivilege", lb.getService()));
-                success = false;
-                model.addAttribute("success", success);
-                model.addAttribute("redirect", "../../loadbalances");
-                return "governance/screen/redirect";
-            }
-        }
-
-        for (Long id : ids) {
-            overrideService.deleteOverride(id);
-        }
-        model.addAttribute("success", success);
-        model.addAttribute("redirect", "../../loadbalances");
-        return "governance/screen/redirect";
-    }
-
-}
+///*
+// * 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 org.apache.dubbo.admin.web.mvc.governance;
+//
+//import com.alibaba.dubbo.common.utils.CollectionUtils;
+//import org.apache.dubbo.admin.governance.service.OverrideService;
+//import org.apache.dubbo.admin.governance.service.ProviderService;
+//import org.apache.dubbo.admin.registry.common.domain.LoadBalance;
+//import org.apache.dubbo.admin.registry.common.domain.Provider;
+//import org.apache.dubbo.admin.registry.common.util.OverrideUtils;
+//import org.apache.dubbo.admin.web.mvc.BaseController;
+//import org.apache.dubbo.admin.web.pulltool.Tool;
+//import org.apache.commons.lang3.StringUtils;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Controller;
+//import org.springframework.ui.Model;
+//import org.springframework.validation.support.BindingAwareModelMap;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RequestParam;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import javax.servlet.http.HttpServletResponse;
+//import java.util.ArrayList;
+//import java.util.List;
+//
+///**
+// * ProvidersController.
+// * URI: /services/$service/loadbalances
+// *
+// */
+//@Controller
+//@RequestMapping("/governance/loadbalances")
+//public class LoadbalancesController extends BaseController {
+//
+//    @Autowired
+//    private OverrideService overrideService;
+//
+//    @Autowired
+//    private ProviderService providerService;
+//
+//    @RequestMapping("")
+//    public String index(HttpServletRequest request, HttpServletResponse 
response, Model model) {
+//        prepare(request, response, model, "index", "loadbalances");
+//        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+//        String service = (String)newModel.get("service");
+//        service = StringUtils.trimToNull(service);
+//
+//        List<LoadBalance> loadbalances;
+//        if (service != null && service.length() > 0) {
+//            loadbalances = 
OverrideUtils.overridesToLoadBalances(overrideService.findByService(service));
+//        } else {
+//            loadbalances = 
OverrideUtils.overridesToLoadBalances(overrideService.findAll());
+//        }
+//        model.addAttribute("loadbalances", loadbalances);
+//        return "governance/screen/loadbalances/index";
+//    }
+//
+//    @RequestMapping("/detail")
+//    public String show(@RequestParam("id") Long id, HttpServletRequest 
request, HttpServletResponse response, Model model) {
+//        prepare(request, response, model, "show", "loadbalances");
+//        LoadBalance loadbalance = 
OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
+//        model.addAttribute("loadbalance", loadbalance);
+//        return "governance/screen/loadbalances/show";
+//    }
+//
+//    @RequestMapping("/add")
+//    public String add(HttpServletRequest request, HttpServletResponse 
response, Model model) {
+//        prepare(request, response, model, "add", "loadbalances");
+//        BindingAwareModelMap newModel = (BindingAwareModelMap)model;
+//        String service = (String)newModel.get("service");
+//
+//        if (service != null && service.length() > 0 && 
!service.contains("*")) {
+//            List<Provider> providerList = 
providerService.findByService(service);
+//            List<String> addressList = new ArrayList<String>();
+//            for (Provider provider : providerList) {
+//                
addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
+//            }
+//            model.addAttribute("addressList", addressList);
+//            model.addAttribute("service", service);
+//            model.addAttribute("methods", 
CollectionUtils.sort(providerService.findMethodsByService(service)));
+//        } else {
+//            List<String> serviceList = 
Tool.sortSimpleName(providerService.findServices());
+//            model.addAttribute("serviceList", serviceList);
+//        }
+//        //if (input != null) model.addAttribute("input", input);
+//        return "governance/screen/loadbalances/add";
+//    }
+//
+//    @RequestMapping("/edit")
+//    public String edit(@RequestParam("id") Long id, HttpServletRequest 
request, HttpServletResponse response, Model model) {
+//        prepare(request, response, model, "edit", "loadbalances");
+//        String service = request.getParameter("service");
+//        String input = request.getParameter("input");
+//
+//        if (service != null && service.length() > 0 && 
!service.contains("*")) {
+//            List<Provider> providerList = 
providerService.findByService(service);
+//            List<String> addressList = new ArrayList<String>();
+//            for (Provider provider : providerList) {
+//                
addressList.add(provider.getUrl().split("://")[1].split("/")[0]);
+//            }
+//            model.addAttribute("addressList", addressList);
+//            model.addAttribute("service", service);
+//            model.addAttribute("methods", 
CollectionUtils.sort(providerService.findMethodsByService(service)));
+//        } else {
+//            List<String> serviceList = 
Tool.sortSimpleName(providerService.findServices());
+//            model.addAttribute("serviceList", serviceList);
+//        }
+//        if (input != null) model.addAttribute("input", input);
+//        LoadBalance loadbalance = 
OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
+//        model.addAttribute("loadbalance", loadbalance);
+//        return "governance/screen/loadbalances/edit";
+//    }
+//
+//    @RequestMapping("/create")
+//    public String create(LoadBalance loadBalance, HttpServletRequest 
request, HttpServletResponse response, Model model) {
+//        prepare(request, response, model, "create", "loadbalances");
+//        boolean success = true;
+//        if 
(!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
+//            model.addAttribute("message", 
getMessage("HaveNoServicePrivilege", loadBalance.getService()));
+//            success = false;
+//        } else {
+//            loadBalance.setUsername((String) 
((BindingAwareModelMap)model).get("operator"));
+//            
overrideService.saveOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
+//        }
+//        model.addAttribute("success", success);
+//        model.addAttribute("redirect", "../loadbalances");
+//        return "governance/screen/redirect";
+//    }
+//
+//
+//    @RequestMapping("/update")
+//    public String update(LoadBalance loadBalance, HttpServletRequest 
request, HttpServletResponse response, Model model) {
+//        prepare(request, response, model, "update", "loadbalances");
+//        boolean success = true;
+//        if 
(!super.currentUser.hasServicePrivilege(loadBalance.getService())) {
+//            model.addAttribute("message", 
getMessage("HaveNoServicePrivilege", loadBalance.getService()));
+//            success = false;
+//        } else {
+//            
overrideService.updateOverride(OverrideUtils.loadBalanceToOverride(loadBalance));
+//        }
+//        model.addAttribute("success", success);
+//        model.addAttribute("redirect", "../loadbalances");
+//        return "governance/screen/redirect";
+//
+//    }
+//
+//    /**
+//     *
+//     * @param ids
+//     * @return
+//     */
+//    @RequestMapping("/delete")
+//    public String delete(@RequestParam("ids") Long[] ids, HttpServletRequest 
request, HttpServletResponse response, Model model) {
+//        prepare(request, response, model, "delete", "loadbalances");
+//        boolean success = true;
+//        for (Long id : ids) {
+//            LoadBalance lb = 
OverrideUtils.overrideToLoadBalance(overrideService.findById(id));
+//            if (!super.currentUser.hasServicePrivilege(lb.getService())) {
+//                model.addAttribute("message", 
getMessage("HaveNoServicePrivilege", lb.getService()));
+//                success = false;
+//                model.addAttribute("success", success);
+//                model.addAttribute("redirect", "../../loadbalances");
+//                return "governance/screen/redirect";
+//            }
+//        }
+//
+//        for (Long id : ids) {
+//            overrideService.deleteOverride(id);
+//        }
+//        model.addAttribute("success", success);
+//        model.addAttribute("redirect", "../../loadbalances");
+//        return "governance/screen/redirect";
+//    }
+//
+//}
diff --git a/dubbo-admin-frontend/src/components/LoadBalance.vue 
b/dubbo-admin-frontend/src/components/LoadBalance.vue
index 61d4aba..6c84ef8 100644
--- a/dubbo-admin-frontend/src/components/LoadBalance.vue
+++ b/dubbo-admin-frontend/src/components/LoadBalance.vue
@@ -1,15 +1,325 @@
+<!--
+  - 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
+  -  he 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.
+  -->
+
 <template>
-  <v-container fluid>
+  <v-container grid-list-xl fluid >
     <v-layout row wrap>
-      <v-flex xs12 class="text-xs-center" mt-5>
-        <h1>Load Balance</h1>
+      <v-flex xs12 >
+        <v-card flat color="transparent">
+          <v-card-text>
+            <v-layout row wrap >
+              <v-text-field label="Search dubbo service"
+                            v-model="filter" clearable></v-text-field>
+              <v-btn @click="submit" color="primary" large>Search</v-btn>
+            </v-layout>
+          </v-card-text>
+        </v-card>
       </v-flex>
     </v-layout>
 
+    <v-flex lg12>
+      <v-card>
+        <v-toolbar flat color="transparent" class="elevation-0">
+          <v-toolbar-title><span class="headline">Search 
Result</span></v-toolbar-title>
+          <v-divider
+            class="mx-2"
+            inset
+            vertical
+          ></v-divider>
+          <v-spacer></v-spacer>
+          <v-btn outline color="primary" @click.stop="openDialog" 
class="mb-2">CREATE</v-btn>
+        </v-toolbar>
+
+        <v-card-text class="pa-0">
+          <v-data-table
+            :headers="headers"
+            :items="loadBalances"
+            hide-actions
+            class="elevation-0"
+          >
+            <template slot="items" slot-scope="props">
+              <td class="text-xs-left">{{ props.item.service }}</td>
+              <td class="text-xs-left">{{ props.item.method }}</td>
+              <td class="justify-center px-0">
+                <v-tooltip bottom v-for="op in operations" :key="op.id">
+                  <v-icon small class="mr-2" slot="activator" 
@click="itemOperation(op.icon(props.item), props.item)">
+                    {{op.icon(props.item)}}
+                  </v-icon>
+                  <span>{{op.tooltip(props.item)}}</span>
+                </v-tooltip>
+              </td>
+            </template>
+          </v-data-table>
+        </v-card-text>
+      </v-card>
+    </v-flex>
+
+    <v-dialog   v-model="dialog" width="800px" persistent >
+      <v-card>
+        <v-card-title class="justify-center">
+          <span class="headline">Create New LoadBalance Rule</span>
+        </v-card-title>
+        <v-card-text >
+          <v-text-field
+            label="Service Unique ID"
+            hint="A service ID is service name"
+            required
+            v-model="service"
+          ></v-text-field>
+          <v-subheader class="pa-0 mt-3">RULE CONTENT</v-subheader>
+          <codemirror ref="myCm"
+                      v-model="ruleText"
+                      :options="cmOption">
+          </codemirror>
+
+        </v-card-text>
+        <v-card-actions>
+          <v-spacer></v-spacer>
+          <v-btn color="blue darken-1" flat 
@click.native="closeDialog">Close</v-btn>
+          <v-btn color="blue darken-1" flat 
@click.native="saveItem">Save</v-btn>
+        </v-card-actions>
+      </v-card>
+    </v-dialog>
+
+    <v-dialog v-model="warn" persistent max-width="500px">
+      <v-card>
+        <v-card-title class="headline">{{this.warnTitle}}</v-card-title>
+        <v-card-text >{{this.warnText}}</v-card-text>
+        <v-card-actions>
+          <v-spacer></v-spacer>
+          <v-btn color="green darken-1" flat 
@click.native="closeWarn">CANCLE</v-btn>
+          <v-btn color="green darken-1" flat 
@click.native="deleteItem(warnStatus)">CONFIRM</v-btn>
+        </v-card-actions>
+      </v-card>
+    </v-dialog>
+
   </v-container>
 
 </template>
-
 <script>
-  export default {}
+  import { codemirror } from 'vue-codemirror'
+  import 'codemirror/lib/codemirror.css'
+  import 'codemirror/theme/paraiso-light.css'
+  import 'codemirror/mode/yaml/yaml.js'
+  import 'codemirror/addon/display/autorefresh.js'
+  import 'codemirror/addon/display/placeholder'
+  import yaml from 'js-yaml'
+  import {AXIOS} from './http-common'
+  export default {
+    components: {
+      codemirror
+    },
+    data: () => ({
+      dropdown_font: [ 'Service', 'App', 'IP' ],
+      ruleKeys: ['method', 'strategy'],
+      pattern: 'Service',
+      filter: '',
+      dialog: false,
+      warn: false,
+      application: '',
+      service: '',
+      warnTitle: '',
+      warnText: '',
+      warnStatus: {},
+      height: 0,
+      operations: [
+        {id: 0,
+          icon: function (item) {
+            return 'visibility'
+          },
+          tooltip: function (item) {
+            return 'View'
+          }},
+        {id: 1,
+          icon: function (item) {
+            return 'edit'
+          },
+          tooltip: function (item) {
+            return 'Edit'
+          }},
+        {id: 3,
+          icon: function (item) {
+            return 'delete'
+          },
+          tooltip: function (item) {
+            return 'Delete'
+          }}
+      ],
+      loadBalances: [
+      ],
+      template:
+        'methodName: sayHello  # 0 for all methods\n' +
+        'strategy:  # leastactive, random, roundrobin',
+      ruleText: '',
+      cmOption: {
+        theme: 'paraiso-light',
+        autoRefresh: true,
+        readOnly: false,
+        mode: 'text/x-yaml',
+        line: true
+      },
+      headers: [
+        {
+          text: 'Service Name',
+          value: 'service',
+          align: 'left'
+        },
+        {
+          text: 'Method',
+          value: 'method',
+          align: 'left'
+
+        },
+        {
+          text: 'Operation',
+          value: 'operation',
+          sortable: false
+        }
+      ]
+    }),
+    methods: {
+      submit: function () {
+        this.search(this.filter, true)
+      },
+      search: function (filter, rewrite) {
+        AXIOS.get('/balancing/all?serviceName=' + filter)
+          .then(response => {
+            this.loadBalances = response.data
+            if (rewrite) {
+              this.$router.push({path: 'loadbalance', query: {serviceName: 
filter}})
+            }
+          })
+      },
+      handleRule: function (route) {
+        let result = {}
+        let conditions = []
+        for (let property in route) {
+          if (this.ruleKeys.includes(property)) {
+            if (property === 'rule') {
+              conditions.push(route[property])
+            } else {
+              result[property] = route[property]
+            }
+          }
+        }
+        if (conditions.length > 0) {
+          result['conditions'] = conditions
+        }
+        return yaml.safeDump(result)
+      },
+      closeDialog: function () {
+        this.ruleText = this.template
+        this.service = ''
+        this.dialog = false
+        this.cmOption.readOnly = false
+      },
+      openDialog: function () {
+        this.dialog = true
+      },
+      openWarn: function (title, text) {
+        this.warnTitle = title
+        this.warnText = text
+        this.warn = true
+      },
+      closeWarn: function () {
+        this.warnTitle = ''
+        this.warnText = ''
+        this.warn = false
+      },
+      saveItem: function () {
+        let text = encodeURIComponent(this.ruleText)  // contains illegal url 
character, need encode
+        AXIOS.get('/balancing/create?serviceName=' + this.service + '&rule=' + 
text)
+          .then(response => {
+            if (response.data) {
+              this.search(this.service, true)
+            }
+          })
+      },
+      itemOperation: function (icon, item) {
+        switch (icon) {
+          case 'visibility':
+            AXIOS.get('/balancing/detail?id=' + item.id)
+              .then(response => {
+                let balancing = response.data
+                let result = this.handleRule(balancing)
+                this.service = balancing.service
+                this.ruleText = result
+                this.cmOption.readOnly = true
+                this.dialog = true
+              })
+            break
+          case 'edit':
+            AXIOS.get('/balancing/edit?id=' + item.id)
+              .then(response => {
+                let loadbalance = response.data
+                let result = this.handleRule(loadbalance)
+                this.service = loadbalance.service
+                this.ruleText = result
+                this.cmOption.readOnly = false
+                this.dialog = true
+              })
+            break
+          case 'delete':
+            this.openWarn(' Are you sure to Delete Routing Rule', 
'serviceName: ' + item.service)
+            this.warnStatus.operation = 'delete'
+            this.warnStatus.id = item.id
+        }
+      },
+      setHeight: function () {
+        this.height = window.innerHeight * 0.5
+      },
+      deleteItem: function (warnStatus) {
+        if (warnStatus.operation === 'delete') {
+          AXIOS.get('/balancing/delete?id=' + warnStatus.id)
+            .then(response => {
+              this.warn = false
+              this.search(this.filter, false)
+            })
+        } else if (warnStatus.operation === 'block') {
+          AXIOS.get('/routes/changeStatus?id=' + warnStatus.id + '&enabled=' + 
warnStatus.enabled)
+            .then(response => {
+              this.warn = false
+              this.search(this.filter, false)
+            })
+        }
+      }
+    },
+    computed: {
+      codemirror () {
+        return this.$refs.myCm.codemirror
+      }
+    },
+    created () {
+      this.setHeight()
+    },
+    mounted: function () {
+      this.ruleText = this.template
+      let query = this.$route.query
+      let service = ''
+      Object.keys(query).forEach(function (key) {
+        if (key === 'serviceName') {
+          service = query[key]
+        }
+      })
+      if (service !== '') {
+        this.filter = service
+        this.search(service, false)
+      }
+    }
+
+  }
 </script>

Reply via email to