Skip to content

Commit 7ae9996

Browse files
YehEmilykirklund
authored andcommitted
GEODE-3253: Refactoring ClientCommands and related tests
This closes apache#650
1 parent e0aa1b0 commit 7ae9996

File tree

8 files changed

+1047
-861
lines changed

8 files changed

+1047
-861
lines changed

geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ClientCommands.java geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeClientCommand.java

+11-102
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@
1212
* or implied. See the License for the specific language governing permissions and limitations under
1313
* the License.
1414
*/
15+
1516
package org.apache.geode.management.internal.cli.commands;
1617

1718
import java.util.ArrayList;
1819
import java.util.Arrays;
19-
import java.util.HashMap;
2020
import java.util.List;
2121
import java.util.Map;
22-
import java.util.Map.Entry;
2322
import java.util.Set;
2423

2524
import javax.management.ObjectName;
@@ -38,110 +37,18 @@
3837
import org.apache.geode.management.internal.cli.CliUtil;
3938
import org.apache.geode.management.internal.cli.LogWrapper;
4039
import org.apache.geode.management.internal.cli.functions.ContinuousQueryFunction;
41-
import org.apache.geode.management.internal.cli.functions.ContinuousQueryFunction.ClientInfo;
4240
import org.apache.geode.management.internal.cli.i18n.CliStrings;
4341
import org.apache.geode.management.internal.cli.result.CompositeResultData;
44-
import org.apache.geode.management.internal.cli.result.CompositeResultData.SectionResultData;
4542
import org.apache.geode.management.internal.cli.result.ResultBuilder;
4643
import org.apache.geode.management.internal.cli.result.TabularResultData;
4744
import org.apache.geode.management.internal.security.ResourceOperation;
48-
import org.apache.geode.security.ResourcePermission.Operation;
49-
import org.apache.geode.security.ResourcePermission.Resource;
50-
51-
/**
52-
* @since GemFire 8.0
53-
*/
54-
public class ClientCommands implements GfshCommand {
55-
56-
@CliCommand(value = CliStrings.LIST_CLIENTS, help = CliStrings.LIST_CLIENT__HELP)
57-
@CliMetaData(relatedTopic = {CliStrings.TOPIC_CLIENT})
58-
@ResourceOperation(resource = Resource.CLUSTER, operation = Operation.READ)
59-
public Result listClient() {
60-
Result result;
61-
62-
try {
63-
CompositeResultData compositeResultData = ResultBuilder.createCompositeResultData();
64-
SectionResultData section = compositeResultData.addSection("section1");
65-
66-
TabularResultData resultTable = section.addTable("TableForClientList");
67-
String headerText = "ClientList";
68-
resultTable = resultTable.setHeader(headerText);
69-
70-
InternalCache cache = getCache();
71-
ManagementService service = ManagementService.getExistingManagementService(cache);
72-
ObjectName[] cacheServers = service.getDistributedSystemMXBean().listCacheServerObjectNames();
73-
74-
if (cacheServers.length == 0) {
75-
return ResultBuilder.createGemFireErrorResult(
76-
CliStrings.format(CliStrings.LIST_CLIENT_COULD_NOT_RETRIEVE_SERVER_LIST));
77-
}
78-
79-
Map<String, List<String>> clientServerMap = new HashMap<>();
80-
81-
for (ObjectName objName : cacheServers) {
82-
CacheServerMXBean serverMbean = service.getMBeanInstance(objName, CacheServerMXBean.class);
83-
String[] listOfClient = serverMbean.getClientIds();
84-
85-
if (listOfClient == null || listOfClient.length == 0) {
86-
continue;
87-
}
88-
89-
90-
for (String clientName : listOfClient) {
91-
String serverDetails = "member=" + objName.getKeyProperty("member") + ",port="
92-
+ objName.getKeyProperty("port");
93-
if (clientServerMap.containsKey(clientName)) {
94-
List<String> listServers = clientServerMap.get(clientName);
95-
listServers.add(serverDetails);
96-
} else {
97-
List<String> listServer = new ArrayList<>();
98-
listServer.add(serverDetails);
99-
clientServerMap.put(clientName, listServer);
100-
}
101-
}
102-
}
103-
104-
if (clientServerMap.size() == 0) {
105-
return ResultBuilder.createGemFireErrorResult(
106-
CliStrings.format(CliStrings.LIST_COULD_NOT_RETRIEVE_CLIENT_LIST));
107-
}
108-
109-
String memberSeparator = "; ";
110-
111-
for (Entry<String, List<String>> pairs : clientServerMap.entrySet()) {
112-
String client = pairs.getKey();
113-
List<String> servers = pairs.getValue();
114-
StringBuilder serverListForClient = new StringBuilder();
115-
int serversSize = servers.size();
116-
int i = 0;
117-
for (String server : servers) {
118-
serverListForClient.append(server);
119-
if (i < serversSize - 1) {
120-
serverListForClient.append(memberSeparator);
121-
}
122-
i++;
123-
}
124-
resultTable.accumulate(CliStrings.LIST_CLIENT_COLUMN_Clients, client);
125-
resultTable.accumulate(CliStrings.LIST_CLIENT_COLUMN_SERVERS,
126-
serverListForClient.toString());
127-
}
128-
result = ResultBuilder.buildResult(compositeResultData);
129-
130-
} catch (Exception e) {
131-
LogWrapper.getInstance()
132-
.warning("Error in list clients. stack trace" + CliUtil.stackTraceAsString(e));
133-
result = ResultBuilder.createGemFireErrorResult(CliStrings
134-
.format(CliStrings.LIST_CLIENT_COULD_NOT_RETRIEVE_CLIENT_LIST_0, e.getMessage()));
135-
}
136-
137-
LogWrapper.getInstance().info("list client result " + result);
138-
139-
return result;
140-
}
45+
import org.apache.geode.security.ResourcePermission;
14146

47+
public class DescribeClientCommand implements GfshCommand {
14248
@CliCommand(value = CliStrings.DESCRIBE_CLIENT, help = CliStrings.DESCRIBE_CLIENT__HELP)
14349
@CliMetaData(relatedTopic = {CliStrings.TOPIC_CLIENT})
144-
@ResourceOperation(resource = Resource.CLUSTER, operation = Operation.READ)
50+
@ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
51+
operation = ResourcePermission.Operation.READ)
14552
public Result describeClient(@CliOption(key = CliStrings.DESCRIBE_CLIENT__ID, mandatory = true,
14653
help = CliStrings.DESCRIBE_CLIENT__ID__HELP) String clientId) {
14754
Result result;
@@ -160,7 +67,8 @@ public Result describeClient(@CliOption(key = CliStrings.DESCRIBE_CLIENT__ID, ma
16067

16168
try {
16269
CompositeResultData compositeResultData = ResultBuilder.createCompositeResultData();
163-
SectionResultData sectionResult = compositeResultData.addSection("InfoSection");
70+
CompositeResultData.SectionResultData sectionResult =
71+
compositeResultData.addSection("InfoSection");
16472
InternalCache cache = getCache();
16573

16674
ManagementService service = ManagementService.getExistingManagementService(cache);
@@ -219,7 +127,8 @@ public Result describeClient(@CliOption(key = CliStrings.DESCRIBE_CLIENT__ID, ma
219127
}
220128

221129
if (object != null) {
222-
ClientInfo objectResult = (ClientInfo) object;
130+
ContinuousQueryFunction.ClientInfo objectResult =
131+
(ContinuousQueryFunction.ClientInfo) object;
223132
isDurable = objectResult.isDurable;
224133

225134
if (objectResult.primaryServer != null && objectResult.primaryServer.length() > 0) {
@@ -265,7 +174,7 @@ public Result describeClient(@CliOption(key = CliStrings.DESCRIBE_CLIENT__ID, ma
265174
return result;
266175
}
267176

268-
private void buildTableResult(SectionResultData sectionResult,
177+
private void buildTableResult(CompositeResultData.SectionResultData sectionResult,
269178
ClientHealthStatus clientHealthStatus, String isDurable, List<String> primaryServers,
270179
List<String> secondaryServers) {
271180

@@ -305,7 +214,7 @@ private void buildTableResult(SectionResultData sectionResult,
305214
Map<String, String> poolStats = clientHealthStatus.getPoolStats();
306215

307216
if (poolStats.size() > 0) {
308-
for (Entry<String, String> entry : poolStats.entrySet()) {
217+
for (Map.Entry<String, String> entry : poolStats.entrySet()) {
309218
TabularResultData poolStatsResultTable =
310219
sectionResult.addTable("Pool Stats For Pool Name = " + entry.getKey());
311220
poolStatsResultTable.setHeader("Pool Stats For Pool Name = " + entry.getKey());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
3+
* agreements. See the NOTICE file distributed with this work for additional information regarding
4+
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
5+
* "License"); you may not use this file except in compliance with the License. You may obtain a
6+
* copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software distributed under the License
11+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12+
* or implied. See the License for the specific language governing permissions and limitations under
13+
* the License.
14+
*/
15+
16+
package org.apache.geode.management.internal.cli.commands;
17+
18+
import java.util.ArrayList;
19+
import java.util.HashMap;
20+
import java.util.List;
21+
import java.util.Map;
22+
23+
import javax.management.ObjectName;
24+
25+
import org.springframework.shell.core.annotation.CliCommand;
26+
27+
import org.apache.geode.internal.cache.InternalCache;
28+
import org.apache.geode.management.CacheServerMXBean;
29+
import org.apache.geode.management.ManagementService;
30+
import org.apache.geode.management.cli.CliMetaData;
31+
import org.apache.geode.management.cli.Result;
32+
import org.apache.geode.management.internal.cli.CliUtil;
33+
import org.apache.geode.management.internal.cli.LogWrapper;
34+
import org.apache.geode.management.internal.cli.i18n.CliStrings;
35+
import org.apache.geode.management.internal.cli.result.CompositeResultData;
36+
import org.apache.geode.management.internal.cli.result.ResultBuilder;
37+
import org.apache.geode.management.internal.cli.result.TabularResultData;
38+
import org.apache.geode.management.internal.security.ResourceOperation;
39+
import org.apache.geode.security.ResourcePermission;
40+
41+
public class ListClientCommand implements GfshCommand {
42+
@CliCommand(value = CliStrings.LIST_CLIENTS, help = CliStrings.LIST_CLIENT__HELP)
43+
@CliMetaData(relatedTopic = {CliStrings.TOPIC_CLIENT})
44+
@ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
45+
operation = ResourcePermission.Operation.READ)
46+
public Result listClient() {
47+
Result result;
48+
49+
try {
50+
CompositeResultData compositeResultData = ResultBuilder.createCompositeResultData();
51+
CompositeResultData.SectionResultData section = compositeResultData.addSection("section1");
52+
53+
TabularResultData resultTable = section.addTable("TableForClientList");
54+
String headerText = "ClientList";
55+
resultTable = resultTable.setHeader(headerText);
56+
57+
InternalCache cache = getCache();
58+
ManagementService service = ManagementService.getExistingManagementService(cache);
59+
ObjectName[] cacheServers = service.getDistributedSystemMXBean().listCacheServerObjectNames();
60+
61+
if (cacheServers.length == 0) {
62+
return ResultBuilder.createGemFireErrorResult(
63+
CliStrings.format(CliStrings.LIST_CLIENT_COULD_NOT_RETRIEVE_SERVER_LIST));
64+
}
65+
66+
Map<String, List<String>> clientServerMap = new HashMap<>();
67+
68+
for (ObjectName objName : cacheServers) {
69+
CacheServerMXBean serverMbean = service.getMBeanInstance(objName, CacheServerMXBean.class);
70+
String[] listOfClient = serverMbean.getClientIds();
71+
72+
if (listOfClient == null || listOfClient.length == 0) {
73+
continue;
74+
}
75+
76+
77+
for (String clientName : listOfClient) {
78+
String serverDetails = "member=" + objName.getKeyProperty("member") + ",port="
79+
+ objName.getKeyProperty("port");
80+
if (clientServerMap.containsKey(clientName)) {
81+
List<String> listServers = clientServerMap.get(clientName);
82+
listServers.add(serverDetails);
83+
} else {
84+
List<String> listServer = new ArrayList<>();
85+
listServer.add(serverDetails);
86+
clientServerMap.put(clientName, listServer);
87+
}
88+
}
89+
}
90+
91+
if (clientServerMap.size() == 0) {
92+
return ResultBuilder.createGemFireErrorResult(
93+
CliStrings.format(CliStrings.LIST_COULD_NOT_RETRIEVE_CLIENT_LIST));
94+
}
95+
96+
String memberSeparator = "; ";
97+
98+
for (Map.Entry<String, List<String>> pairs : clientServerMap.entrySet()) {
99+
String client = pairs.getKey();
100+
List<String> servers = pairs.getValue();
101+
StringBuilder serverListForClient = new StringBuilder();
102+
int serversSize = servers.size();
103+
int i = 0;
104+
for (String server : servers) {
105+
serverListForClient.append(server);
106+
if (i < serversSize - 1) {
107+
serverListForClient.append(memberSeparator);
108+
}
109+
i++;
110+
}
111+
resultTable.accumulate(CliStrings.LIST_CLIENT_COLUMN_Clients, client);
112+
resultTable.accumulate(CliStrings.LIST_CLIENT_COLUMN_SERVERS,
113+
serverListForClient.toString());
114+
}
115+
result = ResultBuilder.buildResult(compositeResultData);
116+
117+
} catch (Exception e) {
118+
LogWrapper.getInstance()
119+
.warning("Error in list clients. stack trace" + CliUtil.stackTraceAsString(e));
120+
result = ResultBuilder.createGemFireErrorResult(CliStrings
121+
.format(CliStrings.LIST_CLIENT_COULD_NOT_RETRIEVE_CLIENT_LIST_0, e.getMessage()));
122+
}
123+
124+
LogWrapper.getInstance().info("list client result " + result);
125+
126+
return result;
127+
}
128+
}

geode-core/src/main/java/org/apache/geode/management/internal/web/controllers/ClientCommandsController.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,21 @@
1414
*/
1515
package org.apache.geode.management.internal.web.controllers;
1616

17-
import org.apache.geode.management.internal.cli.i18n.CliStrings;
18-
import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
19-
2017
import org.springframework.stereotype.Controller;
2118
import org.springframework.web.bind.annotation.PathVariable;
2219
import org.springframework.web.bind.annotation.RequestMapping;
2320
import org.springframework.web.bind.annotation.RequestMethod;
2421
import org.springframework.web.bind.annotation.ResponseBody;
2522

23+
import org.apache.geode.management.internal.cli.i18n.CliStrings;
24+
import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
25+
2626
/**
2727
* The ShellCommandsController class implements GemFire REST API calls for Gfsh Shell Commands.
2828
* <p/>
2929
*
30-
* @see org.apache.geode.management.internal.cli.commands.ClientCommands
30+
* @see org.apache.geode.management.internal.cli.commands.ListClientCommand
31+
* @see org.apache.geode.management.internal.cli.commands.DescribeClientCommand
3132
* @see org.apache.geode.management.internal.web.controllers.AbstractCommandsController
3233
* @see org.springframework.stereotype.Controller
3334
* @see org.springframework.web.bind.annotation.RequestMapping

geode-core/src/test/java/org/apache/geode/management/internal/security/TestCommand.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public static List<TestCommand> getPermittedCommands(Permission permission) {
119119
}
120120

121121
private static void init() {
122-
// ClientCommands
122+
// ListClientCommand, DescribeClientCommand
123123
createTestCommand("list clients", clusterRead);
124124
createTestCommand("describe client --clientID=172.16.196.144", clusterRead);
125125

geode-core/src/test/java/org/apache/geode/test/dunit/internal/JUnit4DistributedTestCase.java

+16-15
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@
2020
import static org.apache.geode.distributed.ConfigurationProperties.STATISTIC_ARCHIVE_FILE;
2121
import static org.junit.Assert.assertNotNull;
2222

23+
import java.io.Serializable;
24+
import java.text.DecimalFormat;
25+
import java.util.Iterator;
26+
import java.util.LinkedHashSet;
27+
import java.util.Map;
28+
import java.util.Properties;
29+
import java.util.Set;
30+
31+
import org.apache.logging.log4j.Logger;
32+
import org.junit.After;
33+
import org.junit.Before;
34+
import org.junit.BeforeClass;
35+
import org.junit.Rule;
36+
2337
import org.apache.geode.admin.internal.AdminDistributedSystemImpl;
2438
import org.apache.geode.cache.Cache;
2539
import org.apache.geode.cache.Region;
@@ -57,19 +71,6 @@
5771
import org.apache.geode.test.dunit.LogWriterUtils;
5872
import org.apache.geode.test.dunit.standalone.DUnitLauncher;
5973
import org.apache.geode.test.junit.rules.serializable.SerializableTestName;
60-
import org.apache.logging.log4j.Logger;
61-
import org.junit.After;
62-
import org.junit.Before;
63-
import org.junit.BeforeClass;
64-
import org.junit.Rule;
65-
66-
import java.io.Serializable;
67-
import java.text.DecimalFormat;
68-
import java.util.Iterator;
69-
import java.util.LinkedHashSet;
70-
import java.util.Map;
71-
import java.util.Properties;
72-
import java.util.Set;
7374

7475
/**
7576
* This class is the base class for all distributed tests using JUnit 4.
@@ -210,8 +211,8 @@ public final InternalDistributedSystem getSystem(final Properties props) {
210211
}
211212
} else {
212213
Properties activeProps = system.getProperties();
213-
for (Iterator iter = props.entrySet().iterator(); iter.hasNext();) {
214-
Map.Entry entry = (Map.Entry) iter.next();
214+
for (Map.Entry<Object, Object> objectObjectEntry : props.entrySet()) {
215+
Map.Entry entry = objectObjectEntry;
215216
String key = (String) entry.getKey();
216217
String value = (String) entry.getValue();
217218
if (!value.equals(activeProps.getProperty(key))) {

0 commit comments

Comments
 (0)