| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more contributor license |
| * agreements. See the NOTICE file distributed with this work for additional information regarding |
| * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance with the License. You may obtain a |
| * copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software distributed under the License |
| * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package org.apache.geode.cache; |
| |
| import static org.apache.geode.cache.client.ClientRegionShortcut.CACHING_PROXY; |
| import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_CLIENT_AUTH_INIT; |
| import static org.apache.geode.test.awaitility.GeodeAwaitility.await; |
| import static org.assertj.core.api.Assertions.assertThat; |
| |
| import java.util.Properties; |
| |
| import org.apache.logging.log4j.Logger; |
| import org.junit.Before; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.experimental.categories.Category; |
| |
| import org.apache.geode.cache.client.ClientCache; |
| import org.apache.geode.cache.client.ClientCacheFactory; |
| import org.apache.geode.cache.client.Pool; |
| import org.apache.geode.cache.client.PoolFactory; |
| import org.apache.geode.cache.client.PoolManager; |
| import org.apache.geode.distributed.ConfigurationProperties; |
| import org.apache.geode.distributed.internal.InternalDistributedSystem; |
| import org.apache.geode.internal.cache.InternalCache; |
| import org.apache.geode.logging.internal.log4j.api.LogService; |
| import org.apache.geode.management.CacheServerMXBean; |
| import org.apache.geode.management.ClientHealthStatus; |
| import org.apache.geode.management.ManagementService; |
| import org.apache.geode.management.internal.SystemManagementService; |
| import org.apache.geode.management.internal.cli.i18n.CliStrings; |
| import org.apache.geode.security.templates.UserPasswordAuthInit; |
| import org.apache.geode.test.dunit.rules.ClusterStartupRule; |
| import org.apache.geode.test.dunit.rules.MemberVM; |
| import org.apache.geode.test.junit.categories.ClientServerTest; |
| import org.apache.geode.test.junit.rules.GfshCommandRule; |
| |
| @Category({ClientServerTest.class}) |
| public class ClientStatisticsPublicationSecurityDUnitTest { |
| private static MemberVM locator, server; |
| |
| @Rule |
| public final GfshCommandRule gfsh = new GfshCommandRule(); |
| |
| @Rule |
| public final ClusterStartupRule cluster = new ClusterStartupRule(); |
| |
| private static final Logger log = LogService.getLogger(); |
| |
| @Before |
| public void before() { |
| Properties locatorProps = new Properties(); |
| locatorProps.setProperty(CliStrings.START_LOCATOR__MEMBER_NAME, "locator1"); |
| locatorProps.setProperty("security-manager", "org.apache.geode.examples.SimpleSecurityManager"); |
| locator = cluster.startLocatorVM(0, locatorProps); |
| |
| Properties serverProps = new Properties(); |
| serverProps.setProperty(CliStrings.START_SERVER__NAME, "server1"); |
| serverProps.setProperty(CliStrings.START_SERVER__LOCATORS, |
| "localhost[" + locator.getPort() + "]"); |
| serverProps.setProperty("security-manager", "org.apache.geode.examples.SimpleSecurityManager"); |
| serverProps.setProperty("security-username", "cluster"); |
| serverProps.setProperty("security-password", "cluster"); |
| server = cluster.startServerVM(1, serverProps); |
| server.invoke(() -> { |
| InternalCache cache = InternalDistributedSystem.getConnectedInstance().getCache(); |
| |
| cache.createRegionFactory(RegionShortcut.REPLICATE).create("regionName"); |
| }); |
| locator.waitUntilRegionIsReadyOnExactlyThisManyServers("/regionName", 1); |
| } |
| |
| @Test |
| public void testClientCanPublishStatisticsWithSecurity() throws Exception { |
| final String regionName = "regionName"; |
| |
| ClientCache client = new ClientCacheFactory() |
| .set(ConfigurationProperties.LOG_LEVEL, "fine") |
| .set(ConfigurationProperties.LOG_FILE, "") |
| .set("security-manager", "org.apache.geode.examples.SimpleSecurityManager") |
| .set("security-username", "data") |
| .set("security-password", "data") |
| .set(SECURITY_CLIENT_AUTH_INIT, UserPasswordAuthInit.class.getName()) |
| .create(); |
| PoolFactory poolFactory = PoolManager.createFactory(); |
| poolFactory.addServer("localhost", server.getPort()); |
| poolFactory.setStatisticInterval(1000); |
| poolFactory.setSubscriptionEnabled(true); |
| Pool pool = poolFactory.create("poolName"); |
| |
| |
| Region region = |
| client.createClientRegionFactory(CACHING_PROXY).setPoolName("poolName").create(regionName); |
| |
| checkClientHealthStatus(0, "poolName"); |
| |
| region.put("key", "value"); |
| |
| checkClientHealthStatus(1, "poolName"); |
| |
| client.close(false); |
| } |
| |
| private void checkClientHealthStatus(int expectedNumPuts, |
| String... expectedPoolStatKeys) { |
| final int serverPort = server.getPort(); |
| server.invoke(() -> { |
| await().untilAsserted(() -> { |
| Cache cache = ClusterStartupRule.getCache(); |
| SystemManagementService service = |
| (SystemManagementService) ManagementService.getExistingManagementService(cache); |
| CacheServerMXBean serviceMBean = service.getJMXAdapter().getClientServiceMXBean(serverPort); |
| String clientId = serviceMBean.getClientIds()[0]; |
| ClientHealthStatus status = serviceMBean.showClientStats(clientId); |
| |
| assertThat(status.getNumOfPuts()).isEqualTo(expectedNumPuts); |
| assertThat(status.getPoolStats().keySet()) |
| .containsExactlyInAnyOrder(expectedPoolStatKeys); |
| }); |
| }); |
| } |
| } |