Skip to content

Commit c04eb87

Browse files
committed
ARTEMIS-6030 - added status of lock coordinators to console
1 parent b3108d5 commit c04eb87

3 files changed

Lines changed: 100 additions & 2 deletions

File tree

artemis-console-extension/artemis-extension/packages/artemis-console-plugin/src/artemis-service.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,20 @@ export type Acceptors = {
9797
acceptors: Acceptor[]
9898
}
9999

100+
export type LockCoordinator = {
101+
name: string
102+
lockId: string
103+
className: string
104+
simpleName: string
105+
locked: boolean
106+
started: boolean
107+
status: string
108+
}
109+
110+
export type LockCoordinators = {
111+
lockCoordinators: LockCoordinator[]
112+
}
113+
100114
export type ClusterConnection = {
101115
Started: boolean
102116
Address: string
@@ -164,7 +178,8 @@ const DESTROY_QUEUE_SIG = "destroyQueue(java.lang.String)";
164178
const REMOVE_ALL_MESSAGES_SIG = "removeAllMessages()";
165179
const CLOSE_CONNECTION_SIG = "closeConnectionWithID(java.lang.String)";
166180
const CLOSE_SESSION_SIG = "closeSessionWithID(java.lang.String,java.lang.String)";
167-
const CLOSE_CONSUMER_SIG = "closeConsumerWithID(java.lang.String,java.lang.String)"
181+
const CLOSE_CONSUMER_SIG = "closeConsumerWithID(java.lang.String,java.lang.String)";
182+
const LIST_LOCK_MANAGER_SIG = "listLockCoordinatorsAsJSON()";
168183

169184
const MS_PER_SEC = 1000;
170185
const MS_PER_MIN = 60 * MS_PER_SEC;
@@ -356,6 +371,36 @@ class ArtemisService {
356371
});
357372
}
358373

