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' +