[ 
https://issues.apache.org/jira/browse/KNOX-2134?focusedWorklogId=348304&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-348304
 ]

ASF GitHub Bot logged work on KNOX-2134:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 22/Nov/19 19:37
            Start Date: 22/Nov/19 19:37
    Worklog Time Spent: 10m 
      Work Description: risdenk commented on pull request #205: KNOX-2134 - Add 
caching to ZookeeperRemoteAliasService
URL: https://github.com/apache/knox/pull/205#discussion_r349756298
 
 

 ##########
 File path: 
gateway-server/src/test/java/org/apache/knox/gateway/services/security/impl/ZookeeperRemoteAliasServiceTest.java
 ##########
 @@ -193,61 +302,123 @@ public void testAliasForCluster() throws Exception {
 
     Assert.assertEquals(aliasesDev.size(), 0);
     Assert.assertFalse("Expected alias '" + expectedAliasDev + "' to be 
removed but found.",
-        aliasesDev.contains(expectedAliasDev));
+                       aliasesDev.contains(expectedAliasDev));
 
     Assert.assertEquals(aliases.size(), 1);
-    Assert.assertTrue("Expected alias '" + expectedAlias + "' not found ",
-        aliases.contains(expectedAlias.toLowerCase(Locale.ROOT)));
+    assertTrue("Expected alias '" + expectedAlias + "' not found ",
+                      
aliases.contains(expectedAlias.toLowerCase(Locale.ROOT)));
 
     /* Test auto-generate password for alias */
     final String testAutoGeneratedpasswordAlias = "knox.test.alias.auto";
 
-    final char[] autoGeneratedPassword = zkAlias
-        .getPasswordFromAliasForCluster(expectedClusterName,
-            testAutoGeneratedpasswordAlias, true);
+    final char[] autoGeneratedPassword =
+        zkAlias.getPasswordFromAliasForCluster(expectedClusterName,
+                                               testAutoGeneratedpasswordAlias,
+                                               true);
     aliases = zkAlias.getAliasesForCluster(expectedClusterName);
 
-    Assert.assertNotNull(autoGeneratedPassword);
-    Assert.assertEquals(aliases.size(), 2);
-    Assert.assertTrue("Expected alias 'knox.test.alias' not found ",
-        aliases.contains(testAutoGeneratedpasswordAlias));
+    assertNotNull(autoGeneratedPassword);
+    Assert.assertEquals(2, aliases.size());
+    assertTrue("Expected alias '" + testAutoGeneratedpasswordAlias + "' not 
found ",
+                      aliases.contains(testAutoGeneratedpasswordAlias));
   }
 
   @Test
   public void testEncryptDecrypt() throws Exception {
     final String testPassword = "ApacheKnoxPassword123";
 
-    final AliasService defaultAlias = EasyMock
-        .createNiceMock(AliasService.class);
+    final AliasService defaultAlias = 
EasyMock.createNiceMock(AliasService.class);
     EasyMock.replay(defaultAlias);
 
-    final DefaultMasterService ms = EasyMock
-        .createNiceMock(DefaultMasterService.class);
-    EasyMock.expect(ms.getMasterSecret()).andReturn("knox".toCharArray())
-        .anyTimes();
+    final DefaultMasterService ms = 
EasyMock.createNiceMock(DefaultMasterService.class);
+    
EasyMock.expect(ms.getMasterSecret()).andReturn("knox".toCharArray()).anyTimes();
     EasyMock.replay(ms);
 
-    RemoteConfigurationRegistryClientService clientService = (new 
ZooKeeperClientServiceProvider())
-                                                                 
.newInstance();
+    RemoteConfigurationRegistryClientService clientService = (new 
ZooKeeperClientServiceProvider()).newInstance();
     clientService.setAliasService(defaultAlias);
     clientService.init(gc, Collections.emptyMap());
 
-    final ZookeeperRemoteAliasService zkAlias = new 
ZookeeperRemoteAliasService(defaultAlias, ms,
-        clientService);
+    final ZookeeperRemoteAliasService zkAlias = new 
ZookeeperRemoteAliasService(defaultAlias, ms, clientService);
     zkAlias.init(gc, Collections.emptyMap());
 
     final String encrypted = zkAlias.encrypt(testPassword);
-    Assert.assertNotNull(encrypted);
+    assertNotNull(encrypted);
     final String clear = zkAlias.decrypt(encrypted);
     Assert.assertEquals(testPassword, clear);
 
     try {
       // Match default data that is put into a newly created znode
       final byte[] badData = new byte[0];
       zkAlias.decrypt(new String(badData, StandardCharsets.UTF_8));
-      Assert.fail("Should have failed to decrypt.");
+      fail("Should have failed to decrypt.");
     } catch (IllegalArgumentException e) {
       Assert.assertEquals("Data should have 3 parts split by ::", 
e.getMessage());
     }
   }
