Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 0B10E200D5A for ; Thu, 30 Nov 2017 00:37:06 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 0974B160C16; Wed, 29 Nov 2017 23:37:06 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 00D6F160C04 for ; Thu, 30 Nov 2017 00:37:04 +0100 (CET) Received: (qmail 2481 invoked by uid 500); 29 Nov 2017 23:37:04 -0000 Mailing-List: contact issues-help@geode.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@geode.apache.org Delivered-To: mailing list issues@geode.apache.org Received: (qmail 2472 invoked by uid 99); 29 Nov 2017 23:37:04 -0000 Received: from pnap-us-west-generic-nat.apache.org (HELO spamd1-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 29 Nov 2017 23:37:04 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd1-us-west.apache.org (ASF Mail Server at spamd1-us-west.apache.org) with ESMTP id A965BC3D4D for ; Wed, 29 Nov 2017 23:37:03 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd1-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -99.011 X-Spam-Level: X-Spam-Status: No, score=-99.011 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KB_WAM_FROM_NAME_SINGLEWORD=0.2, SPF_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01, USER_IN_WHITELIST=-100] autolearn=disabled Received: from mx1-lw-eu.apache.org ([10.40.0.8]) by localhost (spamd1-us-west.apache.org [10.40.0.7]) (amavisd-new, port 10024) with ESMTP id C8SyH7GeFTt6 for ; Wed, 29 Nov 2017 23:37:02 +0000 (UTC) Received: from mailrelay1-us-west.apache.org (mailrelay1-us-west.apache.org [209.188.14.139]) by mx1-lw-eu.apache.org (ASF Mail Server at mx1-lw-eu.apache.org) with ESMTP id 4AC0C5F576 for ; Wed, 29 Nov 2017 23:37:01 +0000 (UTC) Received: from jira-lw-us.apache.org (unknown [207.244.88.139]) by mailrelay1-us-west.apache.org (ASF Mail Server at mailrelay1-us-west.apache.org) with ESMTP id 61A6BE0161 for ; Wed, 29 Nov 2017 23:37:00 +0000 (UTC) Received: from jira-lw-us.apache.org (localhost [127.0.0.1]) by jira-lw-us.apache.org (ASF Mail Server at jira-lw-us.apache.org) with ESMTP id 1C1B121058 for ; Wed, 29 Nov 2017 23:37:00 +0000 (UTC) Date: Wed, 29 Nov 2017 23:37:00 +0000 (UTC) From: "ASF GitHub Bot (JIRA)" To: issues@geode.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Commented] (GEODE-3955) The gfsh 'describe region' command doesn't include asyncEventQueueIds or gatewaySenderIds MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 archived-at: Wed, 29 Nov 2017 23:37:06 -0000 [ https://issues.apache.org/jira/browse/GEODE-3955?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16271793#comment-16271793 ] ASF GitHub Bot commented on GEODE-3955: --------------------------------------- PurelyApplied commented on a change in pull request #1099: GEODE-3955: Add AEQ and Gateway Sender information to 'describe region' output. URL: https://github.com/apache/geode/pull/1099#discussion_r153947571 ########## File path: geode-core/src/test/java/org/apache/geode/management/internal/cli/domain/RegionDescriptionJUnitTest.java ########## @@ -0,0 +1,312 @@ +/* + * 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.management.internal.cli.domain; + +import static org.apache.geode.cache.DataPolicy.NORMAL; +import static org.apache.geode.cache.Scope.DISTRIBUTED_ACK; +import static org.apache.geode.cache.Scope.LOCAL; +import static org.apache.geode.management.internal.cli.domain.RegionDescription.findCommon; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import java.util.HashMap; +import java.util.Map; + +import org.json.JSONObject; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +import org.apache.geode.management.cli.Result.Status; +import org.apache.geode.management.internal.cli.commands.DescribeRegionCommand; +import org.apache.geode.management.internal.cli.result.CommandResult; +import org.apache.geode.test.junit.categories.UnitTest; + +@Category(UnitTest.class) +public class RegionDescriptionJUnitTest { + private static final String evictionKeyShared = "sharedEvictionKey"; + private static final String partKeyShared = "sharedPartitionKey"; + private static final String regKeyShared = "sharedRegionKey"; + private static final String evictionValueShared = "sharedEvictionValue"; + private static final String partValueShared = "sharedPartitionValue"; + private static final String regValueShared = "sharedRegionValue"; + + private static final String evictionKeyA = "uniqueEvictionKey_A"; + private static final String partKeyA = "uniquePartitionKey_A"; + private static final String regKeyA = "uniqueRegionKey_A"; + private static final String evictionValueA = "uniqueEvictionValue_A"; + private static final String partValueA = "uniquePartitionValue_A"; + private static final String regValueA = "uniqueRegionValue_A"; + + private static final String evictionKeyB = "uniqueEvictionKey_B"; + private static final String partKeyB = "uniquePartitionKey_B"; + private static final String regKeyB = "uniqueRegionKey_B"; + private static final String evictionValueB = "uniqueEvictionValue_B"; + private static final String partValueB = "uniquePartitionValue_B"; + private static final String regValueB = "uniqueRegionValue_B"; + + public static final String regionName = "mockRegion1"; + + private static final DescribeRegionCommand command = spy(DescribeRegionCommand.class); + + @Test + public void findCommonRemovesUnsharedKeys() { + Map commonMap = new HashMap<>(); + commonMap.put(evictionKeyShared, evictionValueShared); + commonMap.put(partKeyShared, partValueShared); + commonMap.put(regKeyShared, regValueShared); + commonMap.put(evictionKeyA, evictionValueA); + commonMap.put(partKeyA, partValueA); + + Map comparisonMap = new HashMap<>(); + comparisonMap.put(evictionKeyShared, evictionValueShared); + comparisonMap.put(partKeyShared, partValueShared); + comparisonMap.put(regKeyShared, regValueShared); + commonMap.put(evictionKeyB, evictionValueB); + commonMap.put(regKeyA, regValueB); + + findCommon(commonMap, comparisonMap); + + assertThat(commonMap).containsOnlyKeys(evictionKeyShared, partKeyShared, regKeyShared); + } + + @Test + public void findCommonRemovesDisagreeingKeys() { + Map commonMap = new HashMap<>(); + commonMap.put(evictionKeyShared, evictionValueShared); + commonMap.put(partKeyShared, partValueA); + commonMap.put(regKeyShared, regValueA); + + Map comparisonMap = new HashMap<>(); + comparisonMap.put(evictionKeyShared, evictionValueShared); + comparisonMap.put(partKeyShared, partValueB); + comparisonMap.put(regKeyShared, regValueB); + + findCommon(commonMap, comparisonMap); + + assertThat(commonMap).containsOnlyKeys(evictionKeyShared); + } + + @Test + public void findCommonRemovesDisagreeingKeysInvolvingNull() { + Map commonMap = new HashMap<>(); + commonMap.put(evictionKeyShared, evictionValueShared); + commonMap.put(partKeyShared, partValueA); + commonMap.put(regKeyShared, null); + + Map comparisonMap = new HashMap<>(); + comparisonMap.put(evictionKeyShared, evictionValueShared); + comparisonMap.put(partKeyShared, null); + comparisonMap.put(regKeyShared, regValueB); + + findCommon(commonMap, comparisonMap); + + assertThat(commonMap).containsOnlyKeys(evictionKeyShared); + } + + + @Test + public void singleAddDefinesDescription() { + RegionDescriptionPerMember mockA = getMockRegionDescriptionPerMember_A(); + RegionDescription description = new RegionDescription(); + description.add(mockA); + + assertThat(description.getCndEvictionAttributes()) + .isEqualTo(mockA.getNonDefaultEvictionAttributes()); + assertThat(description.getCndPartitionAttributes()) + .isEqualTo(mockA.getNonDefaultPartitionAttributes()); + assertThat(description.getCndRegionAttributes()) + .isEqualTo(mockA.getNonDefaultRegionAttributes()); + } + + @Test + public void multipleAddsMergeAsExpected() { + RegionDescriptionPerMember mockA = getMockRegionDescriptionPerMember_A(); + RegionDescriptionPerMember mockB = getMockRegionDescriptionPerMember_B(); + RegionDescription description = new RegionDescription(); + description.add(mockA); + description.add(mockB); + + Map sharedEviction = new HashMap<>(); + sharedEviction.put(evictionKeyShared, evictionValueShared); + Map sharedRegion = new HashMap<>(); + sharedRegion.put(regKeyShared, regValueShared); + Map sharedPartition = new HashMap<>(); + sharedPartition.put(partKeyShared, partValueShared); + + assertThat(description.getCndEvictionAttributes()).isEqualTo(sharedEviction); + assertThat(description.getCndPartitionAttributes()).isEqualTo(sharedPartition); + assertThat(description.getCndRegionAttributes()).isEqualTo(sharedRegion); + + assertThat(description.getRegionDescriptionPerMemberMap()) + .containsOnlyKeys(mockA.getHostingMember(), mockB.getHostingMember()) + .containsEntry(mockA.getHostingMember(), mockA) + .containsEntry(mockB.getHostingMember(), mockB); + } + + @Test + public void outOfScopeAddGetsIgnored() { + RegionDescriptionPerMember mockA = getMockRegionDescriptionPerMember_A(); + RegionDescriptionPerMember mockB = getMockRegionDescriptionPerMember_OutOfScope(); + RegionDescription description = new RegionDescription(); + description.add(mockA); + description.add(mockB); + + assertThat(description.getCndEvictionAttributes()) + .isEqualTo(mockA.getNonDefaultEvictionAttributes()); + assertThat(description.getCndPartitionAttributes()) + .isEqualTo(mockA.getNonDefaultPartitionAttributes()); + assertThat(description.getCndRegionAttributes()) + .isEqualTo(mockA.getNonDefaultRegionAttributes()); + } + + @Test + public void simpleDescribeRegionCommandConsumesRegionDescriptionAsExpected() { + RegionDescriptionPerMember mockDescPerMember = getMockRegionDescriptionPerMember_A(); + RegionDescription regionDescription = new RegionDescription(); + regionDescription.add(mockDescPerMember); + CommandResult commandResult = + (CommandResult) command.buildDescriptionResult(regionName, regionDescription); + assertThat(commandResult.getStatus()).isEqualTo(Status.OK); + // We can't assert that the "Non-Default Attributes Specific To The Hosting Members" header is + // missing because Gfsh currently obfuscates portions of the underlying json that have empty + // "content" fields. We'll have to dig into the JSON to verify. + JSONObject shared = getSharedAttributedJson(commandResult); + JSONObject unique = getMemberSpecificAttributeJson(commandResult); + assertThat(shared.toString()).contains(evictionKeyShared, partKeyShared, regKeyShared, + evictionValueShared, partValueShared, regValueShared, evictionKeyA, partKeyA, regKeyA, + evictionValueA, partValueA, regValueA); + assertThat(unique.toString()).isEqualTo("{}"); + } + + @Test + public void compoundDescribeRegionCommandConsumesRegionDescriptionAsExpected() { + RegionDescriptionPerMember mockDescPerMemberA = getMockRegionDescriptionPerMember_A(); + RegionDescriptionPerMember mockDescPerMemberB = getMockRegionDescriptionPerMember_B(); + RegionDescription regionDescription = new RegionDescription(); + regionDescription.add(mockDescPerMemberA); + regionDescription.add(mockDescPerMemberB); + CommandResult commandResult = + (CommandResult) command.buildDescriptionResult(regionName, regionDescription); + assertThat(commandResult.getStatus()).isEqualTo(Status.OK); + // We can't assert that the "Non-Default Attributes Specific To The Hosting Members" header is + // missing because Gfsh currently obfuscates portions of the underlying json that have empty + // "content" fields. We'll have to dig into the JSON to verify. + JSONObject shared = getSharedAttributedJson(commandResult); + JSONObject unique = getMemberSpecificAttributeJson(commandResult); + assertThat(shared.toString()).contains(evictionKeyShared, partKeyShared, regKeyShared, + evictionValueShared, partValueShared, regValueShared); + assertThat(unique.toString()).contains(evictionKeyA, evictionValueA, partKeyA, partValueA, + regKeyA, regValueA, evictionKeyB, evictionValueB, partKeyB, partValueB, regKeyB, regValueB); + } + + private JSONObject getSharedAttributedJson(CommandResult commandResult) { + return commandResult.getContent().getInternalJsonObject().getJSONObject("__sections__-0") + .getJSONObject("__sections__-0").getJSONObject("__tables__-0").getJSONObject("content"); + } + + private JSONObject getMemberSpecificAttributeJson(CommandResult commandResult) { Review comment: I will add some logic to the `CommandResult` class to go digging into the structure, since it seems to belong to that more than this class. Unfortunately, I can't just use `getTableContent` because the structure here is significantly different than in other commands, notably that this commandResult has two `__section__-x` levels before the tables. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: users@infra.apache.org > The gfsh 'describe region' command doesn't include asyncEventQueueIds or gatewaySenderIds > ----------------------------------------------------------------------------------------- > > Key: GEODE-3955 > URL: https://issues.apache.org/jira/browse/GEODE-3955 > Project: Geode > Issue Type: Improvement > Components: management > Reporter: Barry Oglesby > Priority: Minor > Fix For: 1.4.0 > > Attachments: geode-3955.diff > > > The {{constructor}} and {{getNonDefaultAttributes}} methods in {{org.apache.geode.management.internal.cli.domain.RegionAttributesInfo}} class would have to be modified to include the {{asyncEventQueueIds}} and {{gatewaySenderIds}}. > I did a quick modification of this class (attached). > With these changes, 'describe region' looks like: > {noformat} > gfsh>describe region --name=/data > .......................................................... > Name : data > Data Policy : partition > Hosting Members : ln-1 > Non-Default Attributes Shared By Hosting Members > Type | Name | Value > --------- | --------------------- | --------- > Region | data-policy | PARTITION > | async-event-queue-ids | db > | size | 0 > | gateway-sender-ids | ny > Partition | redundant-copies | 1 > {noformat} -- This message was sent by Atlassian JIRA (v6.4.14#64029)