Skip to content

Commit

Permalink
Admin Console: Update instance status asynchronously
Browse files Browse the repository at this point in the history
For standalone instance, clusters and nodes
Signed-off-by:Ondro Mihalyi <mihalyi@omnifish.ee>
  • Loading branch information
OndroMih committed May 25, 2023
1 parent 28b915e commit e0e1636
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 10 deletions.
Expand Up @@ -49,6 +49,7 @@
createMap(result="#{requestScope.listInstanceAttrMap}");
setPageSessionAttribute(key="clusterInstancesPage" value="#{true}" )
mapPut(map="#{requestScope.listInstanceAttrMap}" key="whichtarget" value="#{pageSession.encodedClusterName}")
mapPut(map="#{requestScope.listInstanceAttrMap}" key="nostatus" value="true")
gfr.getInstancesStatus();
gf.getMapKeys(Map="#{pageSession.instanceStatusMap}" Keys="#{pageSession.instancesName}");
gf.getChildList(parentEndpoint="#{pageSession.parentUrl}", childType="#{pageSession.childType}", includeList="#{pageSession.instancesName}", result="#{requestScope.listOfRows}");
Expand All @@ -73,6 +74,12 @@
</sun:form>
#include "/common/shared/changeButtonsJS.inc"

<sun:script>
<f:verbatim>
fetchStatusesOfInstances("propertyForm:");
</f:verbatim>
</sun:script>

</define>
</composition>

Expand Down
32 changes: 28 additions & 4 deletions appserver/admingui/cluster/src/main/resources/cluster/clusters.jsf
Expand Up @@ -146,17 +146,24 @@
<foreach key="instance" list="#{requestScope.listOfInstances}">
<event>
<!beforeEncode
setAttribute(key="tmp" value="#{instance}");
gf.listInstances(optionKeys={"id"} optionValues={"$attribute{tmp}"}, statusMap="#{requestScope.statusMap}");
setAttribute(key="status" value="#{requestScope.statusMap['$attribute{tmp}']}");
setAttribute(key="instanceName" value="#{instance}");
gf.listInstances(optionKeys={"id", "nostatus"} optionValues={"$attribute{instanceName}", "true"}, statusMap="#{requestScope.statusMap}");
setAttribute(key="status" value="UNKNOWN");
setAttribute(key="statusString" value="$resource{i18nc.status.image.$attribute{status}} &nbsp; $resource{i18nc.status.$attribute{status}}");
if (#{not empty requestScope.statusMap['$attribute{instanceName}']}) {
setAttribute(key="status" value="#{requestScope.statusMap['$attribute{instanceName}']}");
setAttribute(key="statusString" value="$resource{i18nc.status.image.$attribute{status}} &nbsp; $resource{i18nc.status.$attribute{status}}");
}
/>
</event>
"<tr>
"<td>
<sun:hyperlink id="iLink" url="#{request.contextPath}/cluster/cluster/clusterInstanceEdit.jsf?clusterName=#{pageSession.clusterName}&instanceName=#{instance}" text="#{instance}" />
"</td> <td>
"</td> <td class="status">
<staticText id="colStopped" value="#{requestScope.statusString}" />
<f:verbatim>
<span class="instance-name" data-instancename="#{instance}"/>
</f:verbatim>
"</td>
"</tr>
</foreach>
Expand All @@ -171,6 +178,23 @@
</sun:form>
#include "/common/shared/changeButtonsJS.inc"

<sun:script>
<f:verbatim>
function fetchStatusesOfInstances(tableIdPrefix) {
const statusCells = document.querySelectorAll("[id='" + tableIdPrefix + "clustersTable'] tr td.status");
statusCells.forEach(e => {
const instName = e.querySelector("span.instance-name").attributes["data-instancename"].value;
admingui.ajax.get("#{request.contextPath}/shared/instanceStatus.jsf?instanceName=" + instName, "", (req) => {
e.innerHTML = req.responseText;
});
});
}

fetchStatusesOfInstances("propertyForm:");
</f:verbatim>

</sun:script>

</define>
</composition>