+
+
+  private void validateAliasCache(final Map<String, Map<String, String>> 
aliasCache,
+                                  final Map<String, Map<String, String>> 
expectedCacheContents) {
+    for (String cluster : expectedCacheContents.keySet()) {
+      assertTrue("Missing cluster " + cluster, 
aliasCache.containsKey(cluster));
+      for (String expectedAlias : expectedCacheContents.get(cluster).keySet()) 
{
+        assertTrue("Missing expected alias (" + expectedAlias + ") for " + 
cluster,
+            aliasCache.get(cluster).containsKey(expectedAlias));
+        assertEquals("Alias value mismatch",
+            expectedCacheContents.get(cluster).get(expectedAlias),
+            aliasCache.get(cluster).get(expectedAlias));
+      }
+    }
+  }
+
+
+  private void validateClusterZNodes(final RemoteConfigurationRegistryClient 
client, final List<String> expectedAliasNames) {
+    List<String> aliasNodes = 
client.listChildEntries(ZookeeperRemoteAliasService.PATH_KNOX_ALIAS_STORE_TOPOLOGY);
+    assertEquals("Unexpected alias nodes.", expectedAliasNames.size(), 
aliasNodes.size());
+    assertTrue("Alias node mismatch!", 
aliasNodes.containsAll(expectedAliasNames));
+  }
+
+
+  private void validateClusterAliasZNodes(final 
RemoteConfigurationRegistryClient client,
+                                          final Map<String, Map<String, 
String>>  expectedAliasNames) {
+    for (String cluster : expectedAliasNames.keySet()) {
+      List<String> aliasNodes =
+          
client.listChildEntries(ZookeeperRemoteAliasService.PATH_KNOX_ALIAS_STORE_TOPOLOGY
 + "/" + cluster);
+      assertEquals("Unexpected alias nodes.", 
expectedAliasNames.get(cluster).size(), aliasNodes.size());
+      assertTrue("Alias node mismatch!", 
aliasNodes.containsAll(expectedAliasNames.get(cluster).keySet()));
+    }
+  }
+
+
+  private void validateClusterAliasZNodeValues(final 
RemoteConfigurationRegistryClient client,
+                                               final 
ZookeeperRemoteAliasService       zkAliasService,
+                                               final Map<String, Map<String, 
String>>  expectedAliases) {
+    for (String cluster : expectedAliases.keySet()) {
+      List<String> aliasNodes =
+          
client.listChildEntries(ZookeeperRemoteAliasService.PATH_KNOX_ALIAS_STORE_TOPOLOGY
 + "/" + cluster);
+      assertEquals("Unexpected alias nodes.", 
expectedAliases.get(cluster).size(), aliasNodes.size());
+      for (String alias : aliasNodes) {
+        String entryData =
+            
client.getEntryData(ZookeeperRemoteAliasService.PATH_KNOX_ALIAS_STORE_TOPOLOGY +
+                "/" + cluster + "/" + alias);
+        String decrypted = null;
+        try {
+          decrypted = zkAliasService.decrypt(entryData);
+        } catch (Exception e) {
+          fail("Error decrypting alias value: " + e.getMessage());
+        }
+        assertNotNull(decrypted);
+        assertEquals("ZNode value mismatch.", 
expectedAliases.get(cluster).get(alias), decrypted);
+      }
+    }
+  }
+
+  private void waitForCallback() {
+    try {
+      Thread.sleep(1000);
+    } catch (InterruptedException e) {
+      //
 
 Review comment:
   Same as above - `Thread.currentThread().interrupt();`
   
   Also again why 1 second?
 
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


Issue Time Tracking
-------------------

    Worklog Id:     (was: 348304)
    Time Spent: 0.5h  (was: 20m)

> Add caching to ZookeeperRemoteAliasService
> ------------------------------------------
>
>                 Key: KNOX-2134
>                 URL: https://issues.apache.org/jira/browse/KNOX-2134
>             Project: Apache Knox
>          Issue Type: Bug
>          Components: Server
>    Affects Versions: 1.3.0
>            Reporter: Philip Zampino
>            Assignee: Philip Zampino
>            Priority: Major
>             Fix For: 1.4.0
>
>          Time Spent: 0.5h
>  Remaining Estimate: 0h
>
> The ZookeeperRemoteAliasService implementation always goes to ZooKeeper to 
> retrieve alias data. Instead, it should cache the data locally to make 
> password retrieval much faster.
> The implementation already receives pushes from ZooKeeper when alias znodes 
> change, so instead of only updating the associated local alias service, it 
> can also update its own cache.
> This way, it only ever needs to go to ZooKeeper for add/remove operations.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to