You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by mi...@apache.org on 2018/09/28 11:00:17 UTC

[incubator-dubbo-ops] branch develop updated: update dynamic config page

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 7ecb286  update dynamic config page
7ecb286 is described below

commit 7ecb286899114c837ae1eef9643d353770e85af3
Author: nzomkxia <z8...@gmail.com>
AuthorDate: Fri Sep 28 18:59:42 2018 +0800

    update dynamic config page
---
 .../admin/controller/OverridesController.java      | 133 +++++++++++++++++++--
 .../org/apache/dubbo/admin/dto/OverrideDTO.java    |  18 +--
 .../src/components/LoadBalance.vue                 |   2 +-
 dubbo-admin-frontend/src/components/Overrides.vue  | 123 ++++++-------------
 .../src/components/WeightAdjust.vue                |   2 +-
 5 files changed, 170 insertions(+), 108 deletions(-)

diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java
index 610ea27..40b7204 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/controller/OverridesController.java
@@ -17,13 +17,16 @@
 
 package org.apache.dubbo.admin.controller;
 
+import com.alibaba.dubbo.common.URL;
+import com.google.common.collect.Lists;
+import org.apache.dubbo.admin.dto.BaseDTO;
 import org.apache.dubbo.admin.dto.OverrideDTO;
 import org.apache.dubbo.admin.governance.service.OverrideService;
+import org.apache.dubbo.admin.registry.common.domain.Override;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping("/api/override")
@@ -38,29 +41,135 @@ public class OverridesController {
         if (serviceName == null || serviceName.length() == 0) {
             //TODO throw exception
         }
-//        String[] mock =
-
-        return false;
+        Override override = new Override();
+        override.setService(serviceName);
+        override.setApplication(overrideDTO.getApp());
+        override.setAddress(overrideDTO.getAddress());
+        override.setEnabled(overrideDTO.isEnabled());
+        overrideDTOToParams(override, overrideDTO);
+        overrideService.saveOverride(override);
+        return true;
     }
 
     @RequestMapping(value = "/update", method = RequestMethod.POST)
     public boolean updateOverride(@RequestBody OverrideDTO overrideDTO) {
-        return false;
+        Long id = overrideDTO.getId();
+        Override old = overrideService.findById(id);
+        Override override = new Override();
+        override.setService(overrideDTO.getService());
+        override.setApplication(overrideDTO.getApp());
+        override.setAddress(overrideDTO.getAddress());
+        override.setEnabled(overrideDTO.isEnabled());
+        overrideDTOToParams(override, overrideDTO);
+        override.setId(id);
+        overrideService.updateOverride(override);
+        return true;
     }
 