374+
async createLockCoordinators(): Promise<LockCoordinators> {
375+
return new Promise<LockCoordinators>(async (resolve, reject) => {
376+
const lockCoordinators: LockCoordinators = {
377+
lockCoordinators: []
378+
};
379+
const brokerObjectName = await this.getBrokerObjectName();
380+
const brokerMBean = await findMBeanInfo(brokerObjectName);
381+
const doesListLockCoordinatorMethodExist = this.doesListLockCoordinatorMethodExist(brokerMBean as MBeanNode)
382+
if (!doesListLockCoordinatorMethodExist) {
383+
console.log("Lock Coordinators not available in this broker version");
384+
resolve(lockCoordinators);
385+
} else if(this.canListLockCoordinators(brokerMBean as MBeanNode)) {
386+
const lockCoordinatorString = await jolokiaService.execute(brokerObjectName, LIST_LOCK_MANAGER_SIG).catch(error => {
387+
eventService.notify({ type: "warning", message: jolokiaService.errorMessage(error) })
388+
return "[]"
389+
}) as string;
390+
if (lockCoordinatorString) {
391+
lockCoordinators.lockCoordinators = JSON.parse(lockCoordinatorString);
392+
console.info("resolved " + lockCoordinators);
393+
console.info("from " + lockCoordinatorString);
394+
resolve(lockCoordinators);
395+
}
396+
397+
} else {
398+
console.info("oops")
399+
resolve(lockCoordinators);
400+
}
401+
reject("invalid response:")
402+
});
403+
}
359404
async createAcceptors(): Promise<Acceptors> {
360405
return new Promise<Acceptors>(async (resolve, reject) => {
361406
const brokerObjectName = await this.brokerObjectName;
@@ -755,6 +800,9 @@ class ArtemisService {
755800
return (this.DEBUG_PRIVS && queueMBean?.hasInvokeRights(SEND_MESSAGE_SIG)) ?? false;
756801
}
757802

803+
canListLockCoordinators = (brokerMBean: MBeanNode | undefined): boolean => {
804+
return (this.DEBUG_PRIVS && brokerMBean?.hasInvokeRights(LIST_LOCK_MANAGER_SIG)) ?? false;
805+
}
758806
canBrowseQueue = (broker: MBeanNode | undefined, queue: string): boolean => {
759807
if(broker) {
760808
const queueMBean = broker.parent?.find(node => {
@@ -810,6 +858,10 @@ class ArtemisService {
810858
return false;
811859
}
812860

861+
doesListLockCoordinatorMethodExist = (broker: MBeanNode | undefined): boolean => {
862+
return broker?broker.hasOperations("listLockCoordinatorsAsJSON"): false;
863+
}
864+
813865
canListConnections = (broker: MBeanNode | undefined): boolean => {
814866
return (this.DEBUG_PRIVS && broker?.hasInvokeRights(LIST_CONNECTIONS_SIG)) ?? false
815867
}

artemis-console-extension/artemis-extension/packages/artemis-console-plugin/src/status/Status.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ describe('Status', () => {
8080
...mockBrokerState
8181
})
8282
;(artemisService.createAcceptors as jest.Mock).mockResolvedValue({ acceptors: [] })
83+
;(artemisService.createLockCoordinators as jest.Mock).mockResolvedValue({ lockCoordinators: [] })
8384
;(artemisService.createClusterConnections as jest.Mock).mockResolvedValue({ clusterConnections: [] })
8485
;(artemisService.getBrokerObjectName as jest.Mock).mockResolvedValue('org.apache.activemq.artemis:broker=127.0.0.1')
8586
})

artemis-console-extension/artemis-extension/packages/artemis-console-plugin/src/status/Status.tsx

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ import { ExclamationCircleIcon } from '@patternfly/react-icons/dist/esm/icons/ex
4646
import { OkIcon } from '@patternfly/react-icons/dist/esm/icons/ok-icon'
4747
import { Attributes, eventService, jolokiaService, Operations } from '@hawtio/react';
4848
import React, { ReactNode, useContext, useEffect, useState } from "react";
49-
import { Acceptors, artemisService, BrokerInfo, BrokerState, ClusterConnections } from "../artemis-service";
49+
import { Acceptors, artemisService, BrokerInfo, BrokerState, ClusterConnections, LockCoordinators } from "../artemis-service";
5050
import { ArtemisContext } from "../context";
5151
import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table";
5252
import { LockedIcon } from '@patternfly/react-icons'
@@ -56,6 +56,7 @@ export const Status: React.FunctionComponent = () => {
5656
const [brokerState, setBrokerState] = useState<BrokerState>({ loaded: false, accessible: false, message: "Loading..." })
5757
const [brokerInfo, setBrokerInfo] = useState<BrokerInfo>()
5858
const [acceptors, setAcceptors] = useState<Acceptors>();
59+
const [lockCoordinators, setLockCoordinators] = useState<LockCoordinators>();
5960
const [clusterConnections, setClusterConnections] = useState<ClusterConnections>()
6061
const { findAndSelectNode } = useContext(ArtemisContext)
6162

@@ -86,6 +87,16 @@ export const Status: React.FunctionComponent = () => {
8687
});
8788
}
8889

90+
const getLockCoordinators = async () => {
91+
artemisService.createLockCoordinators()
92+
.then((lockCoordinators) => {
93+
setLockCoordinators(lockCoordinators)
94+
})
95+
.catch((error) => {
96+
eventService.notify({type: 'warning', message: jolokiaService.errorMessage(error) })
97+
});
98+
}
99+
89100
const getClusterConnections = async () => {
90101
artemisService.createClusterConnections()
91102
.then((clusterConnections) => {
@@ -102,6 +113,8 @@ export const Status: React.FunctionComponent = () => {
102113

103114
getAcceptors();
104115

116+
getLockCoordinators();
117+
105118
getClusterConnections();
106119

107120
// Pause auto-refresh when Operations dialog is open to prevent collapsing expanded operations
@@ -271,6 +284,38 @@ export const Status: React.FunctionComponent = () => {
271284
</Card>
272285
</GridItem>
273286
</Grid>
287+
{lockCoordinators && lockCoordinators.lockCoordinators.length > 0 &&
288+
<ExpandableSection toggleTextExpanded="Lock Coordinators" toggleTextCollapsed="Lock Coordinators">
289+
<Grid hasGutter span={4}>
290+
<GridItem span={6} rowSpan={3}>
291+
<Card isFullHeight={true} >
292+
<CardBody>
293+
<Divider />
294+
<Table>
295+
<Thead>
296+
<Tr>
297+
<Th>Name</Th>
298+
<Th>ID</Th>
299+
<Th>Status</Th>
300+
</Tr>
301+
</Thead>
302+
<Tbody>
303+
{
304+
lockCoordinators?.lockCoordinators.map((coordinator, index) => {
305+
return <Tr>
306+
<Td>{coordinator.name}</Td>
307+
<Td>{coordinator.lockId}</Td>
308+
<Td>{coordinator.status}</Td>
309+
</Tr>
310+
})
311+
}
312+
</Tbody>
313+
</Table>
314+
</CardBody>
315+
</Card>
316+
</GridItem>
317+
</Grid>
318+
</ExpandableSection>}
274319
<ExpandableSection toggleTextExpanded="Acceptors" toggleTextCollapsed="Acceptors">
275320
<Grid hasGutter span={4}>
276321
{

0 commit comments

Comments
 (0)