Skip to content

Commit efe5f70

Browse files
Patrick Johnsonjdeppe-pivotal
Patrick Johnson
authored andcommitted
GEODE-7715: Introduce Transport and Config interfaces to ClusterManagementServiceBuilder (apache#4601)
This introduces several new interfaces to the `ClusterManagementService`. These are: - `ClusterManagmentServiceTransport` which represents the message exchange between client and endpoint. - `ClusterManagementServiceConnectionConfig` which is a data object and represents various properties required to establish a connection.
1 parent 9f4d70b commit efe5f70

File tree

47 files changed

+1340
-571
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1340
-571
lines changed

geode-assembly/src/acceptanceTest/resources/ManagementClientCreateRegion.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import javax.net.ssl.SSLContext;
1717

18+
import org.apache.geode.management.api.BaseConnectionConfig;
1819
import org.apache.geode.management.api.ClusterManagementResult;
1920
import org.apache.geode.management.api.ClusterManagementService;
2021
import org.apache.geode.management.client.ClusterManagementServiceBuilder;
@@ -31,14 +32,14 @@ public static void main(String[] args) throws Exception {
3132
if (useSsl) {
3233
// The default SSLContext will pull in all necessary javax.net.ssl properties
3334
cms =
34-
ClusterManagementServiceBuilder.buildWithHostAddress()
35-
.setHostAddress("localhost", httpPort)
36-
.setSslContext(SSLContext.getDefault()).build();
37-
} else {
38-
cms =
39-
ClusterManagementServiceBuilder.buildWithHostAddress()
40-
.setHostAddress("localhost", httpPort)
35+
new ClusterManagementServiceBuilder().setConnectionConfig(
36+
new BaseConnectionConfig("localhost", httpPort)
37+
.setSslContext(SSLContext.getDefault()))
4138
.build();
39+
40+
} else {
41+
cms = new ClusterManagementServiceBuilder().setConnectionConfig(
42+
new BaseConnectionConfig("localhost", httpPort)).build();
4243
}
4344

4445
// create region

geode-assembly/src/distributedTest/java/org/apache/geode/management/JQFilterVerificationDUnitTest.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@
3434
import org.junit.ClassRule;
3535
import org.junit.Test;
3636

37+
import org.apache.geode.management.api.BaseConnectionConfig;
3738
import org.apache.geode.management.api.ClusterManagementService;
39+
import org.apache.geode.management.api.ConnectionConfig;
3840
import org.apache.geode.management.client.ClusterManagementServiceBuilder;
3941
import org.apache.geode.management.configuration.Index;
4042
import org.apache.geode.management.configuration.IndexType;
@@ -66,8 +68,10 @@ public class JQFilterVerificationDUnitTest {
6668
public static void beforeClass() throws IOException {
6769
MemberVM locator = cluster.startLocatorVM(0, MemberStarterRule::withHttpService);
6870
cluster.startServerVM(1, locator.getPort());
69-
ClusterManagementService cms = ClusterManagementServiceBuilder.buildWithHostAddress()
70-
.setHostAddress("localhost", locator.getHttpPort()).build();
71+
ConnectionConfig connectionConfig =
72+
new BaseConnectionConfig("localhost", locator.getHttpPort());
73+
ClusterManagementService cms =
74+
new ClusterManagementServiceBuilder().setConnectionConfig(connectionConfig).build();
7175
Region region = new Region();
7276
region.setName("regionA");
7377
region.setType(RegionType.REPLICATE);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
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.client;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
20+
import org.junit.BeforeClass;
21+
import org.junit.ClassRule;
22+
import org.junit.Test;
23+
import org.springframework.web.client.RestTemplate;
24+
25+
import org.apache.geode.management.api.BaseConnectionConfig;
26+
import org.apache.geode.management.api.ConnectionConfig;
27+
import org.apache.geode.management.api.RestTemplateClusterManagementServiceTransport;
28+
import org.apache.geode.test.dunit.rules.ClusterStartupRule;
29+
import org.apache.geode.test.dunit.rules.MemberVM;
30+
import org.apache.geode.test.junit.rules.MemberStarterRule;
31+
32+
public class ClusterManagementServiceBuilderDUnitTest {
33+
34+
@ClassRule
35+
public static ClusterStartupRule cluster = new ClusterStartupRule(1);
36+
37+
@BeforeClass
38+
public static void beforeClass() {
39+
40+
MemberVM locator = cluster.startLocatorVM(0, MemberStarterRule::withHttpService);
41+
connectionConfig = new BaseConnectionConfig("localhost", locator.getHttpPort());
42+
}
43+
44+
private static ConnectionConfig connectionConfig;
45+
46+
@Test
47+
public void buildWithTransportOnlyHavingConnectionConfig() {
48+
assertThat(new ClusterManagementServiceBuilder().setTransport(
49+
new RestTemplateClusterManagementServiceTransport(connectionConfig)).build().isConnected())
50+
.isTrue();
51+
}
52+
53+
@Test
54+
public void buildWithTransportOnlyHavingRestTemplate() {
55+
assertThat(new ClusterManagementServiceBuilder().setTransport(
56+
new RestTemplateClusterManagementServiceTransport(new RestTemplate())).build()
57+
.isConnected()).isFalse();
58+
}
59+
60+
@Test
61+
public void buildWithTransportOnlyHavingRestTemplateAndConnectionConfig() {
62+
assertThat(new ClusterManagementServiceBuilder().setTransport(
63+
new RestTemplateClusterManagementServiceTransport(new RestTemplate(), connectionConfig))
64+
.build().isConnected()).isTrue();
65+
}
66+
67+
@Test
68+
public void buildWithConnectionConfigOnly() {
69+
assertThat(new ClusterManagementServiceBuilder()
70+
.setConnectionConfig(connectionConfig).build().isConnected()).isTrue();
71+
}
72+
73+
@Test
74+
public void buildWithTransportHavingRestTemplateAndConnectionConfig() {
75+
assertThat(new ClusterManagementServiceBuilder().setTransport(
76+
new RestTemplateClusterManagementServiceTransport(new RestTemplate()))
77+
.setConnectionConfig(connectionConfig).build().isConnected()).isTrue();
78+
}
79+
80+
@Test
81+
public void buildWithTransportHavingConnectionConfigAndConnectionConfig() {
82+
assertThat(new ClusterManagementServiceBuilder().setTransport(
83+
new RestTemplateClusterManagementServiceTransport(connectionConfig))
84+
.setConnectionConfig(connectionConfig).build().isConnected()).isTrue();
85+
}
86+
87+
@Test
88+
public void buildWithTransportHavingConnectionConfigAndRestTemplateAndConnectionConfig() {
89+
assertThat(new ClusterManagementServiceBuilder().setTransport(
90+
new RestTemplateClusterManagementServiceTransport(new RestTemplate(), connectionConfig))
91+
.setConnectionConfig(connectionConfig).build().isConnected()).isTrue();
92+
}
93+
94+
@Test(expected = IllegalStateException.class)
95+
public void buildWithNothing() {
96+
new ClusterManagementServiceBuilder().build();
97+
}
98+
}

geode-assembly/src/distributedTest/java/org/apache/geode/management/client/CreateRegionWithDiskstoreAndSecurityDUnitTest.java

+16-10
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.junit.rules.TemporaryFolder;
2727

2828
import org.apache.geode.examples.SimpleSecurityManager;
29+
import org.apache.geode.management.api.BaseConnectionConfig;
2930
import org.apache.geode.management.api.ClusterManagementResult;
3031
import org.apache.geode.management.api.ClusterManagementService;
3132
import org.apache.geode.management.configuration.Region;
@@ -78,9 +79,11 @@ public void createReplicateRegionWithDiskstoreWithoutDataManage() {
7879
regionConfig.setDiskStoreName("DISKSTORE");
7980

8081
ClusterManagementService client =
81-
ClusterManagementServiceBuilder.buildWithHostAddress()
82-
.setHostAddress("localhost", locator.getHttpPort())
83-
.setCredentials("user", "user").build();
82+
new ClusterManagementServiceBuilder().setConnectionConfig(
83+
new BaseConnectionConfig("localhost", locator.getHttpPort())
84+
.setUsername("user").setPassword("user"))
85+
.build();
86+
8487
assertThatThrownBy(() -> client.create(regionConfig))
8588
.hasMessageContaining("UNAUTHORIZED: User not authorized for DATA:MANAGE");
8689
}
@@ -98,9 +101,11 @@ public void createReplicateRegionWithDiskstoreWithoutClusterWrite() {
98101
regionConfig.setDiskStoreName("DISKSTORE");
99102

100103
ClusterManagementService client =
101-
ClusterManagementServiceBuilder.buildWithHostAddress()
102-
.setHostAddress("localhost", locator.getHttpPort())
103-
.setCredentials("data", "data").build();
104+
new ClusterManagementServiceBuilder().setConnectionConfig(
105+
new BaseConnectionConfig("localhost", locator.getHttpPort())
106+
.setUsername("data").setPassword("data"))
107+
.build();
108+
104109
assertThatThrownBy(() -> client.create(regionConfig))
105110
.hasMessageContaining("UNAUTHORIZED: Data not authorized for CLUSTER:WRITE:DISK");
106111
}
@@ -119,9 +124,11 @@ public void createReplicateRegionWithDiskstoreSuccess() {
119124
regionConfig.setDiskStoreName("DISKSTORE");
120125

121126
ClusterManagementService client =
122-
ClusterManagementServiceBuilder.buildWithHostAddress()
123-
.setHostAddress("localhost", locator.getHttpPort())
124-
.setCredentials("data,cluster", "data,cluster").build();
127+
new ClusterManagementServiceBuilder().setConnectionConfig(
128+
new BaseConnectionConfig("localhost", locator.getHttpPort())
129+
.setUsername("data,cluster").setPassword("data,cluster"))
130+
.build();
131+
125132
ClusterManagementResult result = client.create(regionConfig);
126133
assertThat(result.isSuccessful()).isTrue();
127134

@@ -131,5 +138,4 @@ public void createReplicateRegionWithDiskstoreSuccess() {
131138
gfsh.executeAndAssertThat("describe region --name=REGION1").statusIsSuccess()
132139
.hasTableSection().hasColumn("Value").contains("DISKSTORE");
133140
}
134-
135141
}

geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClientClusterManagementSSLTest.java

+43-34
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121
import static org.apache.geode.distributed.ConfigurationProperties.SSL_TRUSTSTORE;
2222
import static org.apache.geode.distributed.ConfigurationProperties.SSL_TRUSTSTORE_PASSWORD;
2323
import static org.apache.geode.lang.Identifiable.find;
24-
import static org.apache.geode.management.builder.ClusterManagementServiceBuilder.buildWithCache;
25-
import static org.apache.geode.management.client.ClusterManagementServiceBuilder.buildWithHostAddress;
2624
import static org.assertj.core.api.Assertions.assertThat;
2725
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2826

@@ -41,12 +39,15 @@
4139
import org.apache.geode.cache.configuration.CacheConfig;
4240
import org.apache.geode.examples.SimpleSecurityManager;
4341
import org.apache.geode.internal.security.SecurableCommunicationChannel;
42+
import org.apache.geode.management.api.BaseConnectionConfig;
4443
import org.apache.geode.management.api.ClusterManagementRealizationResult;
4544
import org.apache.geode.management.api.ClusterManagementResult;
4645
import org.apache.geode.management.api.ClusterManagementService;
4746
import org.apache.geode.management.api.RealizationResult;
47+
import org.apache.geode.management.client.ClusterManagementServiceBuilder;
4848
import org.apache.geode.management.configuration.Region;
4949
import org.apache.geode.management.configuration.RegionType;
50+
import org.apache.geode.management.internal.api.GeodeConnectionConfig;
5051
import org.apache.geode.test.dunit.VM;
5152
import org.apache.geode.test.dunit.rules.ClusterStartupRule;
5253
import org.apache.geode.test.dunit.rules.MemberVM;
@@ -100,11 +101,12 @@ public void createRegion_Successful() {
100101
client.invoke(() -> {
101102
SSLContext sslContext = SSLContext.getDefault();
102103
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
103-
ClusterManagementService cmsClient = buildWithHostAddress()
104-
.setHostAddress("localhost", httpPort)
105-
.setSslContext(sslContext)
106-
.setHostnameVerifier(hostnameVerifier)
107-
.setCredentials("dataManage", "dataManage").build();
104+
ClusterManagementService cmsClient =
105+
new ClusterManagementServiceBuilder().setConnectionConfig(
106+
new BaseConnectionConfig("localhost", httpPort)
107+
.setSslContext(sslContext).setUsername("dataManage").setPassword("dataManage")
108+
.setHostnameVerifier(hostnameVerifier))
109+
.build();
108110

109111
ClusterManagementRealizationResult result = cmsClient.create(region);
110112
assertThat(result.isSuccessful()).isTrue();
@@ -122,10 +124,12 @@ public void createRegion_NoSsl() {
122124
int httpPort = locator.getHttpPort();
123125

124126
client.invoke(() -> {
125-
ClusterManagementService cmsClient = buildWithHostAddress()
126-
.setHostAddress("localhost", httpPort)
127-
.setSslContext(null)
128-
.setCredentials("dataManage", "dataManage").build();
127+
ClusterManagementService cmsClient =
128+
new ClusterManagementServiceBuilder().setConnectionConfig(
129+
new BaseConnectionConfig("localhost", httpPort)
130+
.setSslContext(null).setUsername("dataManage").setPassword("dataManage"))
131+
.build();
132+
129133
assertThatThrownBy(() -> cmsClient.create(region))
130134
.isInstanceOf(ResourceAccessException.class);
131135
});
@@ -141,11 +145,12 @@ public void createRegion_WrongPassword() {
141145
client.invoke(() -> {
142146
SSLContext sslContext = SSLContext.getDefault();
143147
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
144-
ClusterManagementService cmsClient = buildWithHostAddress()
145-
.setHostAddress("localhost", httpPort)
146-
.setSslContext(sslContext)
147-
.setHostnameVerifier(hostnameVerifier)
148-
.setCredentials("dataManage", "wrongPassword").build();
148+
ClusterManagementService cmsClient =
149+
new ClusterManagementServiceBuilder().setConnectionConfig(
150+
new BaseConnectionConfig("localhost", httpPort)
151+
.setSslContext(sslContext).setUsername("dataManage").setPassword("wrongPassword")
152+
.setHostnameVerifier(hostnameVerifier))
153+
.build();
149154

150155
assertThatThrownBy(() -> cmsClient.create(region)).hasMessageContaining("UNAUTHENTICATED");
151156
});
@@ -162,11 +167,11 @@ public void createRegion_NoUser() {
162167
SSLContext sslContext = SSLContext.getDefault();
163168
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
164169

165-
ClusterManagementService cmsClient = buildWithHostAddress()
166-
.setHostAddress("localhost", httpPort)
167-
.setSslContext(sslContext)
168-
.setHostnameVerifier(hostnameVerifier)
169-
.build();
170+
ClusterManagementService cmsClient =
171+
new ClusterManagementServiceBuilder().setConnectionConfig(
172+
new BaseConnectionConfig("localhost", httpPort)
173+
.setSslContext(sslContext).setHostnameVerifier(hostnameVerifier))
174+
.build();
170175

171176
assertThatThrownBy(() -> cmsClient.create(region)).hasMessageContaining("UNAUTHENTICATED");
172177
});
@@ -182,11 +187,12 @@ public void createRegion_NoPassword() {
182187
client.invoke(() -> {
183188
SSLContext sslContext = SSLContext.getDefault();
184189
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
185-
ClusterManagementService cmsClient = buildWithHostAddress()
186-
.setHostAddress("localhost", httpPort)
187-
.setSslContext(sslContext)
188-
.setHostnameVerifier(hostnameVerifier)
189-
.setCredentials("dataManage", null).build();
190+
ClusterManagementService cmsClient =
191+
new ClusterManagementServiceBuilder().setConnectionConfig(
192+
new BaseConnectionConfig("localhost", httpPort)
193+
.setSslContext(sslContext).setUsername("dataManage").setPassword(null)
194+
.setHostnameVerifier(hostnameVerifier))
195+
.build();
190196

191197
assertThatThrownBy(() -> cmsClient.create(region)).hasMessageContaining("UNAUTHENTICATED");
192198
});
@@ -202,11 +208,12 @@ public void createRegion_NoPrivilege() {
202208
client.invoke(() -> {
203209
SSLContext sslContext = SSLContext.getDefault();
204210
HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
205-
ClusterManagementService cmsClient = buildWithHostAddress()
206-
.setHostAddress("localhost", httpPort)
207-
.setSslContext(sslContext)
208-
.setHostnameVerifier(hostnameVerifier)
209-
.setCredentials("dataRead", "dataRead").build();
211+
ClusterManagementService cmsClient =
212+
new ClusterManagementServiceBuilder().setConnectionConfig(
213+
new BaseConnectionConfig("localhost", httpPort)
214+
.setSslContext(sslContext).setUsername("dataRead").setPassword("dataRead")
215+
.setHostnameVerifier(hostnameVerifier))
216+
.build();
210217

211218
assertThatThrownBy(() -> cmsClient.create(region)).hasMessageContaining("UNAUTHORIZED");
212219
});
@@ -216,9 +223,11 @@ public void createRegion_NoPrivilege() {
216223
public void invokeFromServer() {
217224
server.invoke(() -> {
218225
// when getting the service from the server, we don't need to provide the host information
219-
ClusterManagementService cmsClient = buildWithCache()
220-
.setCache(ClusterStartupRule.getCache())
221-
.setCredentials("dataManage", "dataManage").build();
226+
ClusterManagementService cmsClient =
227+
new ClusterManagementServiceBuilder().setConnectionConfig(
228+
new GeodeConnectionConfig(ClusterStartupRule.getCache())
229+
.setUsername("dataManage").setPassword("dataManage"))
230+
.build();
222231
Region region = new Region();
223232
region.setName("orders");
224233
region.setType(RegionType.PARTITION);

0 commit comments

Comments
 (0)