30 changes: 27 additions & 3 deletions appserver/admingui/cluster/src/main/resources/node/nodes.jsf
Expand Up @@ -70,7 +70,7 @@
setPageSessionAttribute(key="editLink" value="#{request.contextPath}/cluster/node/nodeEdit.jsf");
setPageSessionAttribute(key="tableTitle" value="$resource{i18ncs.nodes.TableTitle}");
createMap(result="#{pageSession.nodeInstanceMap}");
gf.listInstances(optionKeys={"standaloneonly" } optionValues={"true"}, instances="#{pageSession.standaloneList}");
gf.listInstances(optionKeys={"standaloneonly", "nostatus" } optionValues={"true", "true"}, instances="#{pageSession.standaloneList}");
/>
</event>
" <script type="text/javascript">admingui.nav.selectTreeNodeById(admingui.nav.TREE_ID + ":nodeTreeNode");</script>
Expand Down Expand Up @@ -123,15 +123,18 @@
<sun:tableColumn headerText="$resource{i18ncs.clusters.instanceCol}" rowHeader="$boolean{false}" id="col3">
<event>
<!beforeEncode
gf.listInstances(optionKeys={"id"} optionValues={"$pageSession{nodeName}"}, instances="#{requestScope.instanceList}" statusMap="#{requestScope.statusMap}");
gf.listInstances(optionKeys={"id", "nostatus"} optionValues={"$pageSession{nodeName}", "true"}, instances="#{requestScope.instanceList}" statusMap="#{requestScope.statusMap}");
mapPut(map="#{pageSession.nodeInstanceMap}" key="#{pageSession.nodeName}" value="#{requestScope.instanceList}");
/>
</event>
<if condition="#{requestScope.instanceList}">
<foreach key="instance" list="#{requestScope.instanceList}">
<event>
<!beforeEncode
setAttribute(key="status" value="#{requestScope.statusMap[ '${instance}']}");
setAttribute(key="status" value="UNKNOWN");
if (#{not empty requestScope.statusMap[ '${instance}']}) {
setAttribute(key="status" value="#{requestScope.statusMap[ '${instance}']}");
}
gf.containedIn(list="#{pageSession.standaloneList}" testStr="#{requestScope.instance}" contain="#{requestScope.isStandalone}" );
urlencode(value="#{requestScope.instance}" encoding="UTF-8" result="#{pageSession.encodedInstanceName}");
if (#{requestScope.isStandalone}){
Expand All @@ -148,7 +151,10 @@
</event>
<sun:hyperlink url="#{requestScope.iurl}" text="#{requestScope.instance}" />
"&nbsp;&nbsp;&nbsp;
"<span class="status" data-instancename="#{instance}">

<staticText id="colStopped" value="#{requestScope.statusString}" />
"</span>
"<br />
</foreach>
</if>
Expand Down Expand Up @@ -179,6 +185,24 @@
</sun:form>
#include "/common/shared/changeButtonsJS.inc"

<sun:script>
<f:verbatim>
function fetchStatusesOfInstances(tableIdPrefix) {
const statusCells = document.querySelectorAll("[id='" + tableIdPrefix + "nodesTable'] tr td span.status");
statusCells.forEach(e => {
const instName = e.attributes["data-instancename"].value;
admingui.ajax.get("#{request.contextPath}/shared/instanceStatus.jsf?instanceName=" + instName, "", (req) => {
e.innerHTML = req.responseText;
});
});
}

fetchStatusesOfInstances("propertyForm:");
</f:verbatim>

</sun:script>


</define>
</composition>

Expand Down
@@ -0,0 +1,39 @@
<!--

Copyright (c) 2023 Contributors to Eclipse Foundation.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v. 2.0, which is available at
http://www.eclipse.org/legal/epl-2.0.

This Source Code may also be made available under the following Secondary
Licenses when the conditions for such availability set forth in the
Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
version 2 with the GNU Classpath Exception, which is available at
https://www.gnu.org/software/classpath/license.html.

SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!initPage
setResourceBundle(key="i18nc" bundle="org.glassfish.common.admingui.Strings")
getRequestValue(key="instanceName" value="#{pageSession.instanceName}");
/>
#include "/cluster/shared/handlers.inc"
<!composition>
<staticText value="#{requestScope.statusString}">
<!beforeCreate
createMap(result="#{requestScope.listInstanceAttrMap}");
mapPut(map="#{requestScope.listInstanceAttrMap}" key="whichTarget" value="#{pageSession.instanceName}")
gfr.getInstancesStatus();
/>
<!beforeEncode
mapGet(Map="#{pageSession.instanceStatusMap}" Key="#{pageSession.instanceName}" Value="#{requestScope.status}")
setAttribute(key="statusString" value="$resource{i18nc.status.image.$attribute{status}} &nbsp; $resource{i18nc.status.$attribute{status}}");
/>
</staticText>
<f:verbatim>
<span class="instance-name" data-instancename="#{pageSession.instanceName}"/>
</f:verbatim>
</composition>
Expand Up @@ -54,14 +54,35 @@
<sun:tableColumn headerText="$resource{i18ncs.common.NodeCol}" sort="node" rowHeader="$boolean{false}" id="col5">
<sun:hyperlink id="nodeAgentlink" text="#{td.value.nodeRef}" url="#{request.contextPath}/cluster/node/nodeEdit.jsf?nodeName=#{td.value.nodeRef}" />
</sun:tableColumn>
<sun:tableColumn headerText="$resource{i18n.common.Status}" rowHeader="$boolean{false}" id="col6">
<staticText id="statusCol" value="#{requestScope.statusString}" >
<sun:tableColumn headerText="$resource{i18n.common.Status}" rowHeader="$boolean{false}" id="col6" styleClass="status">
<staticText id="statusCol" value="#{requestScope.statusString}">
<!beforeEncode
mapGet(Map="#{pageSession.instanceStatusMap}" Key="#{td.value.name}" Value="#{requestScope.status}")
setAttribute(key="statusString" value="$resource{i18nc.status.image.$attribute{status}} &nbsp; $resource{i18nc.status.$attribute{status}}");
setAttribute(key="statusString" value="$resource{i18nc.status.image.UNKNOWN} &nbsp; $resource{i18nc.status.UNKNOWN}");
if ( #{not empty requestScope.status} ) {
setAttribute(key="statusString" value="$resource{i18nc.status.image.$attribute{status}} &nbsp; $resource{i18nc.status.$attribute{status}}");
}
/>
</staticText>
<f:verbatim>
<span class="instance-name" data-instancename="#{td.value.name}"/>
</f:verbatim>
</sun:tableColumn>
</sun:tableRowGroup>

</sun:table>

<sun:script>
<f:verbatim>
function fetchStatusesOfInstances(tableIdPrefix) {
const statusCells = document.querySelectorAll("[id='" + tableIdPrefix + "instancesTable'] tr td.status");
statusCells.forEach(e => {
const instName = e.querySelector("span.instance-name").attributes["data-instancename"].value;
admingui.ajax.get("#{request.contextPath}/shared/instanceStatus.jsf?instanceName=" + instName, "", (req) => {
e.innerHTML = req.responseText;
});
});
}
</f:verbatim>

</sun:script>
Expand Up @@ -44,6 +44,7 @@
setPageSessionAttribute(key="childType" value="server");
createMap(result="#{requestScope.listInstanceAttrMap}");
mapPut(map="#{requestScope.listInstanceAttrMap}" key="standaloneonly" value="true")
mapPut(map="#{requestScope.listInstanceAttrMap}" key="nostatus" value="true")
gfr.getInstancesStatus();
gf.getMapKeys(Map="#{pageSession.instanceStatusMap}" Keys="#{pageSession.standalone}");
gf.getChildList(parentEndpoint="#{pageSession.parentUrl}", childType="#{pageSession.childType}",
Expand All @@ -68,6 +69,13 @@
</sun:form>
#include "/common/shared/changeButtonsJS.inc"


<sun:script>
<f:verbatim>
fetchStatusesOfInstances("propertyForm:");
</f:verbatim>
</sun:script>

</define>
</composition>

Expand Down

0 comments on commit e0e1636

Please sign in to comment.