Added LinkBuilder for constructing links in the tables of the ui and

moved this functionality from the LandscapemanagementPanel to this new
class. This makes it available to the shardManagementPanel with no
additional effort
This commit is contained in:
Niklas Opiela
2022-12-05 10:13:45 +01:00
parent 28ab303984
commit c3766b8ad0
3 changed files with 216 additions and 93 deletions
@@ -264,11 +264,7 @@ public class LandscapeManagementPanel extends SimplePanel {
final Column<SailingApplicationReplicaSetDTO<String>, SafeHtml> versionColumn = new Column<SailingApplicationReplicaSetDTO<String>, SafeHtml>(versionCell) {
@Override
public SafeHtml getValue(SailingApplicationReplicaSetDTO<String> replicaSet) {
final SafeHtmlBuilder builder = new SafeHtmlBuilder();
final String version = replicaSet.getVersion();
final String releaseNotesLink = getReleaseNotesLink(version);
appendEc2Link(builder, releaseNotesLink, version);
return builder.toSafeHtml();
return new LinkBuilder().setReplicaSet(replicaSet).setPathMode(LinkBuilder.pathModes.Version).build();
}
};
applicationReplicaSetsTable.addColumn(versionColumn, stringMessages.versionHeader(), (rs1, rs2)->new NaturalComparator().compare(rs1.getVersion(), rs2.getVersion()));
@@ -276,12 +272,7 @@ public class LandscapeManagementPanel extends SimplePanel {
final Column<SailingApplicationReplicaSetDTO<String>, SafeHtml> masterColumn = new Column<SailingApplicationReplicaSetDTO<String>, SafeHtml>(masterCell) {
@Override
public SafeHtml getValue(SailingApplicationReplicaSetDTO<String> replicaSet) {
final SafeHtmlBuilder builder = new SafeHtmlBuilder();
final String gwtStatusLink = getGwtStatusLink(replicaSet.getMaster().getHost().getPublicIpAddress(), replicaSet.getMaster().getPort());
builder.appendHtmlConstant("<a target=\"_blank\" href=\""+gwtStatusLink+"\">");
builder.appendEscaped(replicaSet.getMaster().getHost().getPublicIpAddress());
builder.appendHtmlConstant("</a>");
return builder.toSafeHtml();
return new LinkBuilder().setPathMode(LinkBuilder.pathModes.MasterHost).setReplicaSet(replicaSet).build();
}
};
applicationReplicaSetsTable.addColumn(masterColumn, stringMessages.masterHostName(), (rs1, rs2)->new NaturalComparator().compare(rs1.getMaster().getHost().getPublicIpAddress(), rs2.getMaster().getHost().getPublicIpAddress()));
@@ -290,23 +281,15 @@ public class LandscapeManagementPanel extends SimplePanel {
final Column<SailingApplicationReplicaSetDTO<String>, SafeHtml> hostnameColumn = new Column<SailingApplicationReplicaSetDTO<String>, SafeHtml>(hostnameCell) {
@Override
public SafeHtml getValue(SailingApplicationReplicaSetDTO<String> replicaSet) {
final SafeHtmlBuilder builder = new SafeHtmlBuilder();
final String hostnameLink = "https://"+replicaSet.getHostname();
builder.appendHtmlConstant("<a target=\"_blank\" href=\""+hostnameLink+"\">");
builder.appendEscaped(replicaSet.getHostname());
builder.appendHtmlConstant("</a>");
return builder.toSafeHtml();
}
return new LinkBuilder().setReplicaSet(replicaSet).setPathMode(LinkBuilder.pathModes.Hostname).build()
; }
};
applicationReplicaSetsTable.addColumn(hostnameColumn, stringMessages.hostname(), (rs1, rs2)->new NaturalComparator().compare(rs1.getHostname(), rs2.getMaster().getHostname()));
final SafeHtmlCell masterInstanceIdCell = new SafeHtmlCell();
final Column<SailingApplicationReplicaSetDTO<String>, SafeHtml> masterInstanceIdColumn = new Column<SailingApplicationReplicaSetDTO<String>, SafeHtml>(masterInstanceIdCell) {
@Override
public SafeHtml getValue(SailingApplicationReplicaSetDTO<String> replicaSet) {
final SafeHtmlBuilder builder = new SafeHtmlBuilder();
final String instanceId = replicaSet.getMaster().getHost().getInstanceId();
appendEc2InstanceLink(builder, instanceId);
return builder.toSafeHtml();
return new LinkBuilder().setRegion(regionsTable.getSelectionModel().getSelectedObject()).setInstanceId(replicaSet.getMaster().getHost().getInstanceId()).setPathMode(LinkBuilder.pathModes.InstanstanceSearch).build();
}
};
applicationReplicaSetsTable.addColumn(masterInstanceIdColumn, stringMessages.masterInstanceId(),
@@ -317,21 +300,10 @@ public class LandscapeManagementPanel extends SimplePanel {
final Column<SailingApplicationReplicaSetDTO<String>, SafeHtml> replicasColumn = new Column<SailingApplicationReplicaSetDTO<String>, SafeHtml>(replicasCell) {
@Override
public SafeHtml getValue(SailingApplicationReplicaSetDTO<String> replicaSet) {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
for (final SailingAnalyticsProcessDTO replica : replicaSet.getReplicas()) {
final String gwtStatusLink = getGwtStatusLink(replica.getHost().getPublicIpAddress(), replica.getPort());
builder.appendHtmlConstant("<a target=\"_blank\" href=\""+gwtStatusLink+"\">");
builder.appendEscaped(replica.getHost().getPublicIpAddress()+":"+replica.getPort());
builder.appendHtmlConstant("</a>");
final String replicaInstanceId = replica.getHost().getInstanceId();
builder.appendEscaped(" (");
builder.appendEscaped(replica.getServerName());
builder.appendEscaped(", ");
appendEc2InstanceLink(builder, replicaInstanceId);
builder.appendEscaped(")");
builder.appendHtmlConstant("<br>");
}
return builder.toSafeHtml();
LinkBuilder linkBuilder = new LinkBuilder();
linkBuilder.setReplicaSet(replicaSet);
linkBuilder.setPathMode(LinkBuilder.pathModes.ReplicaLinks).setRegion(regionsTable.getSelectionModel().getSelectedObject());
return linkBuilder.build();
}
};
applicationReplicaSetsTable.addColumn(replicasColumn, stringMessages.replicas());
@@ -340,11 +312,7 @@ public class LandscapeManagementPanel extends SimplePanel {
final Column<SailingApplicationReplicaSetDTO<String>, SafeHtml> autoScalingGroupAmiIdColumn = new Column<SailingApplicationReplicaSetDTO<String>, SafeHtml>(autoScalingGroupAmiIdCell) {
@Override
public SafeHtml getValue(SailingApplicationReplicaSetDTO<String> replicaSet) {
final SafeHtmlBuilder builder = new SafeHtmlBuilder();
if (replicaSet.getAutoScalingGroupAmiId() != null) {
appendEc2AmiLink(builder, replicaSet.getAutoScalingGroupAmiId());
}
return builder.toSafeHtml();
return new LinkBuilder().setReplicaSet(replicaSet).setRegion(regionsTable.getSelectionModel().getSelectedObject()).setPathMode(LinkBuilder.pathModes.AmiSearch).build();
}
};
applicationReplicaSetsTable.addColumn(autoScalingGroupAmiIdColumn, stringMessages.machineImageId(), (rs1, rs2)->new NaturalComparator().compare(rs1.getAutoScalingGroupAmiId(), rs2.getAutoScalingGroupAmiId()));
@@ -782,14 +750,6 @@ public class LandscapeManagementPanel extends SimplePanel {
});
}
private String getGwtStatusLink(final String host, int port) {
return (port == 443 ? "https" : "http") + "://" + host + ":" + port + "/gwt/status";
}
private String getReleaseNotesLink(final String version) {
return "https://releases.sapsailing.com/"+version+"/release-notes.txt";
}
private void ensureAtLeastOneReplicaExistsStopReplicatingAndRemoveMasterFromTargetGroups(
StringMessages stringMessages, String selectedObject,
Iterable<SailingApplicationReplicaSetDTO<String>> applicationReplicaSetsForWhichToEnsureAtLeastOneReplicaStopReplicatingAndRemoveMasterFromTargetGroups) {
@@ -1516,33 +1476,4 @@ public class LandscapeManagementPanel extends SimplePanel {
RemoteServiceMappingConstants.landscapeManagementServiceRemotePath, HEADER_FORWARD_TO_MASTER);
return result;
}
private String getEc2ConsoleLinkForInstanceId(String instanceId) {
return getEc2ConsoleBaseUrlForSelectedRegion()+"#Instances:search="+instanceId;
}
private void appendEc2InstanceLink(final SafeHtmlBuilder builder, final String instanceId) {
final String ec2Link = getEc2ConsoleLinkForInstanceId(instanceId);
appendEc2Link(builder, ec2Link, instanceId);
}
private void appendEc2Link(final SafeHtmlBuilder builder, final String ec2Link, final String text) {
builder.appendHtmlConstant("<a target=\"_blank\" href=\""+ec2Link+"\">");
builder.appendEscaped(text);
builder.appendHtmlConstant("</a>");
}
private String getEc2ConsoleBaseUrlForSelectedRegion() {
return "https://"+regionsTable.getSelectionModel().getSelectedObject()+
".console.aws.amazon.com/ec2/v2/home?region="+regionsTable.getSelectionModel().getSelectedObject();
}
private String getEc2ConsoleLinkForAmiId(String amiId) {
return getEc2ConsoleBaseUrlForSelectedRegion()+"#Images:imageId="+amiId;
}
private void appendEc2AmiLink(final SafeHtmlBuilder builder, final String amiId) {
final String ec2Link = getEc2ConsoleLinkForAmiId(amiId);
appendEc2Link(builder, ec2Link, amiId);
}
}
@@ -0,0 +1,177 @@
package com.sap.sailing.landscape.ui.client;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.sap.sailing.landscape.ui.shared.SailingAnalyticsProcessDTO;
import com.sap.sailing.landscape.ui.shared.SailingApplicationReplicaSetDTO;
import com.sap.sse.common.Builder;
public class LinkBuilder implements Builder<LinkBuilder, SafeHtml> {
static public enum pathModes {
InstanstanceSearch,
ImageSearch,
AmiSearch,
Hostname,
ReplicaLinks,
Version,
MasterHost,
TargetgroupSearch
};
private pathModes pathMode;
private String region;
private String instanceId;
private SailingApplicationReplicaSetDTO<String> replicaSet;
private String targetgroupName;
LinkBuilder setPathMode(pathModes mode) {
pathMode = mode;
return self();
}
LinkBuilder setTargetgroupName(String name) {
this.targetgroupName = name;
return self();
}
LinkBuilder setInstanceId(String instanceId) {
this.instanceId = instanceId;
return self();
}
LinkBuilder setRegion(String region) {
this.region = region;
return self();
}
LinkBuilder setReplicaSet(SailingApplicationReplicaSetDTO<String> replicaSet){
this.replicaSet = replicaSet;
return self();
}
private String getEc2ConsoleLinkForInstanceId(String instanceId) {
return getEc2ConsoleBaseUrlForSelectedRegion()+"#Instances:search="+instanceId;
}
private String getEc2ConsoleLinkForTargetGroupArn(String name) {
return getEc2ConsoleBaseUrlForSelectedRegion()+"#TargetGroups:name="+name;
};
private String getEc2ConsoleLinkForAmiId(String amiId) {
return getEc2ConsoleBaseUrlForSelectedRegion()+"#Images:visibility=owned-by-me;search="+amiId;
}
private String getEc2ConsoleBaseUrlForSelectedRegion() {
return "https://"+region +
".console.aws.amazon.com/ec2/v2/home?region="+region;
}
private void appendEc2Link(final SafeHtmlBuilder builder, final String ec2Link, final String text) {
builder.appendHtmlConstant("<a target=\"_blank\" href=\""+ec2Link+"\">");
builder.appendEscaped(text);
builder.appendHtmlConstant("</a>");
}
private void appendEc2InstanceLink(final SafeHtmlBuilder builder, final String instanceId) {
final String ec2Link = getEc2ConsoleLinkForInstanceId(instanceId);
appendEc2Link(builder, ec2Link, instanceId);
}
private void appendEc2AmiLink(final SafeHtmlBuilder builder, final String amiId) {
final String ec2Link = getEc2ConsoleLinkForAmiId(amiId);
appendEc2Link(builder, ec2Link, amiId);
}
private void appendEc2TargetgroupLink(final SafeHtmlBuilder builder, final String name) {
final String ec2Link = getEc2ConsoleLinkForTargetGroupArn(name);
appendEc2Link(builder, ec2Link, name);
}
private String getGwtStatusLink(final String host, int port) {
return (port == 443 ? "https" : "http") + "://" + host + ":" + port + "/gwt/status";
}
private String getReleaseNotesLink(final String version) {
return "https://releases.sapsailing.com/"+version+"/release-notes.txt";
}
private void checkAttribute(Object attr, String name) throws Exception {
if(attr == null) {
throw new Exception(name + " needs to be given!");
}
}
@Override
public SafeHtml build() {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
try {
switch (pathMode) {
case ReplicaLinks:
checkAttribute(replicaSet, "Replicaset");
for (final SailingAnalyticsProcessDTO replica : replicaSet.getReplicas()) {
final String gwtStatusLink = getGwtStatusLink(replica.getHost().getPublicIpAddress(), replica.getPort());
builder.appendHtmlConstant("<a target=\"_blank\" href=\""+gwtStatusLink+"\">");
builder.appendEscaped(replica.getHost().getPublicIpAddress()+":"+replica.getPort());
builder.appendHtmlConstant("</a>");
final String replicaInstanceId = replica.getHost().getInstanceId();
builder.appendEscaped(" (");
builder.appendEscaped(replica.getServerName());
builder.appendEscaped(", ");
appendEc2InstanceLink(builder, replicaInstanceId);
builder.appendEscaped(")");
builder.appendHtmlConstant("<br>");
}
break;
case AmiSearch:
checkAttribute(replicaSet, "Replicaset");
checkAttribute(region, "Region");
if (replicaSet.getAutoScalingGroupAmiId() != null) {
appendEc2AmiLink(builder, replicaSet.getAutoScalingGroupAmiId());
}
break;
case Hostname:
checkAttribute(replicaSet, "Replicaset");
final String hostnameLink = "https://"+replicaSet.getHostname();
builder.appendHtmlConstant("<a target=\"_blank\" href=\""+hostnameLink+"\">");
builder.appendEscaped(replicaSet.getHostname());
builder.appendHtmlConstant("</a>");
break;
case ImageSearch:
break;
case InstanstanceSearch:
checkAttribute(region, "Region");
appendEc2InstanceLink(builder, instanceId);
break;
case Version:
checkAttribute(replicaSet, "Replicaset");
final String version = replicaSet.getVersion();
final String releaseNotesLink = getReleaseNotesLink(version);
appendEc2Link(builder, releaseNotesLink, version);
break;
case MasterHost:
checkAttribute(replicaSet, "Replicaset");
final String gwtStatusLink = getGwtStatusLink(replicaSet.getMaster().getHost().getPublicIpAddress(), replicaSet.getMaster().getPort());
builder.appendHtmlConstant("<a target=\"_blank\" href=\""+gwtStatusLink+"\">");
builder.appendEscaped(replicaSet.getMaster().getHost().getPublicIpAddress());
builder.appendHtmlConstant("</a>");
break;
case TargetgroupSearch:
checkAttribute(region, "Region");
checkAttribute(targetgroupName, "Targetgroupname");
appendEc2TargetgroupLink(builder, targetgroupName);
break;
default:
break;
}
}catch (Exception e){
builder.appendHtmlConstant("<a target=\"_blank\" >");
builder.appendEscaped(e.getMessage());
builder.appendHtmlConstant("</a>");
}
return builder.toSafeHtml();
}
}
@@ -6,8 +6,11 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
@@ -31,7 +34,7 @@ public class ShardManagementPanel extends SimplePanel {
private final Button addShard;
private final LandscapeManagementWriteServiceAsync landscapeManagementService;
private final TableWrapperWithMultiSelectionAndFilter<String, StringMessages, AdminConsoleTableResources> regattasTable;
private final TableWrapperWithMultiSelectionAndFilter<Entry<Integer, AwsShardDTO>, StringMessages, AdminConsoleTableResources> shardTable;
private final TableWrapperWithMultiSelectionAndFilter< Entry<AwsShardDTO, Iterable<String>>, StringMessages, AdminConsoleTableResources> shardTable;
private final TextBox brearertokenText;
private SailingApplicationReplicaSetDTO<String> replicaSet;
private final BusyIndicator shardBusy;
@@ -71,19 +74,31 @@ public class ShardManagementPanel extends SimplePanel {
mainPanel.add(usercredentials);
shardTable = new TableWrapperWithMultiSelectionAndFilter<Entry<Integer,AwsShardDTO>, StringMessages, AdminConsoleTableResources>(stringMessages, errorReporter, false, java.util.Optional.empty(), GWT.create(AdminConsoleTableResources.class), java.util.Optional.empty(), java.util.Optional.empty(), null) {
shardTable = new TableWrapperWithMultiSelectionAndFilter<Entry<AwsShardDTO, Iterable<String>>, StringMessages, AdminConsoleTableResources>(
stringMessages, errorReporter, false, java.util.Optional.empty(),
GWT.create(AdminConsoleTableResources.class), java.util.Optional.empty(), java.util.Optional.empty(),
null) {
@Override
protected Iterable<String> getSearchableStrings(Entry<Integer, AwsShardDTO> t) {
protected Iterable<String> getSearchableStrings(Entry<AwsShardDTO, Iterable<String>> t) {
Set<String> res = new HashSet<String>();
res.add(t.getValue().getName());
res.add(t.getKey().getName());
return res;
}
};
shardTable.addColumn(t -> t.getKey().toString(),"index");
shardTable.addColumn(t -> t.getValue().getName(),"Name");
shardTable.addColumn(t-> t.getValue().getKeysString() , "Sharding Keys");
//shardTable.addColumn(t -> t.getKey().toString(),"index");
shardTable.addColumn(t -> t.getKey().getName(),"Name");
shardTable.addColumn(t-> t.getKey().getKeysString() , "Sharding Keys");
final SafeHtmlCell targetgroupCell = new SafeHtmlCell();
final Column<Entry<AwsShardDTO, Iterable<String>>, SafeHtml> targetgroupColumn = new Column<Entry<AwsShardDTO, Iterable<String>>, SafeHtml>(targetgroupCell) {
@Override
public SafeHtml getValue(Entry<AwsShardDTO, Iterable<String>> shardentry) {
return new LinkBuilder().setTargetgroupName(shardentry.getKey().getTargetgroupName()).setRegion(region).setPathMode(LinkBuilder.pathModes.TargetgroupSearch).build();
}
};
shardTable.addColumn(targetgroupColumn , "Targetgroup");
shardTable.addColumn(t-> t.getKey().getAutoscalingGroupName() , "Autoscalinggroup");
shardTable.getSelectionModel().addSelectionChangeHandler(event -> {
removeButton.setEnabled(!shardTable.getSelectionModel().getSelectedSet().isEmpty());
});
@@ -188,7 +203,7 @@ public class ShardManagementPanel extends SimplePanel {
Button submitButton = new Button("Submit");
mainPanel.add(submitButton);
submitButton.addClickHandler(event -> {
if(nameText.getValue() == null || nameText.getValue() == "" || region == null || passphrase == null) {
if(nameText.getValue() == null || nameText.getValue() == "") {
nameRequest.setVisible(false);
errorReporter.reportError("Name not valid");
}else if(region == null || passphrase == null) {
@@ -220,8 +235,8 @@ public class ShardManagementPanel extends SimplePanel {
private void removeButtonPress() {
setShardtableBusy(true);
for (Entry<Integer, AwsShardDTO> selection : shardTable.getSelectionModel().getSelectedSet()) {
landscapeManagementService.removeShard(selection.getKey(), selection.getValue(), replicaSet, region,
for (Entry<AwsShardDTO, Iterable<String>> selection : shardTable.getSelectionModel().getSelectedSet()) {
landscapeManagementService.removeShard( selection.getKey(), replicaSet, region,
passphrase.getBytes(), new AsyncCallback<Void>() {
@Override
@@ -232,7 +247,7 @@ public class ShardManagementPanel extends SimplePanel {
@Override
public void onSuccess(Void result) {
appendMessage("Deleted Shard: " + selection.getValue().getName());
appendMessage("Deleted Shard: " + selection.getKey().getName());
}
});
}
@@ -241,7 +256,7 @@ public class ShardManagementPanel extends SimplePanel {
private void displayShards() {
setShardtableBusy(true);
landscapeManagementService.getShards(replicaSet, region,passphrase.getBytes(), new AsyncCallback<Map<Integer,AwsShardDTO>>() {
landscapeManagementService.getShards(replicaSet, region,passphrase.getBytes(), new AsyncCallback< Map<AwsShardDTO, Iterable<String>>>() {
@Override
public void onFailure(Throwable caught) {
@@ -250,7 +265,7 @@ public class ShardManagementPanel extends SimplePanel {
}
@Override
public void onSuccess(Map<Integer, AwsShardDTO> result) {
public void onSuccess( Map<AwsShardDTO, Iterable<String>> result) {
shardTable.refresh(result.entrySet());
setShardtableBusy(false);
}