Commit e58e3670 by Nepxion

增加图形化灰度发布功能

parent 65a36238
...@@ -35,6 +35,20 @@ public class ServiceController { ...@@ -35,6 +35,20 @@ public class ServiceController {
}); });
} }
@SuppressWarnings("unchecked")
public static List<String> getVersions(InstanceEntity instance) {
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/version/view";
return restTemplate.getForEntity(url, List.class).getBody();
}
@SuppressWarnings("unchecked")
public static List<String> getRules(InstanceEntity instance) {
String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/config/view";
return restTemplate.getForEntity(url, List.class).getBody();
}
public static String getUrl() { public static String getUrl() {
String url = PropertiesContext.getProperties().getString("url"); String url = PropertiesContext.getProperties().getString("url");
if (!url.endsWith("/")) { if (!url.endsWith("/")) {
......
...@@ -21,8 +21,11 @@ public class InstanceEntity implements Serializable { ...@@ -21,8 +21,11 @@ public class InstanceEntity implements Serializable {
private String serviceId; private String serviceId;
private String version; private String version;
private String dynamicVersion;
private String host; private String host;
private int port; private int port;
private String rule;
private String dynamicRule;
public String getServiceId() { public String getServiceId() {
return serviceId; return serviceId;
...@@ -40,6 +43,14 @@ public class InstanceEntity implements Serializable { ...@@ -40,6 +43,14 @@ public class InstanceEntity implements Serializable {
this.version = version; this.version = version;
} }
public String getDynamicVersion() {
return dynamicVersion;
}
public void setDynamicVersion(String dynamicVersion) {
this.dynamicVersion = dynamicVersion;
}
public String getHost() { public String getHost() {
return host; return host;
} }
...@@ -56,6 +67,22 @@ public class InstanceEntity implements Serializable { ...@@ -56,6 +67,22 @@ public class InstanceEntity implements Serializable {
this.port = port; this.port = port;
} }
public String getDynamicRule() {
return dynamicRule;
}
public void setDynamicRule(String dynamicRule) {
this.dynamicRule = dynamicRule;
}
public String getRule() {
return rule;
}
public void setRule(String rule) {
this.rule = rule;
}
@Override @Override
public int hashCode() { public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this); return HashCodeBuilder.reflectionHashCode(this);
......
...@@ -9,10 +9,17 @@ package com.nepxion.discovery.console.desktop.workspace; ...@@ -9,10 +9,17 @@ package com.nepxion.discovery.console.desktop.workspace;
* @version 1.0 * @version 1.0
*/ */
import twaver.AlarmSeverity;
import twaver.BlinkingRule;
import twaver.Element;
import twaver.Generator;
import twaver.TWaverConst;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Point; import java.awt.Point;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -39,6 +46,7 @@ import com.nepxion.discovery.console.desktop.workspace.topology.TopologyEntityTy ...@@ -39,6 +46,7 @@ import com.nepxion.discovery.console.desktop.workspace.topology.TopologyEntityTy
import com.nepxion.swing.action.JSecurityAction; import com.nepxion.swing.action.JSecurityAction;
import com.nepxion.swing.button.ButtonManager; import com.nepxion.swing.button.ButtonManager;
import com.nepxion.swing.button.JClassicButton; import com.nepxion.swing.button.JClassicButton;
import com.nepxion.swing.dialog.JExceptionDialog;
import com.nepxion.swing.dialog.JOptionDialog; import com.nepxion.swing.dialog.JOptionDialog;
import com.nepxion.swing.handle.HandleManager; import com.nepxion.swing.handle.HandleManager;
import com.nepxion.swing.icon.IconFactory; import com.nepxion.swing.icon.IconFactory;
...@@ -72,6 +80,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -72,6 +80,7 @@ public class ServiceTopology extends AbstractTopology {
public ServiceTopology() { public ServiceTopology() {
initializeToolBar(); initializeToolBar();
initializeTopology();
} }
private void initializeToolBar() { private void initializeToolBar() {
...@@ -79,6 +88,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -79,6 +88,7 @@ public class ServiceTopology extends AbstractTopology {
toolBar.addSeparator(); toolBar.addSeparator();
toolBar.add(Box.createHorizontalStrut(5)); toolBar.add(Box.createHorizontalStrut(5));
toolBar.add(new JClassicButton(createShowTopologyAction())); toolBar.add(new JClassicButton(createShowTopologyAction()));
toolBar.add(new JClassicButton(createXXXAction()));
toolBar.addSeparator(); toolBar.addSeparator();
toolBar.add(createConfigButton(true)); toolBar.add(createConfigButton(true));
...@@ -88,6 +98,23 @@ public class ServiceTopology extends AbstractTopology { ...@@ -88,6 +98,23 @@ public class ServiceTopology extends AbstractTopology {
setLinkAutoHide(true); setLinkAutoHide(true);
} }
private void initializeTopology() {
graph.setBlinkingRule(new BlinkingRule() {
public boolean isBodyBlinking(Element element) {
return element.getAlarmState().getHighestNativeAlarmSeverity() != null || element.getClientProperty(TWaverConst.PROPERTYNAME_RENDER_COLOR) != null;
}
public boolean isOutlineBlinking(Element element) {
return element.getAlarmState().getPropagateSeverity() != null || element.getClientProperty(TWaverConst.PROPERTYNAME_STATE_OUTLINE_COLOR) != null;
}
});
graph.setElementStateOutlineColorGenerator(new Generator() {
public Object generate(Object object) {
return null;
}
});
}
private void addServices(Map<String, List<InstanceEntity>> instanceMap) { private void addServices(Map<String, List<InstanceEntity>> instanceMap) {
for (Map.Entry<String, List<InstanceEntity>> entry : instanceMap.entrySet()) { for (Map.Entry<String, List<InstanceEntity>> entry : instanceMap.entrySet()) {
addService(entry.getKey(), entry.getValue()); addService(entry.getKey(), entry.getValue());
...@@ -107,7 +134,7 @@ public class ServiceTopology extends AbstractTopology { ...@@ -107,7 +134,7 @@ public class ServiceTopology extends AbstractTopology {
if (CollectionUtils.isNotEmpty(instances)) { if (CollectionUtils.isNotEmpty(instances)) {
for (int i = 0; i < instances.size(); i++) { for (int i = 0; i < instances.size(); i++) {
InstanceEntity instance = instances.get(i); InstanceEntity instance = instances.get(i);
TNode node = createNode(ButtonManager.getHtmlText(instance.getHost() + ":" + instance.getPort() + (StringUtils.isNotEmpty(instance.getVersion()) ? "\n [V" + instance.getVersion() + " -> V2.0]" : "")), nodeEntity, i, nodeStartX, nodeStartY, nodeHorizontalGap, nodeVerticalGap); TNode node = createNode(getNodeName(instance), nodeEntity, i, nodeStartX, nodeStartY, nodeHorizontalGap, nodeVerticalGap);
node.setUserObject(instance); node.setUserObject(instance);
group.addChild(node); group.addChild(node);
...@@ -135,12 +162,45 @@ public class ServiceTopology extends AbstractTopology { ...@@ -135,12 +162,45 @@ public class ServiceTopology extends AbstractTopology {
} }
} }
private String getNodeName(InstanceEntity instance) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(instance.getHost()).append(":").append(instance.getPort());
if (StringUtils.isNotEmpty(instance.getVersion())) {
stringBuilder.append("\n [V").append(instance.getVersion());
if (StringUtils.isNotEmpty(instance.getDynamicVersion())) {
stringBuilder.append(" -> V").append(instance.getDynamicVersion());
}
stringBuilder.append("]");
}
return ButtonManager.getHtmlText(stringBuilder.toString());
}
private void updateNode(Element element, InstanceEntity instance) {
String name = getNodeName(instance);
element.setName(name);
if (StringUtils.isNotEmpty(instance.getDynamicRule())) {
element.getAlarmState().addAcknowledgedAlarm(AlarmSeverity.WARNING);
} else if (StringUtils.isNotEmpty(instance.getDynamicVersion())) {
element.getAlarmState().addAcknowledgedAlarm(AlarmSeverity.MINOR);
} else {
element.getAlarmState().clear();
}
}
private void showTopology(boolean reloaded) { private void showTopology(boolean reloaded) {
dataBox.clear(); dataBox.clear();
groupLocationMap.clear(); groupLocationMap.clear();
if (reloaded) { if (reloaded) {
Map<String, List<InstanceEntity>> instanceMap = ServiceController.getInstanceMap(); Map<String, List<InstanceEntity>> instanceMap = null;
try {
instanceMap = ServiceController.getInstanceMap();
} catch (Exception e) {
JExceptionDialog.traceException(HandleManager.getFrame(this), "获取服务和实例列表失败", e);
return;
}
this.instanceMap = instanceMap; this.instanceMap = instanceMap;
} }
...@@ -179,6 +239,44 @@ public class ServiceTopology extends AbstractTopology { ...@@ -179,6 +239,44 @@ public class ServiceTopology extends AbstractTopology {
return action; return action;
} }
private JSecurityAction createXXXAction() {
JSecurityAction action = new JSecurityAction(ConsoleLocale.getString("show_topology"), ConsoleIconFactory.getSwingIcon("component/ui_16.png"), ConsoleLocale.getString("show_topology")) {
private static final long serialVersionUID = 1L;
public void execute(ActionEvent e) {
TGroup group = TElementManager.getSelectedGroup(dataBox);
if (group != null) {
@SuppressWarnings("unchecked")
List<Element> elements = group.getChildren();
Iterator<Element> iterator = elements.iterator();
while (iterator.hasNext()) {
Element element = iterator.next();
InstanceEntity instance = (InstanceEntity) element.getUserObject();
try {
List<String> versions = ServiceController.getVersions(instance);
List<String> rules = ServiceController.getRules(instance);
instance.setVersion(versions.get(0));
instance.setDynamicVersion(versions.get(1));
instance.setRule(rules.get(0));
instance.setDynamicRule(rules.get(1));
updateNode(element, instance);
} catch (Exception ex) {
iterator.remove();
dataBox.removeElement(element);
JExceptionDialog.traceException(HandleManager.getFrame(ServiceTopology.this), "获取动态配置或者动态版本失败,可能该实例已下线", ex);
}
}
}
}
};
return action;
}
private class LayoutDialog extends JOptionDialog { private class LayoutDialog extends JOptionDialog {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment