RANGER-417 : Add support for KMS UI in Ranger Admin

Signed-off-by: Velmurugan Periasamy <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/2f8bcd23
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/2f8bcd23
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/2f8bcd23

Branch: refs/heads/master
Commit: 2f8bcd23477a651cc4d70467045765109286b8fa
Parents: 94bf590
Author: Gautam Borad <[email protected]>
Authored: Wed Apr 22 18:37:06 2015 +0530
Committer: Velmurugan Periasamy <[email protected]>
Committed: Wed Apr 22 10:45:46 2015 -0400

----------------------------------------------------------------------
 .../ranger/plugin/util/KeySearchFilter.java     | 116 +++++++
 kms/config/kms-webapp/dbks-site.xml             |   2 +-
 .../db/postgres/kms_core_db_postgres.sql        |  12 +-
 kms/scripts/install.properties                  |   2 +-
 kms/scripts/setup.sh                            |  12 +
 .../crypto/key/RangerKeyStoreProvider.java      |   6 -
 .../hadoop/crypto/key/kms/server/KMSACLs.java   |  12 +-
 .../hadoop/crypto/key/kms/server/KMSWebApp.java |  13 +-
 .../kms/server/KeyAuthorizationKeyProvider.java |   4 +-
 .../apache/ranger/entity/XXRangerKeyStore.java  |   4 +-
 .../apache/ranger/entity/XXRangerMasterKey.java |   4 +-
 .../kms/authorizer/RangerKmsAuthorizer.java     |  15 +-
 .../ranger/services/kms/client/KMSClient.java   | 156 ++++-----
 .../services/kms/client/KMSResourceMgr.java     |  27 +-
 .../java/org/apache/ranger/biz/KmsKeyMgr.java   | 317 +++++++++++++++++
 .../org/apache/ranger/common/AppConstants.java  |   6 +-
 .../java/org/apache/ranger/rest/XKeyREST.java   | 169 +++++++++
 .../java/org/apache/ranger/view/VXKmsKey.java   | 239 +++++++++++++
 .../org/apache/ranger/view/VXKmsKeyList.java    |  84 +++++
 .../collection_bases/VXKmsKeyListBase.js        |  68 ++++
 .../webapp/scripts/collections/VXKmsKeyList.js  |  36 ++
 .../webapp/scripts/controllers/Controller.js    |  37 ++
 .../webapp/scripts/model_bases/VXKmsKeyBase.js  | 103 ++++++
 .../src/main/webapp/scripts/models/VXKmsKey.js  |  54 +++
 .../src/main/webapp/scripts/modules/XALinks.js  |  34 +-
 .../scripts/modules/globalize/message/en.js     |  17 +-
 .../src/main/webapp/scripts/routers/Router.js   |  12 +-
 .../src/main/webapp/scripts/utils/XAGlobals.js  |  12 +-
 .../webapp/scripts/views/kms/KMSTableLayout.js  | 345 +++++++++++++++++++
 .../webapp/scripts/views/kms/KmsKeyCreate.js    | 186 ++++++++++
 .../main/webapp/scripts/views/kms/KmsKeyForm.js | 107 ++++++
 .../webapp/templates/common/TopNav_tmpl.html    |  12 +-
 .../webapp/templates/kms/KmsKeyCreate_tmpl.html |  30 ++
 .../webapp/templates/kms/KmsKeyForm_tmpl.html   |  19 +
 .../templates/kms/KmsTableLayout_tmpl.html      |  46 +++
 35 files changed, 2139 insertions(+), 179 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/agents-common/src/main/java/org/apache/ranger/plugin/util/KeySearchFilter.java
----------------------------------------------------------------------
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/KeySearchFilter.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/KeySearchFilter.java
new file mode 100644
index 0000000..f28a46b
--- /dev/null
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/KeySearchFilter.java
@@ -0,0 +1,116 @@
+package org.apache.ranger.plugin.util;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
+
+public class KeySearchFilter {
+       public static final String KEY_NAME    = "name";// search, sort
+       
+       public static final String START_INDEX     = "startIndex";
+       public static final String PAGE_SIZE       = "pageSize";
+       public static final String SORT_BY         = "sortBy";
+       
+       private Map<String, String> params     = null;
+       private int                 startIndex = 0;
+       private int                 maxRows    = Integer.MAX_VALUE;
+       private boolean             getCount   = true;
+       private String              sortBy     = null;
+       private String              sortType   = null;
+       
+       public KeySearchFilter() {
+               this(null);
+       }
+
+       public KeySearchFilter(String name, String value) {
+               setParam(name, value);
+       }
+
+       public KeySearchFilter(Map<String, String> values) {
+               setParams(values);
+       }
+
+       public Map<String, String> getParams() {
+               return params;
+       }
+
+       public void setParams(Map<String, String> params) {
+               this.params = params;
+       }
+
+       public String getParam(String name) {
+               return params == null ? null : params.get(name);
+       }
+
+       public void setParam(String name, String value) {
+               if(StringUtils.isEmpty(name) || StringUtils.isEmpty(value)) {
+                       return;
+               }
+
+               if(params == null) {
+                       params = new HashMap<String, String>();
+               }
+
+               params.put(name, value);
+       }
+       public boolean isEmpty() {
+               return MapUtils.isEmpty(params);
+       }
+       
+       public int getStartIndex() {
+               return startIndex;
+       }
+       
+       public void setStartIndex(int startIndex) {
+               this.startIndex = startIndex;
+       }
+
+       public int getMaxRows() {
+               return maxRows;
+       }
+
+       public void setMaxRows(int maxRows) {
+               this.maxRows = maxRows;
+       }
+       
+       public boolean isGetCount() {
+               return getCount;
+       }
+
+       public void setGetCount(boolean getCount) {
+               this.getCount = getCount;
+       }
+       
+       public String getSortBy() {
+               return sortBy;
+       }
+
+       public void setSortBy(String sortBy) {
+               this.sortBy = sortBy;
+       }
+       
+       public String getSortType() {
+               return sortType;
+       }
+
+       public void setSortType(String sortType) {
+               this.sortType = sortType;
+       }
+
+       @Override
+       public boolean equals(Object object) {
+               if (object == null || !(object instanceof KeySearchFilter)) {
+                       return false;
+               }
+               KeySearchFilter that = (KeySearchFilter)object;
+               return Objects.equals(params, that.params);
+       }
+       
+       @Override
+       public int hashCode() {
+               return Objects.hash(params);
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/config/kms-webapp/dbks-site.xml
----------------------------------------------------------------------
diff --git a/kms/config/kms-webapp/dbks-site.xml 
b/kms/config/kms-webapp/dbks-site.xml
old mode 100644
new mode 100755
index f29f0e4..734d537
--- a/kms/config/kms-webapp/dbks-site.xml
+++ b/kms/config/kms-webapp/dbks-site.xml
@@ -44,7 +44,7 @@
     <name>ranger.ks.jpa.jdbc.url</name>
     <value>jdbc:log4jdbc:mysql://localhost:3306/rangerkms</value>
     <description>
-      ULR for Database
+      URL for Database
     </description>
   </property>
     

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/scripts/db/postgres/kms_core_db_postgres.sql
----------------------------------------------------------------------
diff --git a/kms/scripts/db/postgres/kms_core_db_postgres.sql 
b/kms/scripts/db/postgres/kms_core_db_postgres.sql
old mode 100644
new mode 100755
index 829ab84..19c8369
--- a/kms/scripts/db/postgres/kms_core_db_postgres.sql
+++ b/kms/scripts/db/postgres/kms_core_db_postgres.sql
@@ -1,8 +1,8 @@
 DROP TABLE IF EXISTS ranger_masterkey CASCADE;
-DROP SEQUENCE IF EXISTS ranger_masterkey_seq;
-CREATE SEQUENCE ranger_masterkey_seq;
+DROP SEQUENCE IF EXISTS RANGER_MASTERKEY_SEQ;
+CREATE SEQUENCE RANGER_MASTERKEY_SEQ;
 CREATE TABLE ranger_masterkey(
-id BIGINT DEFAULT nextval('ranger_masterkey_seq'::regclass),
+id BIGINT DEFAULT nextval('RANGER_MASTERKEY_SEQ'::regclass),
 create_time TIMESTAMP DEFAULT NULL NULL,
 update_time TIMESTAMP DEFAULT NULL NULL,
 added_by_id BIGINT DEFAULT NULL NULL,
@@ -14,10 +14,10 @@ PRIMARY KEY (id)
 );
 
 DROP TABLE IF EXISTS ranger_keystore CASCADE;
-DROP SEQUENCE IF EXISTS ranger_keystore_seq;
-CREATE SEQUENCE ranger_keystore_seq;
+DROP SEQUENCE IF EXISTS RANGER_KEYSTORE_SEQ;
+CREATE SEQUENCE RANGER_KEYSTORE_SEQ;
 CREATE TABLE ranger_keystore(
-id BIGINT DEFAULT nextval('ranger_keystore_seq'::regclass),
+id BIGINT DEFAULT nextval('RANGER_KEYSTORE_SEQ'::regclass),
 create_time TIMESTAMP DEFAULT NULL NULL,
 update_time TIMESTAMP DEFAULT NULL NULL,
 added_by_id BIGINT DEFAULT NULL NULL,

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/scripts/install.properties
----------------------------------------------------------------------
diff --git a/kms/scripts/install.properties b/kms/scripts/install.properties
index 1a77976..b54f30f 100644
--- a/kms/scripts/install.properties
+++ b/kms/scripts/install.properties
@@ -92,7 +92,7 @@ POLICY_MGR_URL=
 # Example:
 # REPOSITORY_NAME=kmsdev
 #
-REPOSITORY_NAME=kms
+REPOSITORY_NAME=kmsdev
 
 #
 # AUDIT DB Configuration

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/scripts/setup.sh
----------------------------------------------------------------------
diff --git a/kms/scripts/setup.sh b/kms/scripts/setup.sh
old mode 100644
new mode 100755
index 295a71d..a3680b7
--- a/kms/scripts/setup.sh
+++ b/kms/scripts/setup.sh
@@ -390,6 +390,14 @@ update_properties() {
                propertyName=ranger.ks.jpa.jdbc.password
                newPropertyValue="_"
                updatePropertyToFilePy $propertyName $newPropertyValue $to_file
+
+               propertyName=ranger.ks.masterkey.credential.alias
+               newPropertyValue="${MK_CREDENTIAL_ALIAS}"
+                updatePropertyToFilePy $propertyName $newPropertyValue $to_file
+
+                propertyName=ranger.db.encrypt.key.password
+                newPropertyValue="_"
+                updatePropertyToFilePy $propertyName $newPropertyValue $to_file
        else
                propertyName="${DB_CREDENTIAL_ATTR}"
                newPropertyValue="${db_password}"
@@ -416,6 +424,10 @@ update_properties() {
                updatePropertyToFilePy $propertyName $newPropertyValue $to_file
        fi
 
+       propertyName=hadoop.kms.blacklist.CREATE
+        newPropertyValue="BlacklistUser"
+        updatePropertyToFilePy $propertyName $newPropertyValue $to_file
+
        ###########
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/src/main/java/org/apache/hadoop/crypto/key/RangerKeyStoreProvider.java
----------------------------------------------------------------------
diff --git 
a/kms/src/main/java/org/apache/hadoop/crypto/key/RangerKeyStoreProvider.java 
b/kms/src/main/java/org/apache/hadoop/crypto/key/RangerKeyStoreProvider.java
index a0a082f..db0dc38 100755
--- a/kms/src/main/java/org/apache/hadoop/crypto/key/RangerKeyStoreProvider.java
+++ b/kms/src/main/java/org/apache/hadoop/crypto/key/RangerKeyStoreProvider.java
@@ -77,7 +77,6 @@ public class RangerKeyStoreProvider extends KeyProvider{
                RangerMasterKey rangerMasterKey = new 
RangerMasterKey(daoManager);              
                dbStore = new RangerKeyStore(daoManager);               
                String password = conf.get(ENCRYPTION_KEY);
-               // System.out.println("RKSP Password = "+password);
                if(password == null || password.trim().equals("") || 
password.trim().equals("_") || password.trim().equals("crypted")){
                        throw new IOException("Master Key Jceks does not 
exists");
                }
@@ -318,18 +317,13 @@ public class RangerKeyStoreProvider extends KeyProvider{
        
        private void getFromJceks(Configuration conf, String path, String 
alias, String key){
                //update credential from keystore               
-               // System.out.println("getFromJCEKS path = "+path+" alias = 
"+alias+" key = "+key);
                if(conf!=null){ 
                        String pathValue=conf.get(path);
-                       // System.out.println("path Value = "+pathValue);
                        String aliasValue=conf.get(alias);
-                       // System.out.println("alias Value = "+aliasValue);
                        if(pathValue!=null && aliasValue!=null){
                                String 
xaDBPassword=CredentialReader.getDecryptedString(pathValue.trim(),aliasValue.trim());
            
-                               // System.out.println("xaDBPassword = 
"+xaDBPassword);
                                if(xaDBPassword!=null&& 
!xaDBPassword.trim().isEmpty() && 
                                                
!xaDBPassword.trim().equalsIgnoreCase("none")){
-                                       // System.out.println("inside key = 
"+key+" xaDBaswword "+xaDBPassword);
                                        conf.set(key, xaDBPassword);
                                }else{
                                        logger.info("Credential keystore 
password not applied for KMS; clear text password shall be applicable");        
                       

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSACLs.java
----------------------------------------------------------------------
diff --git 
a/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSACLs.java 
b/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSACLs.java
old mode 100644
new mode 100755
index f2298c0..92d3470
--- a/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSACLs.java
+++ b/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSACLs.java
@@ -160,6 +160,7 @@ public class KMSACLs implements Runnable, KeyACLs {
     }
   }
 
+  @Override
   public synchronized void startReloader() {
     if (executorService == null) {
       executorService = Executors.newScheduledThreadPool(1);
@@ -168,6 +169,7 @@ public class KMSACLs implements Runnable, KeyACLs {
     }
   }
 
+  @Override
   public synchronized void stopReloader() {
     if (executorService != null) {
       executorService.shutdownNow();
@@ -240,14 +242,4 @@ public class KMSACLs implements Runnable, KeyACLs {
   public boolean isACLPresent(String keyName, KeyOpType opType) {
     return (keyAcls.containsKey(keyName) || 
defaultKeyAcls.containsKey(opType));
   }
-
-  @Override
-  public void startACLReloader() {
-       this.startReloader();   
-  }
-
-  @Override
-  public void stopACLReloader() {
-       this.stopReloader();
-  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSWebApp.java
----------------------------------------------------------------------
diff --git 
a/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSWebApp.java 
b/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSWebApp.java
old mode 100644
new mode 100755
index 67b9f88..403c310
--- a/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSWebApp.java
+++ b/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KMSWebApp.java
@@ -132,9 +132,7 @@ public class KMSWebApp implements ServletContextListener {
 
       
       kmsAcls = getAcls(kmsConf.get(KMSConfiguration.KMS_SECURITY_AUTHORIZER));
-                 
-      //kmsAcls = new KMSACLs();
-      kmsAcls.startACLReloader();
+      kmsAcls.startReloader();
 
       metricRegistry = new MetricRegistry();
       jmxReporter = JmxReporter.forRegistry(metricRegistry).build();
@@ -225,6 +223,7 @@ public class KMSWebApp implements ServletContextListener {
     }
   }
 
+  @SuppressWarnings("unchecked")
   private KeyACLs getAcls(String clsStr) throws IOException {
          KeyACLs keyAcl = null;
          try {
@@ -232,13 +231,9 @@ public class KMSWebApp implements ServletContextListener {
         if (clsStr == null || clsStr.trim().equals("")) {
                cls = KMSACLs.class;
         } else {
-            //Class<?> configClass = Class.forName(clsStr, true, 
JavaUtils.getClassLoader());
                Class<?> configClass = Class.forName(clsStr);
-            //Class<?> configClass = Class.forName(clsStr, true, 
JavaUtils.getClassLoader());
             if(!KeyACLs.class.isAssignableFrom(configClass) ){
-               //if it's not of type KeyACLs
-               //we can have default also "cls = KMSACLs.class;"
-                   return null;
+               throw new RuntimeException(clsStr+" should implement KeyACLs");
             }
             cls = (Class<? extends KeyACLs>)configClass;
         }
@@ -254,7 +249,7 @@ public class KMSWebApp implements ServletContextListener {
 @Override
   public void contextDestroyed(ServletContextEvent sce) {
     kmsAudit.shutdown();
-    kmsAcls.stopACLReloader();
+    kmsAcls.stopReloader();
     jmxReporter.stop();
     jmxReporter.close();
     metricRegistry = null;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KeyAuthorizationKeyProvider.java
----------------------------------------------------------------------
diff --git 
a/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KeyAuthorizationKeyProvider.java
 
b/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KeyAuthorizationKeyProvider.java
old mode 100644
new mode 100755
index 5099daf..1e43dac
--- 
a/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KeyAuthorizationKeyProvider.java
+++ 
b/kms/src/main/java/org/apache/hadoop/crypto/key/kms/server/KeyAuthorizationKeyProvider.java
@@ -82,9 +82,9 @@ public class KeyAuthorizationKeyProvider extends 
KeyProviderCryptoExtension {
      */
     public boolean isACLPresent(String aclName, KeyOpType opType);
 
-       public void startACLReloader();
+       public void startReloader();
        
-       public void stopACLReloader();
+       public void stopReloader();
 
        public boolean hasAccess(KMSACLsType.Type aclType, UserGroupInformation 
ugi);
 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/src/main/java/org/apache/ranger/entity/XXRangerKeyStore.java
----------------------------------------------------------------------
diff --git a/kms/src/main/java/org/apache/ranger/entity/XXRangerKeyStore.java 
b/kms/src/main/java/org/apache/ranger/entity/XXRangerKeyStore.java
old mode 100644
new mode 100755
index f29341a..9bc53c2
--- a/kms/src/main/java/org/apache/ranger/entity/XXRangerKeyStore.java
+++ b/kms/src/main/java/org/apache/ranger/entity/XXRangerKeyStore.java
@@ -34,8 +34,8 @@ public class XXRangerKeyStore extends XXDBBase implements 
java.io.Serializable {
        private static final long serialVersionUID = 1L;
        
        @Id
-       
@SequenceGenerator(name="kmskeys",sequenceName="kmskeys",allocationSize=1)
-       @GeneratedValue(strategy=GenerationType.AUTO,generator="kmskeys")
+       
@SequenceGenerator(name="RANGER_KEYSTORE_SEQ",sequenceName="RANGER_KEYSTORE_SEQ",allocationSize=1)
+       
@GeneratedValue(strategy=GenerationType.AUTO,generator="RANGER_KEYSTORE_SEQ")
        @Column(name="ID")
        protected Long id;
        @Override

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/kms/src/main/java/org/apache/ranger/entity/XXRangerMasterKey.java
----------------------------------------------------------------------
diff --git a/kms/src/main/java/org/apache/ranger/entity/XXRangerMasterKey.java 
b/kms/src/main/java/org/apache/ranger/entity/XXRangerMasterKey.java
old mode 100644
new mode 100755
index 6c1c119..c6c9703
--- a/kms/src/main/java/org/apache/ranger/entity/XXRangerMasterKey.java
+++ b/kms/src/main/java/org/apache/ranger/entity/XXRangerMasterKey.java
@@ -34,8 +34,8 @@ public class XXRangerMasterKey extends XXDBBase implements 
java.io.Serializable
        private static final long serialVersionUID = 1L;
        
        @Id
-       
@SequenceGenerator(name="rangermasterkey",sequenceName="rangermasterkey",allocationSize=1)
-       
@GeneratedValue(strategy=GenerationType.AUTO,generator="rangermasterkey")
+       
@SequenceGenerator(name="RANGER_MASTERKEY_SEQ",sequenceName="RANGER_MASTERKEY_SEQ",allocationSize=1)
+       
@GeneratedValue(strategy=GenerationType.AUTO,generator="RANGER_MASTERKEY_SEQ")
        @Column(name="ID")
        protected Long id;
        @Override

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/plugin-kms/src/main/java/org/apache/ranger/authorization/kms/authorizer/RangerKmsAuthorizer.java
----------------------------------------------------------------------
diff --git 
a/plugin-kms/src/main/java/org/apache/ranger/authorization/kms/authorizer/RangerKmsAuthorizer.java
 
b/plugin-kms/src/main/java/org/apache/ranger/authorization/kms/authorizer/RangerKmsAuthorizer.java
index 96fcf31..d945201 100755
--- 
a/plugin-kms/src/main/java/org/apache/ranger/authorization/kms/authorizer/RangerKmsAuthorizer.java
+++ 
b/plugin-kms/src/main/java/org/apache/ranger/authorization/kms/authorizer/RangerKmsAuthorizer.java
@@ -113,6 +113,7 @@ public class RangerKmsAuthorizer implements Runnable, 
KeyACLs {
                  return conf;
          }
 
+         @Override
          public synchronized void startReloader() {
            if (executorService == null) {
              executorService = Executors.newScheduledThreadPool(1);
@@ -120,7 +121,7 @@ public class RangerKmsAuthorizer implements Runnable, 
KeyACLs {
                  RELOADER_SLEEP_MILLIS, TimeUnit.MILLISECONDS);
            }
          }
-
+         @Override
          public synchronized void stopReloader() {
            if (executorService != null) {
              executorService.shutdownNow();
@@ -194,17 +195,7 @@ public class RangerKmsAuthorizer implements Runnable, 
KeyACLs {
                  return true;
          }
 
-         @Override
-         public void startACLReloader() {
-               this.startReloader();   
-         }
-
-         @Override
-         public void stopACLReloader() {
-               this.stopReloader();
-         }     
-         
-               public void init(Configuration conf) {
+         public void init(Configuration conf) {
                        if(LOG.isDebugEnabled()) {
                                LOG.debug("==> RangerKmsAuthorizer.init()");
                        }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSClient.java
----------------------------------------------------------------------
diff --git 
a/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSClient.java 
b/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSClient.java
index c956914..6c69196 100755
--- 
a/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSClient.java
+++ 
b/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSClient.java
@@ -25,12 +25,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
 
 import org.apache.log4j.Logger;
 import org.apache.ranger.plugin.client.BaseClient;
 import org.apache.ranger.plugin.client.HadoopException;
 import org.apache.ranger.services.kms.client.KMSClient;
-import org.apache.ranger.services.kms.client.json.model.KMSSchedulerResponse;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
@@ -44,45 +44,42 @@ public class KMSClient {
 
        private static final String EXPECTED_MIME_TYPE = "application/json";
        
-       private static final String KMS_LIST_API_ENDPOINT = 
"/ws/v1/cluster/scheduler" ;
+       private static final String KMS_LIST_API_ENDPOINT = 
"v1/keys/names?user.name=${userName}";                      //GET
        
        private static final String errMessage =  " You can still save the 
repository and start creating "
                                                                                
          + "policies, but you would not be able to use autocomplete for "
                                                                                
          + "resource names. Check xa_portal.log for more info.";
-
        
-       String kmsQUrl;
-       String userName;
+       String provider;
+       String username;
        String password;
 
-       public  KMSClient(String kmsQueueUrl, String kmsUserName, String 
kmsPassWord) {
-               
-               this.kmsQUrl = kmsQueueUrl;
-               this.userName = kmsUserName ;
-               this.password = kmsPassWord;
+       public  KMSClient(String provider, String username, String password) {
+               provider = provider.replaceAll("kms://","");
+               provider = provider.replaceAll("http@","http://";);              
+               this.provider = provider;
+               this.username = username ;
+               this.password = password;
                
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("Kms Client is build with url [" + 
kmsQueueUrl + "] user: [" + kmsPassWord + "], password: [" + "" + "]");
-               }
-               
+                       LOG.debug("Kms Client is build with url [" + provider + 
"] user: [" + username + "]");
+               }               
        }
        
-       public List<String> getQueueList(final String queueNameMatching, final 
List<String> existingQueueList) {
+       public List<String> getKeyList(final String keyNameMatching, final 
List<String> existingKeyList) {
                
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("Getting Kms queue list for queueNameMatching 
: " + queueNameMatching);
+                       LOG.debug("Getting Kms Key list for keyNameMatching : " 
+ keyNameMatching);
                }
-               final String errMsg                     = errMessage;
-               
-               List<String> ret = new ArrayList<String>();
+               final String errMsg = errMessage;
                
-               Callable<List<String>> kmsQueueListGetter = new 
Callable<List<String>>() {
+               Callable<List<String>> kmsKeyListGetter = new 
Callable<List<String>>() {
                        @Override
                        public List<String> call() {
                                
-                               List<String> lret = new ArrayList<String>();
-                               
-                               String url = kmsQUrl + KMS_LIST_API_ENDPOINT ;
+                               List<String> lret = new ArrayList<String>();    
                        
+                               String keyLists = 
KMS_LIST_API_ENDPOINT.replaceAll(Pattern.quote("${userName}"), username);
+                               String uri = provider + (provider.endsWith("/") 
? keyLists : ("/" + keyLists));         
                                
                                Client client = null ;
                                ClientResponse response = null ;
@@ -90,70 +87,65 @@ public class KMSClient {
                                try {
                                        client = Client.create() ;
                                        
-                                       WebResource webResource = 
client.resource(url);
+                                       WebResource webResource = 
client.resource(uri);
                                        
-                                       response = 
webResource.accept(EXPECTED_MIME_TYPE)
-                                                   .get(ClientResponse.class);
+                                       response = 
webResource.accept(EXPECTED_MIME_TYPE).get(ClientResponse.class);
                                        
                                        if (LOG.isDebugEnabled()) {
-                                               
LOG.debug("getQueueList():calling " + url);
+                                               LOG.debug("getKeyList():calling 
" + uri);
                                        }
                                        
                                        if (response != null) {
                                                if (LOG.isDebugEnabled()) {
-                                                       
LOG.debug("getQueueList():response.getStatus()= " + response.getStatus());      
+                                                       
LOG.debug("getKeyList():response.getStatus()= " + response.getStatus());        
                                                }
                                                if (response.getStatus() == 
200) {
                                                        String jsonString = 
response.getEntity(String.class);
                                                        Gson gson = new 
GsonBuilder().setPrettyPrinting().create();
-                                                       KMSSchedulerResponse 
kmsQResponse = gson.fromJson(jsonString, KMSSchedulerResponse.class);
-                                                       if (kmsQResponse != 
null) {
-                                                               List<String>  
kmsQueueList = kmsQResponse.getQueueNames();
-                                                               if 
(kmsQueueList != null) {
-                                                                       for ( 
String kmsQueueName : kmsQueueList) {
-                                                                               
if ( existingQueueList != null && existingQueueList.contains(kmsQueueName)) {
+                                                       
@SuppressWarnings("unchecked")
+                                                       List<String> keys = 
gson.fromJson(jsonString, List.class) ;
+                                                       if (keys != null) {
+                                                               for ( String 
key : keys) {
+                                                                       if ( 
existingKeyList != null && existingKeyList.contains(key)) {
                                                                                
continue;
                                                                        }
-                                                                               
if (queueNameMatching == null || queueNameMatching.isEmpty()
-                                                                               
                || kmsQueueName.startsWith(queueNameMatching)) {
+                                                                               
if (keyNameMatching == null || keyNameMatching.isEmpty() || 
key.startsWith(keyNameMatching)) {
                                                                                
                if (LOG.isDebugEnabled()) {
-                                                                               
                        LOG.debug("getQueueList():Adding kmsQueue " + 
kmsQueueName);
+                                                                               
                        LOG.debug("getKeyList():Adding kmsKey " + key);
                                                                                
                }
-                                                                               
                lret.add(kmsQueueName) ;
+                                                                               
                lret.add(key) ;
                                                                                
        }
-                                                                               
}
                                                                        }
-                                                               }
-                                                } else{
-                                                       
LOG.info("getQueueList():response.getStatus()= " + response.getStatus() + " for 
URL " + url + ", so returning null list");      
-                                                       String jsonString = 
response.getEntity(String.class);
-                                                       LOG.info(jsonString);
-                                                       lret = null;
+                                                               }               
                                        
+                                                }else if (response.getStatus() 
== 401) {
+                                                        
LOG.info("getKeyList():response.getStatus()= " + response.getStatus() + " for 
URL " + uri + ", so returning null list");
+                                                        return lret;
+                                                }else if (response.getStatus() 
== 403) {
+                                                        
LOG.info("getKeyList():response.getStatus()= " + response.getStatus() + " for 
URL " + uri + ", so returning null list");
+                                                        return lret;
+                                                }else {
+                                                        
LOG.info("getKeyList():response.getStatus()= " + response.getStatus() + " for 
URL " + uri + ", so returning null list");       
+                                                        String jsonString = 
response.getEntity(String.class);
+                                                        LOG.info(jsonString);
+                                                        lret = null;
                                                }
-                                       } else {
+                                       }else {
                                                String msgDesc = "Unable to get 
a valid response for "
                                                                + "expected 
mime type : [" + EXPECTED_MIME_TYPE
-                                                               + "] URL : " + 
url + " - got null response.";
+                                                               + "] URL : " + 
uri + " - got null response.";
                                                LOG.error(msgDesc);
                                                HadoopException hdpException = 
new HadoopException(msgDesc);
-                                               
hdpException.generateResponseDataMap(false, msgDesc,
-                                                               msgDesc + 
errMsg, null, null);
+                                               
hdpException.generateResponseDataMap(false, msgDesc, msgDesc + errMsg, null, 
null);
                                                throw hdpException;
                                        }
                                } catch (HadoopException he) {
                                        throw he;
-                               } catch (Throwable t) {
-                                       String msgDesc = "Exception while 
getting Kms Queue List."
-                                                       + " URL : " + url;
-                                       HadoopException hdpException = new 
HadoopException(msgDesc,
-                                                       t);
+                               }catch (Throwable t) {
+                                       String msgDesc = "Exception while 
getting Kms Key List. URL : " + uri;
+                                       HadoopException hdpException = new 
HadoopException(msgDesc, t);
                                        LOG.error(msgDesc, t);
-
-                                       
hdpException.generateResponseDataMap(false,
-                                                       
BaseClient.getMessage(t), msgDesc + errMsg, null,
-                                                       null);
-                                       throw hdpException;
-                                       
+                                       
hdpException.generateResponseDataMap(false, BaseClient.getMessage(t), msgDesc + 
errMsg, null, null);
+                                       throw hdpException;                     
                
                                } finally {
                                        if (response != null) {
                                                response.close();
@@ -161,34 +153,24 @@ public class KMSClient {
                                        
                                        if (client != null) {
                                                client.destroy(); 
-                                       }
-                               
+                                       }                               
                                }
                                return lret ;
                        }
                } ;
-               
-               try {
-                       ret = timedTask(kmsQueueListGetter, 5, 
TimeUnit.SECONDS);
-               } catch ( Exception e) {
-                       LOG.error("Unable to get Kms Queue list from [" + 
kmsQUrl + "]", e) ;
-               }
-               
-               return ret;
+               return null;
        }
                
-       public static HashMap<String, Object> testConnection(String serviceName,
-                       Map<String, String> configs) {
+       public static HashMap<String, Object> testConnection(String 
serviceName, Map<String, String> configs) {
 
                List<String> strList = new ArrayList<String>();
                String errMsg = errMessage;
                boolean connectivityStatus = false;
                HashMap<String, Object> responseData = new HashMap<String, 
Object>();
 
-               KMSClient kmsClient = getKmsClient(serviceName,
-                               configs);
-               strList = getKmsResource(kmsClient, "",null);
-
+               KMSClient kmsClient = getKmsClient(serviceName, configs);
+               strList = getKmsKey(kmsClient, "", null);
+               
                if (strList != null) {
                        connectivityStatus = true;
                }
@@ -198,7 +180,7 @@ public class KMSClient {
                        BaseClient.generateResponseDataMap(connectivityStatus, 
successMsg,
                                        successMsg, null, null, responseData);
                } else {
-                       String failureMsg = "Unable to retrieve any Kms Queues 
using given parameters.";
+                       String failureMsg = "Unable to retrieve any Kms Key 
using given parameters.";
                        BaseClient.generateResponseDataMap(connectivityStatus, 
failureMsg,
                                        failureMsg + errMsg, null, null, 
responseData);
                }
@@ -232,15 +214,14 @@ public class KMSClient {
                return kmsClient;
        }
 
-       public static List<String> getKmsResource (final KMSClient kmsClient,
-                       String yanrQname, List<String> existingQueueName) {
+       public static List<String> getKmsKey (final KMSClient kmsClient, String 
keyName, List<String> existingKeyName) {
 
                List<String> resultList = new ArrayList<String>();
                String errMsg = errMessage;
 
                try {
                        if (kmsClient == null) {
-                               String msgDesc = "Unable to get Kms Queue : 
KmsClient is null.";
+                               String msgDesc = "Unable to get Kms Key : 
KmsClient is null.";
                                LOG.error(msgDesc);
                                HadoopException hdpException = new 
HadoopException(msgDesc);
                                hdpException.generateResponseDataMap(false, 
msgDesc, msgDesc
@@ -248,26 +229,22 @@ public class KMSClient {
                                throw hdpException;
                        }
 
-                       if (yanrQname != null) {
-                               String finalkmsQueueName = (yanrQname == null) 
? ""
-                                               : yanrQname.trim();
-                               resultList = kmsClient
-                                               
.getQueueList(finalkmsQueueName,existingQueueName);
+                       if (keyName != null) {
+                               String finalkmsKeyName = (keyName == null) ? 
"": keyName.trim();
+                               resultList = 
kmsClient.getKeyList(finalkmsKeyName,existingKeyName);
                                if (resultList != null) {
                                        if (LOG.isDebugEnabled()) {
-                                               LOG.debug("Returning list of " 
+ resultList.size() + " Kms Queues");
+                                               LOG.debug("Returning list of " 
+ resultList.size() + " Kms Keys");
                                        }
                                }
                        }
                } catch (HadoopException he) {
                        throw he;
                } catch (Exception e) {
-                       String msgDesc = "getKmsResource: Unable to get Kms 
resources.";
+                       String msgDesc = "Unable to get a valid response from 
the provider";
                        LOG.error(msgDesc, e);
                        HadoopException hdpException = new 
HadoopException(msgDesc);
-
-                       hdpException.generateResponseDataMap(false,
-                                       BaseClient.getMessage(e), msgDesc + 
errMsg, null, null);
+                       hdpException.generateResponseDataMap(false, msgDesc, 
msgDesc + errMsg, null, null);
                        throw hdpException;
                }
                return resultList;
@@ -277,5 +254,4 @@ public class KMSClient {
                        TimeUnit timeUnit) throws Exception {
                return callableObj.call();
        }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSResourceMgr.java
----------------------------------------------------------------------
diff --git 
a/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSResourceMgr.java
 
b/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSResourceMgr.java
index 36a4840..94ca822 100755
--- 
a/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSResourceMgr.java
+++ 
b/plugin-kms/src/main/java/org/apache/ranger/services/kms/client/KMSResourceMgr.java
@@ -28,7 +28,7 @@ import org.apache.ranger.plugin.service.ResourceLookupContext;
 
 public class KMSResourceMgr {
        public static final     Logger  LOG             = 
Logger.getLogger(KMSResourceMgr.class);
-       private static final    String  KMSQUEUE        = "queue";
+       private static final    String  KMSKEY  = "keyname";
        
        public static HashMap<String, Object> validateConfig(String 
serviceName, Map<String, String> configs) throws Exception {
                HashMap<String, Object> ret = null;
@@ -54,35 +54,32 @@ public class KMSResourceMgr {
         String                  userInput                                = 
context.getUserInput();
                Map<String, List<String>> resourceMap = context.getResources();
            List<String>                resultList        = null;
-               List<String>            kmsQueueList      = null;
-               String                          kmsQueueName     = null;
+               List<String>            kmsKeyList        = null;
+               String                          kmsKeyName     = null;
                
-               if ( resourceMap != null && !resourceMap.isEmpty() &&
-                       resourceMap.get(KMSQUEUE) != null ) {
-                       kmsQueueName = userInput;
-                       kmsQueueList = resourceMap.get(KMSQUEUE); 
+               if ( resourceMap != null && !resourceMap.isEmpty() && 
resourceMap.get(KMSKEY) != null ) {
+                       kmsKeyName = userInput;
+                       kmsKeyList = resourceMap.get(KMSKEY); 
                } else {
-                       kmsQueueName = userInput;
+                       kmsKeyName = userInput;
                }
                
                
         if (configs == null || configs.isEmpty()) {
                 LOG.error("Connection Config is empty");
-
         } else {
                 
-                String url             = configs.get("kms.url");
+                String url             = configs.get("provider");
                 String username = configs.get("username");
                 String password = configs.get("password");
-                resultList = getKMSResource(url, username, 
password,kmsQueueName,kmsQueueList) ;
+                resultList = getKMSResource(url, username, 
password,kmsKeyName,kmsKeyList) ;
         }
         return resultList ;
     }
 
-    public static List<String> getKMSResource(String url, String username, 
String password,String kmsQueueName, List<String> kmsQueueList) {
+    public static List<String> getKMSResource(String url, String username, 
String password,String kmsKeyName, List<String> kmsKeyList) {
         final KMSClient KMSClient = KMSConnectionMgr.getKMSClient(url, 
username, password);
-        List<String> topologyList = KMSClient.getQueueList(kmsQueueName, 
kmsQueueList);
+        List<String> topologyList = KMSClient.getKeyList(kmsKeyName, 
kmsKeyList);
         return topologyList;
-    }
-    
+    }    
 }

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/java/org/apache/ranger/biz/KmsKeyMgr.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/KmsKeyMgr.java 
b/security-admin/src/main/java/org/apache/ranger/biz/KmsKeyMgr.java
new file mode 100755
index 0000000..fd2dd3b
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/biz/KmsKeyMgr.java
@@ -0,0 +1,317 @@
+package org.apache.ranger.biz;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.PredicateUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.apache.ranger.common.ContextUtil;
+import org.apache.ranger.common.MessageEnums;
+import org.apache.ranger.common.RESTErrorUtil;
+import org.apache.ranger.common.RangerConfigUtil;
+import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.StringUtil;
+import org.apache.ranger.plugin.model.RangerService;
+import org.apache.ranger.plugin.util.KeySearchFilter;
+import org.apache.ranger.view.VXKmsKey;
+import org.apache.ranger.view.VXKmsKeyList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+
+@Component
+public class KmsKeyMgr {
+
+       static final Logger logger = Logger.getLogger(KmsKeyMgr.class);
+       
+       private static final String KMS_KEY_LIST_URI            = 
"v1/keys/names?user.name=${userName}";                        //GET
+       private static final String KMS_ADD_KEY_URI             = 
"v1/keys?user.name=${userName}";                                      //POST
+       private static final String KMS_ROLL_KEY_URI            = 
"v1/key/${alias}?user.name=${userName}";                      //POST
+       private static final String KMS_DELETE_KEY_URI          = 
"v1/key/${alias}?user.name=${userName}";                      //DELETE
+       private static final String KMS_KEY_METADATA_URI        = 
"v1/key/${alias}/_metadata?user.name=${userName}";  //GET
+       private static final String KMS_URL_CONFIG                      = 
"provider"; 
+       
+       @Autowired
+       ServiceDBStore svcStore;        
+       
+       @Autowired
+       RESTErrorUtil restErrorUtil;
+       
+       @Autowired
+       RangerConfigUtil configUtil;
+       
+       public VXKmsKeyList searchKeys(String repoName){
+               String provider = null;
+               try {
+                       provider = getKMSURL(repoName);
+               } catch (Exception e) {
+                       logger.error("getKey(" + repoName + ") failed", e);
+               }
+               Client c = getClient() ;
+               String currentUserLoginId = ContextUtil.getCurrentUserLoginId();
+               String keyLists = 
KMS_KEY_LIST_URI.replaceAll(Pattern.quote("${userName}"), currentUserLoginId);
+               String uri = provider + (provider.endsWith("/") ? keyLists : 
("/" + keyLists));         
+               VXKmsKeyList vxKmsKeyList = new VXKmsKeyList();
+               WebResource r = c.resource(uri) ;
+               String response = 
r.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class);
+               Gson gson = new GsonBuilder().create() ;
+               logger.debug(" Search Key RESPONSE: [" + response + "]") ;
+               List<VXKmsKey> vXKeys = new ArrayList<VXKmsKey>();          
+               @SuppressWarnings("unchecked")
+               List<String> keys = gson.fromJson(response, List.class) ;
+               if(keys != null && keys.size() > 0){
+                       for(String name : keys){
+                               VXKmsKey key = getKey(repoName, name);
+                               vXKeys.add(key);
+                       }
+                       vxKmsKeyList.setResultSize(vXKeys.size());
+                       vxKmsKeyList.setTotalCount(vXKeys.size());
+                       vxKmsKeyList.setStartIndex(0);
+                       vxKmsKeyList.setPageSize(vXKeys.size());
+               }
+               vxKmsKeyList.setVXKeys(vXKeys);
+           return vxKmsKeyList;
+       }
+
+       public VXKmsKey rolloverKey(String provider, VXKmsKey vXKey){
+               try {
+                       provider = getKMSURL(provider);
+               } catch (Exception e) {
+                       logger.error("rolloverKey(" + provider + ", "+ 
vXKey.getName() +") failed", e);
+               }
+               VXKmsKey ret = null ;
+               Client c = getClient() ;
+               String rollRest = 
KMS_ROLL_KEY_URI.replaceAll(Pattern.quote("${alias}"), vXKey.getName());
+               String currentUserLoginId = ContextUtil.getCurrentUserLoginId();
+               rollRest = rollRest.replaceAll(Pattern.quote("${userName}"), 
currentUserLoginId);
+               String uri = provider + (provider.endsWith("/") ? rollRest : 
("/" + rollRest));
+               WebResource r = c.resource(uri) ;
+               Gson gson = new GsonBuilder().create() ;
+               String jsonString = gson.toJson(vXKey) ;
+               String response = 
r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class,
 jsonString) ;
+               logger.debug("Roll RESPONSE: [" + response + "]") ;
+               ret = gson.fromJson(response, VXKmsKey.class) ;
+               return ret ;
+       }
+
+       public void deleteKey(String provider, String name){
+               try {
+                       provider = getKMSURL(provider);
+               } catch (Exception e) {
+                       logger.error("deleteKey(" + provider + ", "+ name +") 
failed", e);
+               }
+               Client c = getClient() ;
+               String deleteRest = 
KMS_DELETE_KEY_URI.replaceAll(Pattern.quote("${alias}"), name);
+               String currentUserLoginId = ContextUtil.getCurrentUserLoginId();
+               deleteRest = 
deleteRest.replaceAll(Pattern.quote("${userName}"), currentUserLoginId);
+               String uri = provider + (provider.endsWith("/") ? deleteRest : 
("/" + deleteRest));
+               WebResource r = c.resource(uri) ;
+               ClientResponse response = r.delete(ClientResponse.class) ;
+               logger.debug("delete RESPONSE: [" + response.toString() + "]") 
;                        
+               if (response.getStatus() == 200) {
+                       logger.debug("Alias "+name+" deleted successfully");
+               }               
+       }
+
+       public VXKmsKey createKey(String provider, VXKmsKey vXKey){
+               try {
+                       provider = getKMSURL(provider);
+               } catch (Exception e) {
+                       logger.error("createKey(" + provider + ", "+ 
vXKey.getName() +") failed", e);
+               }
+               VXKmsKey ret = null ;
+               Client c = getClient() ;
+               String currentUserLoginId = ContextUtil.getCurrentUserLoginId();
+               String createRest = 
KMS_ADD_KEY_URI.replaceAll(Pattern.quote("${userName}"), currentUserLoginId);
+               String uri = provider + (provider.endsWith("/") ? createRest : 
("/" + createRest));
+               WebResource r = c.resource(uri) ;
+               Gson gson = new GsonBuilder().create() ;
+               String jsonString = gson.toJson(vXKey) ;
+        String response = 
r.accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).post(String.class,
 jsonString) ;
+        logger.debug("Create RESPONSE: [" + response + "]") ;
+        ret = gson.fromJson(response, VXKmsKey.class) ;
+           return ret ;                
+       }
+       
+       public VXKmsKey getKey(String provider, String name){
+               try {
+                       provider = getKMSURL(provider);
+               } catch (Exception e) {
+                       logger.error("getKey(" + provider + ", "+ name +") 
failed", e);
+               }
+               Client c = getClient() ;
+               String keyRest = 
KMS_KEY_METADATA_URI.replaceAll(Pattern.quote("${alias}"), name);
+               String currentUserLoginId = ContextUtil.getCurrentUserLoginId();
+               keyRest = keyRest.replaceAll(Pattern.quote("${userName}"), 
currentUserLoginId);
+               String uri = provider + (provider.endsWith("/") ? keyRest : 
("/" + keyRest));
+               WebResource r = c.resource(uri) ;
+               String response = 
r.accept(MediaType.APPLICATION_JSON_TYPE).get(String.class);
+               Gson gson = new GsonBuilder().create() ;
+               logger.debug("RESPONSE: [" + response + "]") ;
+               VXKmsKey key = gson.fromJson(response, VXKmsKey.class) ;
+               return key;
+       }
+       
+       private String getKMSURL(String name) throws Exception{
+               String provider = null;
+               RangerService rangerService = null;
+               try {
+                       rangerService = svcStore.getServiceByName(name);
+                       provider = 
rangerService.getConfigs().get(KMS_URL_CONFIG);
+                       provider = provider.replaceAll("kms://","");
+                       provider = provider.replaceAll("http@","http://";);
+               } catch(Exception excp) {
+                       logger.error("getServiceByName(" + name + ") failed", 
excp);
+                       throw new Exception("getServiceByName(" + name + ") 
failed", excp);
+               }
+
+               if(rangerService == null || provider == null) {
+                       throw new Exception("Provider "+provider+" not found");
+               }
+               return provider;
+       }
+
+       private synchronized Client getClient() {
+               Client ret = null; 
+               ClientConfig cc = new DefaultClientConfig();
+               cc.getProperties().put(ClientConfig.PROPERTY_FOLLOW_REDIRECTS, 
true);
+               ret = Client.create(cc);        
+               return ret ;
+       }       
+       
+       public VXKmsKeyList getFilteredKeyList(HttpServletRequest request, 
VXKmsKeyList vXKmsKeyList){
+               List<SortField> sortFields = new ArrayList<SortField>();
+               sortFields.add(new SortField(KeySearchFilter.KEY_NAME, 
KeySearchFilter.KEY_NAME));
+               
+               KeySearchFilter filter = getKeySearchFilter(request, 
sortFields);
+               
+               Predicate pred = getPredicate(filter);
+               
+               if(pred != null) {
+                       CollectionUtils.filter(vXKmsKeyList.getVXKeys(), pred);
+               }
+               return vXKmsKeyList;
+       }
+       
+       private Predicate getPredicate(KeySearchFilter filter) {
+               if(filter == null || filter.isEmpty()) {
+                       return null;
+               }
+
+               List<Predicate> predicates = new ArrayList<Predicate>();
+
+               
addPredicateForKeyName(filter.getParam(KeySearchFilter.KEY_NAME), predicates);
+               
+               Predicate ret = CollectionUtils.isEmpty(predicates) ? null : 
PredicateUtils.allPredicate(predicates);
+
+               return ret;
+       }
+       
+       private Predicate addPredicateForKeyName(final String name, 
List<Predicate> predicates) {
+                       if(StringUtils.isEmpty(name)) {
+                               return null;
+                       }
+
+                       Predicate ret = new Predicate() {
+                               @Override
+                               public boolean evaluate(Object object) {
+                                       if(object == null) {
+                                               return false;
+                                       }
+
+                                       boolean ret = false;
+
+                                       if(object instanceof VXKmsKey) {
+                                               VXKmsKey vXKmsKey = 
(VXKmsKey)object;
+                                               
if(StringUtils.isEmpty(vXKmsKey.getName())) {
+                                                       ret = true;
+                                               }else{
+                                                       ret = 
vXKmsKey.getName().contains(name);
+                                               }
+                                       } else {
+                                               ret = true;
+                                       }
+
+                                       return ret;
+                               }
+                       };
+
+                       if(predicates != null) {
+                               predicates.add(ret);
+                       }
+                               
+                       return ret;
+       }
+               
+       private KeySearchFilter getKeySearchFilter(HttpServletRequest request, 
List<SortField> sortFields) {
+               if (request == null) {
+                       return null;
+               }
+               KeySearchFilter ret = new KeySearchFilter();
+
+               if (MapUtils.isEmpty(request.getParameterMap())) {
+                       ret.setParams(new HashMap<String, String>());
+               }
+
+               ret.setParam(KeySearchFilter.KEY_NAME, 
request.getParameter(KeySearchFilter.KEY_NAME));
+               extractCommonCriteriasForFilter(request, ret, sortFields);
+               return ret;
+       }
+       
+       private KeySearchFilter 
extractCommonCriteriasForFilter(HttpServletRequest request, KeySearchFilter 
ret, List<SortField> sortFields) {
+               int startIndex = 
restErrorUtil.parseInt(request.getParameter(KeySearchFilter.START_INDEX), 0,
+                               "Invalid value for parameter startIndex", 
MessageEnums.INVALID_INPUT_DATA, null,
+                               KeySearchFilter.START_INDEX);
+               ret.setStartIndex(startIndex);
+
+               int pageSize = 
restErrorUtil.parseInt(request.getParameter(KeySearchFilter.PAGE_SIZE),
+                               configUtil.getDefaultMaxRows(), "Invalid value 
for parameter pageSize",
+                               MessageEnums.INVALID_INPUT_DATA, null, 
KeySearchFilter.PAGE_SIZE);
+               ret.setMaxRows(pageSize);
+
+               
ret.setGetCount(restErrorUtil.parseBoolean(request.getParameter("getCount"), 
true));
+               String sortBy = 
restErrorUtil.validateString(request.getParameter(KeySearchFilter.SORT_BY),
+                               StringUtil.VALIDATION_ALPHA, "Invalid value for 
parameter sortBy", MessageEnums.INVALID_INPUT_DATA,
+                               null, KeySearchFilter.SORT_BY);
+
+               boolean sortSet = false;
+               if (!StringUtils.isEmpty(sortBy)) {
+                       for (SortField sortField : sortFields) {
+                               if 
(sortField.getParamName().equalsIgnoreCase(sortBy)) {
+                                       ret.setSortBy(sortField.getParamName());
+                                       String sortType = 
restErrorUtil.validateString(request.getParameter("sortType"),
+                                                       
StringUtil.VALIDATION_ALPHA, "Invalid value for parameter sortType",
+                                                       
MessageEnums.INVALID_INPUT_DATA, null, "sortType");
+                                       ret.setSortType(sortType);
+                                       sortSet = true;
+                                       break;
+                               }
+                       }
+               }
+
+               if (!sortSet && !StringUtils.isEmpty(sortBy)) {
+                       logger.info("Invalid or unsupported sortBy field 
passed. sortBy=" + sortBy, new Throwable());
+               }
+               
+               if(ret.getParams() == null) {
+                       ret.setParams(new HashMap<String, String>());
+               }
+               return ret;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java 
b/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
index f9eb61b..b97f666 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/AppConstants.java
@@ -526,11 +526,15 @@ public class AppConstants extends RangerCommonEnums {
         * CLASS_TYPE_RANGER_GROUP_PERMISSION is an element of enum ClassTypes. 
Its value is "CLASS_TYPE_RANGER_GROUP_PERMISSION".
         */
        public static final int CLASS_TYPE_RANGER_GROUP_PERMISSION = 1036;
+       /**
+        * CLASS_TYPE_XA_KMS_KEY is an element of enum ClassTypes. Its value is 
"CLASS_TYPE_XA_KMS_KEY".
+        */
+       public static final int CLASS_TYPE_XA_KMS_KEY = 1037;   
 
        /**
         * Max value for enum ClassTypes_MAX
         */
-       public static final int ClassTypes_MAX = 1036;
+       public static final int ClassTypes_MAX = 1037;
        
        /***************************************************************
         * Enum values for Default SortOrder

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/java/org/apache/ranger/rest/XKeyREST.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/XKeyREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/XKeyREST.java
new file mode 100755
index 0000000..baab333
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/rest/XKeyREST.java
@@ -0,0 +1,169 @@
+package org.apache.ranger.rest;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+
+import org.apache.log4j.Logger;
+import org.apache.ranger.biz.KmsKeyMgr;
+import org.apache.ranger.common.MessageEnums;
+import org.apache.ranger.common.RESTErrorUtil;
+import org.apache.ranger.common.SearchUtil;
+import org.apache.ranger.common.annotation.RangerAnnotationJSMgrName;
+import org.apache.ranger.view.VXKmsKey;
+import org.apache.ranger.view.VXKmsKeyList;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+
+@Path("keys")
+@Component
+@Scope("request")
+@RangerAnnotationJSMgrName("KeyMgr")
+@Transactional(propagation = Propagation.REQUIRES_NEW)
+public class XKeyREST {
+       static Logger logger = Logger.getLogger(XKeyREST.class);
+       
+       private static String UNAUTHENTICATED_MSG = "Unauthenticated : Please 
check the premission in the policy for the user";
+       
+       @Autowired
+       KmsKeyMgr keyMgr;
+               
+       @Autowired
+       SearchUtil searchUtil;
+       
+       @Autowired
+       RESTErrorUtil restErrorUtil;
+               
+       /**
+        * Implements the traditional search functionalities for Keys
+        * 
+        * @param request
+        * @return
+        */
+       @GET
+       @Path("/keys")
+       @Produces({ "application/xml", "application/json" })
+       public VXKmsKeyList searchKeys(@Context HttpServletRequest request, 
@QueryParam("provider") String provider) {
+               VXKmsKeyList vxKmsKeyList = new VXKmsKeyList();
+               try{
+                       vxKmsKeyList = keyMgr.searchKeys(provider);
+                       vxKmsKeyList = keyMgr.getFilteredKeyList(request, 
vxKmsKeyList);
+               }catch(Exception e){
+                       e.printStackTrace();
+                       handleError(e.getMessage());                            
                
+               }
+               return vxKmsKeyList;
+       }
+       
+       /**
+        * Implements the Rollover key functionality 
+        * @param vXKey
+        * @return
+        */
+       @PUT
+       @Path("/key")
+       @Produces({ "application/xml", "application/json" })
+       public VXKmsKey rolloverKey(@QueryParam("provider") String provider, 
VXKmsKey vXKey) {
+               VXKmsKey vxKmsKey = new VXKmsKey();
+               try{
+                       String name = vXKey.getName();
+                       if (name == null || name.isEmpty()) {
+                               throw restErrorUtil.createRESTException("Please 
provide a valid "
+                                               + "alias.", 
MessageEnums.INVALID_INPUT_DATA);
+                       }
+                       vxKmsKey = keyMgr.rolloverKey(provider, vXKey);
+               }catch(Exception e){
+                       handleError(e.getMessage());
+               }
+               return vxKmsKey;
+       }       
+       
+       /**
+        * Implements the delete key functionality
+        * @param name
+        * @param request
+        */
+       @DELETE
+       @Path("/key/{alias}")
+       @Produces({ "application/xml", "application/json" })
+       public void deleteKey(@PathParam("alias") String name, 
@QueryParam("provider") String provider, @Context HttpServletRequest request) {
+               try{
+                       if (name == null || name.isEmpty()) {
+                               throw restErrorUtil.createRESTException("Please 
provide a valid "
+                                               + "alias.", 
MessageEnums.INVALID_INPUT_DATA);
+                       }
+                       keyMgr.deleteKey(provider, name);
+               }catch(Exception e){
+                       handleError(e.getMessage());
+               }
+       }
+       
+       /**
+        * Implements the create key functionality
+        * @param vXKey
+        * @return
+        */
+       @POST
+       @Path("/key")
+       @Produces({ "application/xml", "application/json" })
+       public VXKmsKey createKey(@QueryParam("provider") String provider, 
VXKmsKey vXKey) {
+               VXKmsKey vxKmsKey = new VXKmsKey();
+               try{
+                       String name = vXKey.getName();
+                       if (name == null || name.isEmpty()) {
+                               throw restErrorUtil.createRESTException("Please 
provide a valid "
+                                               + "alias.", 
MessageEnums.INVALID_INPUT_DATA);
+                       }
+                       vxKmsKey = keyMgr.createKey(provider, vXKey);
+               }catch(Exception e){
+                       handleError(e.getMessage());
+               }
+               return vxKmsKey;
+       }
+       
+       /**
+        * 
+        * @param name
+        * @param provider
+        * @return
+        */
+       @GET
+       @Path("/key/{alias}")
+       @Produces({ "application/xml", "application/json" })
+       public VXKmsKey getKey(@PathParam("alias") String 
name,@QueryParam("provider") String provider){
+               VXKmsKey vxKmsKey = new VXKmsKey();
+               try{
+                       if (name == null || name.isEmpty()) {
+                               throw restErrorUtil.createRESTException("Please 
provide a valid "
+                                               + "alias.", 
MessageEnums.INVALID_INPUT_DATA);
+                       }
+                       vxKmsKey = keyMgr.getKey(provider, name);
+               }catch(Exception e){
+                       handleError(e.getMessage());
+               }
+               return vxKmsKey;
+       }
+       
+       private void handleError(String message) {              
+               if(!(message==null) && !(message.isEmpty()) && 
message.contains("Connection refused")){
+                       message = "Connection refused : Please check the KMS 
provider URL and whether the Ranger KMS is running";                       
+               }else if(!(message==null) && !(message.isEmpty()) && 
message.contains("response status of 403")){
+                       message = UNAUTHENTICATED_MSG;
+               }else if(!(message==null) && !(message.isEmpty()) && 
message.contains("response status of 401")){
+                       message = UNAUTHENTICATED_MSG;
+               }       
+               throw restErrorUtil.createRESTException(message, 
MessageEnums.ERROR_SYSTEM);
+       }       
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/java/org/apache/ranger/view/VXKmsKey.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/view/VXKmsKey.java 
b/security-admin/src/main/java/org/apache/ranger/view/VXKmsKey.java
new file mode 100755
index 0000000..dc71f13
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/view/VXKmsKey.java
@@ -0,0 +1,239 @@
+/*
+ * 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.ranger.view;
+
+/**
+ * Key
+ * 
+ */
+
+import java.util.Map;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.ranger.common.AppConstants;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
+import org.codehaus.jackson.annotate.JsonIgnoreProperties;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonAutoDetect(getterVisibility=Visibility.NONE, 
setterVisibility=Visibility.NONE, fieldVisibility=Visibility.ANY)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL )
+@JsonIgnoreProperties(ignoreUnknown=true)
+@XmlRootElement
+public class VXKmsKey extends VXDataObject implements java.io.Serializable {
+       private static final long serialVersionUID = 1L;
+
+       /**
+        * Name
+        */
+       protected String name;
+       /**
+        * Cipher
+        */
+       protected String cipher;
+       /**
+        * Length
+        */
+       protected int length;
+       /**
+        * Description
+        */
+       protected String description;
+       /**
+        * Version
+        */
+       protected int versions;
+       /**
+        * Material
+        */
+       protected String material;
+       /**
+        * Version Name
+        */
+       protected String versionName;
+       
+       /**
+        * Key Created Date
+        */
+       protected Long created;
+       
+       /**
+        * Attributes
+        */
+       protected Map<String, String> attributes;
+
+       /**
+        * Default constructor. This will set all the attributes to default 
value.
+        */
+       public VXKmsKey ( ) {   
+       }
+       
+       /**
+        * @return the name
+        */
+       public String getName() {
+               return name;
+       }
+
+       /**
+        * @param name the name to set
+        */
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       /**
+        * @return the cipher
+        */
+       public String getCipher() {
+               return cipher;
+       }
+
+       /**
+        * @param cipher the cipher to set
+        */
+       public void setCipher(String cipher) {
+               this.cipher = cipher;
+       }
+
+       /**
+        * @return the length
+        */
+       public int getLength() {
+               return length;
+       }
+
+       /**
+        * @param length the length to set
+        */
+       public void setLength(int length) {
+               this.length = length;
+       }
+
+       /**
+        * @return the description
+        */
+       public String getDescription() {
+               return description;
+       }
+
+       /**
+        * @param description the description to set
+        */
+       public void setDescription(String description) {
+               this.description = description;
+       }
+
+       /**
+        * @return the version
+        */
+       public int getVersions() {
+               return versions;
+       }
+
+       /**
+        * @param version the version to set
+        */
+       public void setVersions(int versions) {
+               this.versions = versions;
+       }
+
+       /**
+        * @return the material
+        */
+       public String getMaterial() {
+               return material;
+       }
+
+       /**
+        * @param material the material to set
+        */
+       public void setMaterial(String material) {
+               this.material = material;
+       }
+
+       /**
+        * @return the versionName
+        */
+       public String getVersionName() {
+               return versionName;
+       }
+
+       /**
+        * @param versionName the versionName to set
+        */
+       public void setVersionName(String versionName) {
+               this.versionName = versionName;
+       }
+
+       /**
+        * @return the created
+        */
+       public Long getCreated() {
+               return created;
+       }
+
+       /**
+        * @param created the created to set
+        */
+       public void setCreated(Long created) {
+               this.created = created;
+       }
+
+       /**
+        * @return the attributes
+        */
+       public Map<String, String> getAttributes() {
+               return attributes;
+       }
+
+       /**
+        * @param attributes the attributes to set
+        */
+       public void setAttributes(Map<String, String> attributes) {
+               this.attributes = attributes;
+       }       
+
+       @Override
+       public int getMyClassType( ) {
+           return AppConstants.CLASS_TYPE_XA_KMS_KEY;
+       }
+
+       /**
+        * This return the bean content in string format
+        * @return formatedStr
+       */
+       public String toString( ) {
+               String str = "VXUser={";
+               str += super.toString();
+               str += "name={" + name + "} ";
+               str += "cipher={" + cipher + "} ";
+               str += "length={" + length + "} ";
+               str += "description={" + description + "} ";
+               str += "atrribute={" + attributes + "} ";
+               str += "created={" + created.toString() + "} ";
+               str += "version={" + versions + "} ";
+               str += "material={" + material + "} ";
+               str += "versionName={" + versionName + "} ";
+               str += "}";
+               return str;
+       }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/java/org/apache/ranger/view/VXKmsKeyList.java
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/java/org/apache/ranger/view/VXKmsKeyList.java 
b/security-admin/src/main/java/org/apache/ranger/view/VXKmsKeyList.java
new file mode 100644
index 0000000..05e96f5
--- /dev/null
+++ b/security-admin/src/main/java/org/apache/ranger/view/VXKmsKeyList.java
@@ -0,0 +1,84 @@
+/*
+ * 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.ranger.view;
+
+/**
+ * List wrapper class for VXKey
+ * 
+ */
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.ranger.common.view.VList;
+import org.codehaus.jackson.annotate.JsonAutoDetect;
+import org.codehaus.jackson.annotate.JsonAutoDetect.Visibility;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonAutoDetect(getterVisibility=Visibility.NONE, 
setterVisibility=Visibility.NONE, fieldVisibility=Visibility.ANY)
+@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL )
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class VXKmsKeyList extends VList {
+       private static final long serialVersionUID = 1L;
+    List<VXKmsKey> vXKeys = new ArrayList<VXKmsKey>();
+
+    public VXKmsKeyList() {
+       super();
+    }
+
+    public VXKmsKeyList(List<VXKmsKey> objList) {
+       super(objList);
+       this.vXKeys = objList;
+    }
+
+    /**
+     * @return the vXKeys
+     */
+    public List<VXKmsKey> getVXKeys() {
+       return vXKeys;
+    }
+
+    /**
+     * @param vXKeys
+     *            the vXKeys to set
+     */
+    public void setVXKeys(List<VXKmsKey> vXKeys) {
+       this.vXKeys = vXKeys;
+    }
+
+    @Override
+    public int getListSize() {
+       if (vXKeys != null) {
+           return vXKeys.size();
+       }
+       return 0;
+    }
+
+    @Override
+    public List<VXKmsKey> getList() {
+       return vXKeys;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/webapp/scripts/collection_bases/VXKmsKeyListBase.js
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/webapp/scripts/collection_bases/VXKmsKeyListBase.js 
b/security-admin/src/main/webapp/scripts/collection_bases/VXKmsKeyListBase.js
new file mode 100644
index 0000000..46feaf3
--- /dev/null
+++ 
b/security-admin/src/main/webapp/scripts/collection_bases/VXKmsKeyListBase.js
@@ -0,0 +1,68 @@
+/*
+ * 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.
+ */
+
+ 
+define(function(require){
+       'use strict';   
+
+       var XABaseCollection    = require('collections/XABaseCollection');
+       var XAGlobals                   = require('utils/XAGlobals');
+       var VXKmsKey                    = require('models/VXKmsKey');
+
+       var VXKmsKeyListBase = XABaseCollection.extend(
+       /** @lends VXKmsKeyListBase.prototype */
+       {
+               url: XAGlobals.baseURL + 'keys/keys',
+
+               model : VXKmsKey,
+
+               /**
+                * VXKmsKeyListBase initialize method
+                * @augments XABaseCollection
+                * @constructs
+                */
+               initialize : function() {
+                       this.modelName = 'VXKmsKey';
+                       this.modelAttrName = 'vXKeys';
+                       this.bindErrorEvents();
+        },
+
+
+               /*************************
+                * Non - CRUD operations
+                *************************/
+               
+               
+
+       },{
+               // static class members
+               /**
+               * Table Cols to be passed to Backgrid
+               * UI has to use this as base and extend this.
+               *
+               */
+
+               tableCols : {}
+
+       });
+
+    return VXKmsKeyListBase;
+});
+
+

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/webapp/scripts/collections/VXKmsKeyList.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/collections/VXKmsKeyList.js 
b/security-admin/src/main/webapp/scripts/collections/VXKmsKeyList.js
new file mode 100644
index 0000000..7b4e59d
--- /dev/null
+++ b/security-admin/src/main/webapp/scripts/collections/VXKmsKeyList.js
@@ -0,0 +1,36 @@
+/*
+ * 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.
+ */
+
+ 
+define(function(require){
+       'use strict';   
+
+       var VXKmsKeyListBase            = 
require('collection_bases/VXKmsKeyListBase');
+
+       var VXKmsKeyList = VXKmsKeyListBase.extend(
+       /** @lends VXKmsKeyList.prototype */
+       {
+       },{
+               // static class members
+       });
+
+    return VXKmsKeyList;
+});
+
+

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/webapp/scripts/controllers/Controller.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/controllers/Controller.js 
b/security-admin/src/main/webapp/scripts/controllers/Controller.js
index a329dad..df820e5 100644
--- a/security-admin/src/main/webapp/scripts/controllers/Controller.js
+++ b/security-admin/src/main/webapp/scripts/controllers/Controller.js
@@ -391,6 +391,43 @@ define(function(require) {
                        location.hash = XALinks.get('UserProfile').href;
                }
            },
+          /************** KMS *********************/
+          kmsManagerAction :function(kmsManagePage, kmsServiceName){
+                  MAppState.set({ 'currentTab' : XAGlobals.AppTabs.KMS.value 
});
+                  var view             = require('views/kms/KMSTableLayout');
+                  var KmsKeyList       = require('collections/VXKmsKeyList');
+                  App.rContent.show(new view({
+                          collection     : new KmsKeyList(),
+                          kmsServiceName : kmsServiceName,
+                          kmsManagePage  : kmsManagePage
+                  }));
+          },
+          kmsKeyCreateAction : function(kmsServiceName){
+                  MAppState.set({ 'currentTab' : XAGlobals.AppTabs.KMS.value 
});
+                  var view             = require('views/kms/KmsKeyCreate');
+                  var KmsKey           = require('models/VXKmsKey');
+                  
+                  App.rContent.show(new view({
+                          model : new KmsKey(),
+                          kmsServiceName : kmsServiceName
+                  }));
+          },
+          kmsKeyEditAction : function(kmsServiceName, keyName){
+                  MAppState.set({ 'currentTab' : XAGlobals.AppTabs.KMS.value 
});
+                  var view             = require('views/kms/KmsKeyCreate');
+                  var VXKmsKey         = require('models/VXKmsKey');
+                  var kmsKeyModel      = new VXKmsKey({'name' : keyName});
+                  var data = {'provider': kmsServiceName}
+                  kmsKeyModel.fetch({
+                                  cache : true,
+                                  data : data
+                          }).done(function(){
+                          App.rContent.show(new view({
+                                  model : kmsKeyModel,
+                                  kmsServiceName : kmsServiceName
+                          }));
+                  });     
+          },
           /**************** ERROR PAGE ******************************/
           pageNotFoundAction   : function() {
                   var XAUtils                  = require('utils/XAUtils');

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/webapp/scripts/model_bases/VXKmsKeyBase.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/model_bases/VXKmsKeyBase.js 
b/security-admin/src/main/webapp/scripts/model_bases/VXKmsKeyBase.js
new file mode 100644
index 0000000..9e431a0
--- /dev/null
+++ b/security-admin/src/main/webapp/scripts/model_bases/VXKmsKeyBase.js
@@ -0,0 +1,103 @@
+/*
+ * 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.
+ */
+
+ 
+define(function(require){
+       'use strict';   
+
+       var XABaseModel = require('models/XABaseModel');
+       var XAGlobals   = require('utils/XAGlobals');
+
+       var VXKmsKeyBase = XABaseModel.extend(
+       /** @lends VXKmsKeyBase.prototype */
+       {
+               urlRoot: XAGlobals.baseURL + 'keys/key',
+               
+               defaults: {},
+
+               serverSchema : {
+                       "id" : {
+                               "dataType" : "Long"
+                       },
+                       "version" : {
+                               "dataType" : "int"
+                       },
+                       "createDate" : {
+                               "dataType" : "Date"
+                       },
+                       "updateDate" : {
+                               "dataType" : "Date"
+                       },
+                       "permList" : {
+                               "dataType" : "list",
+                               "listType" : "VNameValue"
+                       },
+                       "forUserId" : {
+                               "dataType" : "Long"
+                       },
+                       "status" : {
+                               "dataType" : "int"
+                       },
+                       "priGrpId" : {
+                               "dataType" : "Long"
+                       },
+                       "updatedBy" : {
+                               "dataType" : "String"
+                       },
+                       "isSystem" : {
+                               "dataType" : "boolean"
+                       },
+                       "name" : {
+                               "dataType" : "String"
+                       },
+                       "description" : {
+                               "dataType" : "String"
+                       },
+                       "groupType" : {
+                               "dataType" : "int"
+                       },
+                       "credStoreId" : {
+                               "dataType" : "Long"
+                       }
+               },
+               
+               
+               idAttribute: 'name',
+
+               /**
+                * VXKmsKeyBase initialize method
+                * @augments XABaseModel
+                * @constructs
+                */
+               initialize: function() {
+                       this.modelName = 'VXKmsKeyBase';
+               },
+               getKmsKeyURL: function(keyName, serviceName) {
+                       return this.urlRoot + "/"+keyName;
+               },
+
+       }, {
+               // static class members
+       });
+
+    return VXKmsKeyBase;
+       
+});
+
+

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/webapp/scripts/models/VXKmsKey.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/models/VXKmsKey.js 
b/security-admin/src/main/webapp/scripts/models/VXKmsKey.js
new file mode 100644
index 0000000..d7a464c
--- /dev/null
+++ b/security-admin/src/main/webapp/scripts/models/VXKmsKey.js
@@ -0,0 +1,54 @@
+/*
+ * 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.
+ */
+
+ 
+define(function(require){
+       'use strict';   
+
+       var VXKmsKeyBase        = require('model_bases/VXKmsKeyBase');
+       var localization        = require('utils/XALangSupport');
+       var XAEnums             = require('utils/XAEnums');
+       
+       var VXKmsKey = VXKmsKeyBase.extend(
+       /** @lends VXKmsKey.prototype */
+       {
+               /**
+                * VXKmsKey initialize method
+                * @augments XABaseModel
+                * @constructs
+                */
+               initialize: function() {
+                       this.modelName = 'VXKmsKey';
+                       this.bindErrorEvents();
+               },
+
+               /** This models toString() */
+               toString : function(){
+                       return /*this.get('name')*/;
+               }
+
+       }, {
+               // static class members
+       });
+
+    return VXKmsKey;
+       
+});
+
+

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/webapp/scripts/modules/XALinks.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/modules/XALinks.js 
b/security-admin/src/main/webapp/scripts/modules/XALinks.js
index 1c8ec93..747b6e6 100644
--- a/security-admin/src/main/webapp/scripts/modules/XALinks.js
+++ b/security-admin/src/main/webapp/scripts/modules/XALinks.js
@@ -64,10 +64,25 @@ define(function(require) {
                                text : 'h.usersOrGroups',
                                title: 'h.usersOrGroups'
                        },
-                       Configs: { 
-                               href : '#!/configs',
-                               text : 'h.configs',
-                               title: 'h.configs'
+                       Kms : { 
+                               href : '#!/kms/keys',
+                               text : 'h.kms',
+                               title: 'h.kms'
+                       },
+                       KmsKeyCreate : { 
+                               href : '#!/kms/keys/create',
+                               text : 'h.keyCreate',
+                               title: 'h.keyCreate'
+                       },
+                       KmsKeyEdit : { 
+                               href : 'javascript:void(0);',
+                               text : 'h.keyEdit',
+                               title: 'h.keyEdit'
+                       },
+                       KmsKeyForService : { 
+                               href : 'javascrit:;',
+                               text : 'KMS_TEST1',
+                               title: 'KMS_TEST1'
                        },
                        ManageTables: { 
                                href : '#!/managetables',
@@ -284,6 +299,17 @@ define(function(require) {
                     title: options.model.get('module')
                 };
                        },
+                       KmsServiceForKey : function(options) {
+                               var href = "javascript:void(0);";
+                               if(_.has(options,'kmsServiceDefModel') && 
_.has(options,'kmsService')){
+                    href =  
'#!/service/'+options.kmsServiceDefModel.id+"/edit/"+options.kmsService.id;
+                }
+                               return {
+                    href : href,
+                    text : options.kmsService.get('name'),
+                    title: options.kmsService.get('name')
+                };
+                       }
        };      
        
        

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
----------------------------------------------------------------------
diff --git 
a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js 
b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
index fa475b3..9eae73c 100644
--- a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
+++ b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
@@ -214,7 +214,15 @@ define(function(require) {
                                isVisible                       : 'Visible',
                                delegatedAdmin                                  
: 'Delegate Admin',
                                policyId                                        
        : 'Policy ID',
-                               moduleName                                      
        : 'Module Name'
+                               moduleName                                      
        : 'Module Name',
+                               keyManagement                                   
: 'Key Management',
+                               addNewKey                                       
        : 'Add New Key',
+                               keyName                                         
        : 'Key Name',
+                               cipher                                          
        : 'Cipher',
+                               length                                          
        : 'Length',
+                               version                                         
        : 'Version',
+                               attributes                                      
        : 'Attributes',
+                               material                                        
        : 'Material'
                        },
                        btn : {
                                add                                             
        : 'Add',
@@ -274,7 +282,11 @@ define(function(require) {
                                searchForYourGroup                      
:"Search for your groups...",
                                access                                          
: 'Access',
                                policyCondition                         : 
'Policy Condtions',
-                               permissions                                     
: 'Permissions'
+                               permissions                                     
: 'Permissions',
+                               kms                                             
        : 'KMS',
+                               keyCreate                                       
: 'Key Create',
+                               keyEdit                                 : 'Key 
Edit',
+                               searchForKeys                           
:"Search for your keys...",
                                
                                
                        },
@@ -303,6 +315,7 @@ define(function(require) {
                                repoDoesNotExistAnymore   : 'Repository does 
not exist anymore..',
                                policyDisabledMsg                 : 'This 
policy is currently in disabled state.',
                                noRecordsFound                    : 'No Records 
Found',
+                               keyDeleteMsg                      : 'Key 
deleted successfully'
                                
                                
                                

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/webapp/scripts/routers/Router.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/routers/Router.js 
b/security-admin/src/main/webapp/scripts/routers/Router.js
index 70943a1..e706cdf 100644
--- a/security-admin/src/main/webapp/scripts/routers/Router.js
+++ b/security-admin/src/main/webapp/scripts/routers/Router.js
@@ -59,9 +59,15 @@ function(Backbone, Marionette, localization, MAppState, 
XAUtil){
                        "!/service/:serviceId/policies/:id/edit": 
"RangerPolicyEditAction",
 
                        /************PERMISSIONS VIEWS 
*****************************************/
-                        "!/permissions": "modulePermissionsAction",
-                        "!/permissions/:id/edit"        : 
"modulePermissionEditAction",
-                       /*************** ERROR PAGE 
****************************************/
+            "!/permissions"                                    : 
"modulePermissionsAction",
+            "!/permissions/:id/edit"        : "modulePermissionEditAction",
+                       
+                       /************ KMS ***************************/
+                       "!/kms/keys/:isService/manage/:serviceName"     : 
"kmsManagerAction",
+                       "!/kms/keys/:serviceName/create"                : 
"kmsKeyCreateAction",
+                       "!/kms/keys/:serviceName/edit/:id"              : 
"kmsKeyEditAction",
+                       
+                       /*************** ERROR PAGE ***********************/
                        "*actions"                                      : 
"pageNotFoundAction"
                        
                },

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/2f8bcd23/security-admin/src/main/webapp/scripts/utils/XAGlobals.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/utils/XAGlobals.js 
b/security-admin/src/main/webapp/scripts/utils/XAGlobals.js
index ee8c90d..f772e3c 100644
--- a/security-admin/src/main/webapp/scripts/utils/XAGlobals.js
+++ b/security-admin/src/main/webapp/scripts/utils/XAGlobals.js
@@ -46,13 +46,11 @@ define(function(require){
                        Dashboard                       : { value:1, valStr: 
'Dashboard'},
                        PolicyManager           : { value:2, valStr: 'Policy'},
                        Users                           : { value:3, valStr: 
'Users'},
-//                     Reports                         : { value:4, valStr: 
'Reports'},
-                       Config                          : { value:5, valStr: 
'Config'},
-                       Assets                          : { value:6, valStr: 
'Assets'},
-                       Analytics                       : { value:7, valStr: 
'Analytics'},
-                       Audit                           : { value:8, valStr: 
'Analytics'},
-                       Permissions                     : { value:9, 
valStr:'Permissions'},
-                       None                            : { value:10, valStr: 
'None'}
+                       Analytics                       : { value:4, valStr: 
'Analytics'},
+                       Audit                           : { value:5, valStr: 
'Audit'},
+                       Permissions                     : { value:6, 
valStr:'Permissions'},
+                       KMS                                     : { value:7, 
valStr: 'KMS'},
+                       None                            : { value:8, valStr: 
'None'}
                };
 
        XAGlobals.BooleanValue = {

Reply via email to