-    @RequestMapping(value = "/search", method = RequestMethod.POST)
-    public List<OverrideDTO> allOverride(@RequestBody Map<String, String> params) {
-        return null;
+    @RequestMapping(value = "/search", method = RequestMethod.GET)
+    public List<OverrideDTO> allOverride(@RequestParam String serviceName) {
+        List<Override> overrides = overrideService.findByService(serviceName);
+        List<OverrideDTO> result = new ArrayList<>();
+        for (Override override : overrides) {
+            OverrideDTO overrideDTO = new OverrideDTO();
+            overrideDTO.setAddress(override.getAddress());
+            overrideDTO.setApp(override.getApplication());
+            overrideDTO.setEnabled(override.isEnabled());
+            overrideDTO.setService(override.getService());
+            overrideDTO.setId(override.getId());
+            paramsToOverrideDTO(override, overrideDTO);
+            result.add(overrideDTO);
+        }
+        return result;
     }
 
     @RequestMapping("/detail")
     public OverrideDTO detail(@RequestParam Long id) {
-       return null;
+        Override override = overrideService.findById(id);
+        if (override == null) {
+            //TODO throw exception
+        }
+        OverrideDTO overrideDTO = new OverrideDTO();
+        overrideDTO.setAddress(override.getAddress());
+        overrideDTO.setApp(override.getApplication());
+        overrideDTO.setEnabled(override.isEnabled());
+        overrideDTO.setService(override.getService());
+        paramsToOverrideDTO(override, overrideDTO);
+        return overrideDTO;
     }
 
     @RequestMapping(value  = "/delete", method = RequestMethod.POST)
-    public boolean delete(@RequestBody Map<String, Long> params) {
-       return false;
+    public boolean delete(@RequestBody BaseDTO baseDTO) {
+        Long id = baseDTO.getId();
+        overrideService.deleteOverride(id);
+        return true;
+    }
+
+    private void overrideDTOToParams(Override override, OverrideDTO overrideDTO) {
+        Map<Object, String>[] mocks = overrideDTO.getMock();
+        Map<String, Object>[] parameters = overrideDTO.getParameters();
+        StringBuilder params = new StringBuilder();
+        if (mocks != null) {
+            for (Map<Object, String> mock : mocks) {
+                for (Map.Entry<Object, String> entry : mock.entrySet()) {
+                    String key;
+                    if (entry.getKey().equals("0")) {
+                        key = "mock";
+                    } else {
+                        key = entry.getKey() + ".mock";
+                    }
+                    String value = key + "=" + URL.encode(entry.getValue());
+                    params.append(value).append("&");
+                }
+            }
+        }
+
+        if (parameters != null) {
+            for (Map<String, Object> param : parameters) {
+                for (Map.Entry<String, Object> entry : param.entrySet()) {
+                    String value = entry.getKey() + "=" + entry.getValue();
+                    params.append(value).append("&");
+                }
+            }
+        }
+        int length = params.length();
+        if (params.charAt(length - 1) == '&') {
+            params.deleteCharAt(length - 1);
+        }
+        override.setParams(params.toString());
+    }
+
+    private void paramsToOverrideDTO(Override override, OverrideDTO overrideDTO) {
+        String params = override.getParams();
+        List<Map<Object, String>> mock = new ArrayList<>();
+        List<Map<String, Object>> parameters = new ArrayList<>();
+        String[] pair = params.split("&");
+        for (String p : pair) {
+            String key = p.split("=")[0];
+            if (key.contains("mock")) {
+                //mock
+                String value = URL.decode(p.split("=")[1]);
+                Map<Object, String> item = new HashMap<>();
+                if (key.contains(".")) {
+                    //single method mock
+                    key = key.split("\\.")[0];
+                    item.put(key, value);
+                } else {
+                    item.put(0, value);
+                }
+                mock.add(item);
+            } else {
+                //parameter
+                String value = p.split("=")[1];
+                Map<String, Object> item = new HashMap<>();
+                item.put(key, value);
+                parameters.add(item);
+            }
+        }
+        Map<Object, String>[] mockArray = new Map[mock.size()];
+        overrideDTO.setMock(mock.toArray(mockArray));
+        Map<String, Object>[] paramArray = new Map[parameters.size()];
+        overrideDTO.setParameters(parameters.toArray(paramArray));
     }
 
 }
diff --git a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/OverrideDTO.java b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/OverrideDTO.java
index d29936f..7a98809 100644
--- a/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/OverrideDTO.java
+++ b/dubbo-admin-backend/src/main/java/org/apache/dubbo/admin/dto/OverrideDTO.java
@@ -17,15 +17,19 @@
 
 package org.apache.dubbo.admin.dto;
 
-public class OverrideDTO {
+import org.apache.dubbo.admin.governance.sync.util.Pair;
+
+import java.util.Map;
+
+public class OverrideDTO extends BaseDTO{
 
     String app;
     String service;
     String address;
     boolean dynamic;
     boolean enabled;
-    String[] parameters;
-    String[] mock;
+    Map<String, Object>[] parameters;
+    Map<Object, String>[] mock;
 
     public String getApp() {
         return app;
@@ -67,19 +71,19 @@ public class OverrideDTO {
         this.enabled = enabled;
     }
 
-    public String[] getParameters() {
+    public Map<String, Object>[] getParameters() {
         return parameters;
     }
 
-    public void setParameters(String[] parameters) {
+    public void setParameters(Map<String, Object>[] parameters) {
         this.parameters = parameters;
     }
 
-    public String[] getMock() {
+    public Map<Object, String>[] getMock() {
         return mock;
     }
 
-    public void setMock(String[] mock) {
+    public void setMock(Map<Object, String>[] mock) {
         this.mock = mock;
     }
 }
diff --git a/dubbo-admin-frontend/src/components/LoadBalance.vue b/dubbo-admin-frontend/src/components/LoadBalance.vue
index 42d6357..b85b9ef 100644
--- a/dubbo-admin-frontend/src/components/LoadBalance.vue
+++ b/dubbo-admin-frontend/src/components/LoadBalance.vue
@@ -141,7 +141,7 @@
         {id: 1, icon: 'edit', tooltip: 'Edit'},
         {id: 3, icon: 'delete', tooltip: 'Delete'}
       ],
-      loadBalances: [
+      configs: [
       ],
       template:
         'methodName: sayHello  # 0 for all methods\n' +
diff --git a/dubbo-admin-frontend/src/components/Overrides.vue b/dubbo-admin-frontend/src/components/Overrides.vue
index 5fe89ca..7d808ae 100644
--- a/dubbo-admin-frontend/src/components/Overrides.vue
+++ b/dubbo-admin-frontend/src/components/Overrides.vue
@@ -47,19 +47,18 @@
         <v-card-text class="pa-0">
           <v-data-table
             :headers="headers"
-            :items="loadBalances"
+            :items="configs"
             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 small class="mr-2" slot="activator" @click="itemOperation(op.icon, props.item)">
+                    {{op.icon}}
                   </v-icon>
-                  <span>{{op.tooltip(props.item)}}</span>
+                  <span>{{op.tooltip}}</span>
                 </v-tooltip>
               </td>
             </template>
@@ -71,7 +70,7 @@
     <v-dialog   v-model="dialog" width="800px" persistent >
       <v-card>
         <v-card-title class="justify-center">
-          <span class="headline">Create New LoadBalance Rule</span>
+          <span class="headline">Create New Dynamic Config Rule</span>
         </v-card-title>
         <v-card-text >
           <v-text-field
@@ -125,7 +124,6 @@
     },
     data: () => ({
       dropdown_font: [ 'Service', 'App', 'IP' ],
-      ruleKeys: ['method', 'strategy'],
       pattern: 'Service',
       filter: '',
       dialog: false,
@@ -137,29 +135,11 @@
       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'
-          }}
+        {id: 0, icon: 'visibility', tooltip: 'View'},
+        {id: 1, icon: 'edit', tooltip: 'Edit'},
+        {id: 3, icon: 'delete', tooltip: 'Delete'}
       ],
-      loadBalances: [
+      configs: [
       ],
       template:
         'application:  # consumer\'s application name, empty for all \n' +
@@ -170,7 +150,7 @@
         '  - timeout: 100\n' +
         '\n' +
         'mock: \n' +
-        '  - 0: \'force: return null’\n' +
+        '  - 0: \'force: return null\'\n' +
         '  - sayHello: \'force: return null\'\n' +
         '  - test: \'fail: return empty\'',
       ruleText: '',
@@ -188,12 +168,6 @@
           align: 'left'
         },
         {
-          text: 'Method',
-          value: 'method',
-          align: 'left'
-
-        },
-        {
           text: 'Operation',
           value: 'operation',
           sortable: false
@@ -205,25 +179,14 @@
         this.search(this.filter, true)
       },
       search: function (filter, rewrite) {
-        let params = {}
-        params.service = filter
-        AXIOS.post('/balancing/search', params)
+        AXIOS.get('/override/search?serviceName=' + filter)
           .then(response => {
-            this.loadBalances = response.data
+            this.configs = response.data
             if (rewrite) {
-              this.$router.push({path: 'loadbalance', query: {service: filter}})
+              this.$router.push({path: 'config', query: {service: filter}})
             }
           })
       },
-      handleRule: function (route) {
-        let result = {}
-        for (let property in route) {
-          if (this.ruleKeys.includes(property)) {
-            result[property] = route[property]
-          }
-        }
-        return yaml.safeDump(result)
-      },
       closeDialog: function () {
         this.ruleText = this.template
         this.service = ''
@@ -244,45 +207,43 @@
         this.warn = false
       },
       saveItem: function () {
-        let text = encodeURIComponent(this.ruleText)  // contains illegal url character, need encode
-        let rule = {}
-        rule.service = this.service
-        rule.rule = text
-        AXIOS.post('/balancing/create', rule)
+        let override = yaml.safeLoad(this.ruleText)  // contains illegal url character, need encode
+        override.service = this.service
+        AXIOS.post('/override/create', override)
           .then(response => {
             if (response.data) {
               this.search(this.service, true)
+              this.filter = this.service
             }
+            this.closeDialog()
           })
       },
       itemOperation: function (icon, item) {
         switch (icon) {
           case 'visibility':
-            AXIOS.get('/balancing/detail?id=' + item.id)
+            AXIOS.get('/override/detail?id=' + item.id)
               .then(response => {
-                let balancing = response.data
-                let result = this.handleRule(balancing)
-                this.service = balancing.service
-                this.ruleText = result
+                let config = response.data
+                this.service = config.service
+                delete config.service
+                this.ruleText = yaml.safeDump(config)
                 this.cmOption.readOnly = true
                 this.dialog = true
               })
             break
           case 'edit':
-            let edit = {}
-            edit.id = item.id
-            AXIOS.post('/balancing/edit', edit)
+            AXIOS.get('/override/detail?id=' + item.id)
               .then(response => {
-                let loadbalance = response.data
-                let result = this.handleRule(loadbalance)
-                this.service = loadbalance.service
-                this.ruleText = result
+                let config = response.data
+                this.service = config.service
+                delete config.service
+                this.ruleText = yaml.safeDump(config)
                 this.cmOption.readOnly = false
                 this.dialog = true
               })
             break
           case 'delete':
-            this.openWarn(' Are you sure to Delete Routing Rule', 'service: ' + item.service)
+            this.openWarn(' Are you sure to Delete Dynamic Config', 'service: ' + item.service)
             this.warnStatus.operation = 'delete'
             this.warnStatus.id = item.id
         }
@@ -291,24 +252,13 @@
         this.height = window.innerHeight * 0.5
       },
       deleteItem: function (warnStatus) {
-        if (warnStatus.operation === 'delete') {
-          let id = {}
-          id.id = warnStatus.id
-          AXIOS.post('/balancing/delete', id)
-            .then(response => {
-              this.warn = false
-              this.search(this.filter, false)
-            })
-        } else if (warnStatus.operation === 'block') {
-          let status = {}
-          status.enabled = warnStatus.enabled
-          status.id = warnStatus.id
-          AXIOS.post('/routes/changeStatus', status)
-            .then(response => {
-              this.warn = false
-              this.search(this.filter, false)
-            })
-        }
+        let id = {}
+        id.id = warnStatus.id
+        AXIOS.post('/override/delete', id)
+          .then(response => {
+            this.warn = false
+            this.search(this.filter, false)
+          })
       }
     },
     computed: {
@@ -333,6 +283,5 @@
         this.search(service, false)
       }
     }
-
   }
 </script>
diff --git a/dubbo-admin-frontend/src/components/WeightAdjust.vue b/dubbo-admin-frontend/src/components/WeightAdjust.vue
index 715e68a..bc702a3 100644
--- a/dubbo-admin-frontend/src/components/WeightAdjust.vue
+++ b/dubbo-admin-frontend/src/components/WeightAdjust.vue
@@ -141,7 +141,7 @@
         {id: 1, icon: 'edit', tooltip: 'Edit'},
         {id: 3, icon: 'delete', tooltip: 'Delete'}
       ],
-      loadBalances: [
+      configs: [
       ],
       template:
         'weight: 100  # 100 for default\n' +