Repository: ranger
Updated Branches:
  refs/heads/master 41e220381 -> ad2731811


RANGER-1848:Implement getLinkList/getJobList in SqoopClient for Ranger Sqoop2 
plugin

Signed-off-by: peng.jianhua <peng.jian...@zte.com.cn>


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

Branch: refs/heads/master
Commit: ad2731811d56a2fa357cf06bea5e5c2f1fc1b98d
Parents: 41e2203
Author: zhangqiang2 <zhangqia...@zte.com.cn>
Authored: Tue Nov 21 11:01:02 2017 +0800
Committer: peng.jianhua <peng.jian...@zte.com.cn>
Committed: Wed Nov 22 10:34:11 2017 +0800

----------------------------------------------------------------------
 .../services/sqoop/client/SqoopClient.java      | 139 +++++++++++++++----
 .../client/json/model/SqoopJobResponse.java     | 104 ++++++++++++++
 .../client/json/model/SqoopJobsResponse.java    |  37 +++++
 .../client/json/model/SqoopLinkResponse.java    |  70 ++++++++++
 .../client/json/model/SqoopLinksResponse.java   |  37 +++++
 5 files changed, 358 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ranger/blob/ad273181/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/SqoopClient.java
----------------------------------------------------------------------
diff --git 
a/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/SqoopClient.java
 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/SqoopClient.java
index 640d5db..3563b31 100644
--- 
a/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/SqoopClient.java
+++ 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/SqoopClient.java
@@ -21,6 +21,7 @@ package org.apache.ranger.services.sqoop.client;
 
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -38,6 +39,10 @@ import org.apache.ranger.plugin.client.BaseClient;
 import org.apache.ranger.plugin.client.HadoopException;
 import 
org.apache.ranger.services.sqoop.client.json.model.SqoopConnectorResponse;
 import 
org.apache.ranger.services.sqoop.client.json.model.SqoopConnectorsResponse;
+import org.apache.ranger.services.sqoop.client.json.model.SqoopJobResponse;
+import org.apache.ranger.services.sqoop.client.json.model.SqoopJobsResponse;
+import org.apache.ranger.services.sqoop.client.json.model.SqoopLinkResponse;
+import org.apache.ranger.services.sqoop.client.json.model.SqoopLinksResponse;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
@@ -53,6 +58,10 @@ public class SqoopClient extends BaseClient {
 
        private static final String SQOOP_CONNECTOR_API_ENDPOINT = 
"/sqoop/v1/connector/all";
 
+       private static final String SQOOP_LINK_API_ENDPOINT = 
"/sqoop/v1/link/all";
+
+       private static final String SQOOP_JOB_API_ENDPOINT = 
"/sqoop/v1/job/all";
+
        private static final String ERROR_MESSAGE = " You can still save the 
repository and start creating "
                        + "policies, but you would not be able to use 
autocomplete for "
                        + "resource names. Check ranger_admin.log for more 
info.";
@@ -80,12 +89,12 @@ public class SqoopClient extends BaseClient {
 
        public List<String> getConnectorList(final String connectorMatching, 
final List<String> existingConnectors) {
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("Getting sqoop connector list for 
connectorMatching: " + connectorMatching
-                                       + ", existingConnectors: " + 
existingConnectors);
+                       LOG.debug("Get sqoop connector list for 
connectorMatching: " + connectorMatching + ", existingConnectors: "
+                                       + existingConnectors);
                }
                Subject subj = getLoginSubject();
                if (subj == null) {
-                       return null;
+                       return Collections.emptyList();
                }
 
                List<String> ret = Subject.doAs(subj, new 
PrivilegedAction<List<String>>() {
@@ -95,33 +104,106 @@ public class SqoopClient extends BaseClient {
 
                                ClientResponse response = 
getClientResponse(sqoopUrl, SQOOP_CONNECTOR_API_ENDPOINT, userName);
 
-                               SqoopConnectorsResponse sqoopConnectorsResponse 
= getSqoopConnectorResponse(response);
-                               if (sqoopConnectorsResponse == null) {
-                                       return null;
+                               SqoopConnectorsResponse sqoopConnectorsResponse 
= getSqoopResourceResponse(response,
+                                               SqoopConnectorsResponse.class);
+                               if (sqoopConnectorsResponse == null || 
CollectionUtils.isEmpty(sqoopConnectorsResponse.getConnectors())) {
+                                       return Collections.emptyList();
+                               }
+                               List<String> connectorResponses = new 
ArrayList<>();
+                               for (SqoopConnectorResponse 
sqoopConnectorResponse : sqoopConnectorsResponse.getConnectors()) {
+                                       
connectorResponses.add(sqoopConnectorResponse.getName());
                                }
-                               List<SqoopConnectorResponse> connectorResponses 
= sqoopConnectorsResponse.getConnectors();
+
                                List<String> connectors = null;
                                if 
(CollectionUtils.isNotEmpty(connectorResponses)) {
-                                       connectors = 
getConnectorFromResponse(connectorMatching, existingConnectors, 
connectorResponses);
+                                       connectors = 
filterResourceFromResponse(connectorMatching, existingConnectors, 
connectorResponses);
                                }
                                return connectors;
                        }
                });
 
                if (LOG.isDebugEnabled()) {
-                       LOG.debug("Getting sqoop project connector result: " + 
ret);
+                       LOG.debug("Get sqoop connector list result: " + ret);
                }
                return ret;
        }
 
        public List<String> getLinkList(final String linkMatching, final 
List<String> existingLinks) {
-               // TODO
-               return null;
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("Get sqoop link list for linkMatching: " + 
linkMatching + ", existingLinks: " + existingLinks);
+               }
+               Subject subj = getLoginSubject();
+               if (subj == null) {
+                       return Collections.emptyList();
+               }
+
+               List<String> ret = Subject.doAs(subj, new 
PrivilegedAction<List<String>>() {
+
+                       @Override
+                       public List<String> run() {
+
+                               ClientResponse response = 
getClientResponse(sqoopUrl, SQOOP_LINK_API_ENDPOINT, userName);
+
+                               SqoopLinksResponse sqoopLinksResponse = 
getSqoopResourceResponse(response, SqoopLinksResponse.class);
+                               if (sqoopLinksResponse == null || 
CollectionUtils.isEmpty(sqoopLinksResponse.getLinks())) {
+                                       return Collections.emptyList();
+                               }
+                               List<String> linkResponses = new ArrayList<>();
+                               for (SqoopLinkResponse sqoopLinkResponse : 
sqoopLinksResponse.getLinks()) {
+                                       
linkResponses.add(sqoopLinkResponse.getName());
+                               }
+
+                               List<String> links = null;
+                               if (CollectionUtils.isNotEmpty(linkResponses)) {
+                                       links = 
filterResourceFromResponse(linkMatching, existingLinks, linkResponses);
+                               }
+                               return links;
+                       }
+               });
+
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("Get sqoop link list result: " + ret);
+               }
+               return ret;
        }
 
        public List<String> getJobList(final String jobMatching, final 
List<String> existingJobs) {
-               // TODO
-               return null;
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("Get sqoop job list for jobMatching: " + 
jobMatching + ", existingJobs: " + existingJobs);
+               }
+               Subject subj = getLoginSubject();
+               if (subj == null) {
+                       return Collections.emptyList();
+               }
+
+               List<String> ret = Subject.doAs(subj, new 
PrivilegedAction<List<String>>() {
+
+                       @Override
+                       public List<String> run() {
+
+                               ClientResponse response = 
getClientResponse(sqoopUrl, SQOOP_JOB_API_ENDPOINT, userName);
+
+                               SqoopJobsResponse sqoopJobsResponse = 
getSqoopResourceResponse(response, SqoopJobsResponse.class);
+                               if (sqoopJobsResponse == null || 
CollectionUtils.isEmpty(sqoopJobsResponse.getJobs())) {
+                                       return Collections.emptyList();
+                               }
+                               List<String> jobResponses = new ArrayList<>();
+                               for (SqoopJobResponse sqoopJobResponse : 
sqoopJobsResponse.getJobs()) {
+                                       
jobResponses.add(sqoopJobResponse.getName());
+                               }
+
+                               List<String> jobs = null;
+                               if (CollectionUtils.isNotEmpty(jobResponses)) {
+                                       jobs = 
filterResourceFromResponse(jobMatching, existingJobs, jobResponses);
+                               }
+                               return jobs;
+                       }
+               });
+
+               if (LOG.isDebugEnabled()) {
+                       LOG.debug("Get sqoop job list result: " + ret);
+               }
+               return ret;
        }
 
        private static ClientResponse getClientResponse(String sqoopUrl, String 
sqoopApi, String userName) {
@@ -182,14 +264,14 @@ public class SqoopClient extends BaseClient {
                return response;
        }
 
-       private SqoopConnectorsResponse 
getSqoopConnectorResponse(ClientResponse response) {
-               SqoopConnectorsResponse sqoopConnectorsResponse = null;
+       private <T> T getSqoopResourceResponse(ClientResponse response, 
Class<T> classOfT) {
+               T resource = null;
                try {
                        if (response != null && response.getStatus() == 
HttpStatus.SC_OK) {
                                String jsonString = 
response.getEntity(String.class);
                                Gson gson = new 
GsonBuilder().setPrettyPrinting().create();
 
-                               sqoopConnectorsResponse = 
gson.fromJson(jsonString, SqoopConnectorsResponse.class);
+                               resource = gson.fromJson(jsonString, classOfT);
                        } else {
                                String msgDesc = "Unable to get a valid 
response for " + "expected mime type : [" + EXPECTED_MIME_TYPE
                                                + "], sqoopUrl: " + sqoopUrl + 
" - got null response.";
@@ -201,7 +283,7 @@ public class SqoopClient extends BaseClient {
                } catch (HadoopException he) {
                        throw he;
                } catch (Throwable t) {
-                       String msgDesc = "Exception while getting sqoop project 
response, sqoopUrl: " + sqoopUrl;
+                       String msgDesc = "Exception while getting sqoop 
resource response, sqoopUrl: " + sqoopUrl;
                        HadoopException hdpException = new 
HadoopException(msgDesc, t);
 
                        LOG.error(msgDesc, t);
@@ -214,26 +296,25 @@ public class SqoopClient extends BaseClient {
                                response.close();
                        }
                }
-               return sqoopConnectorsResponse;
+               return resource;
        }
 
-       private static List<String> getConnectorFromResponse(String 
connectorMatching, List<String> existingConnectors,
-                       List<SqoopConnectorResponse> connectorResponses) {
-               List<String> connectors = new ArrayList<String>();
-               for (SqoopConnectorResponse connectorResponse : 
connectorResponses) {
-                       String connectorName = connectorResponse.getName();
-                       if (CollectionUtils.isNotEmpty(existingConnectors) && 
existingConnectors.contains(connectorName)) {
+       private static List<String> filterResourceFromResponse(String 
resourceMatching, List<String> existingResources,
+                       List<String> resourceResponses) {
+               List<String> resources = new ArrayList<String>();
+               for (String resourceResponse : resourceResponses) {
+                       if (CollectionUtils.isNotEmpty(existingResources) && 
existingResources.contains(resourceResponse)) {
                                continue;
                        }
-                       if (StringUtils.isEmpty(connectorMatching) || 
connectorMatching.startsWith("*")
-                                       || 
connectorName.toLowerCase().startsWith(connectorMatching.toLowerCase())) {
+                       if (StringUtils.isEmpty(resourceMatching) || 
resourceMatching.startsWith("*")
+                                       || 
resourceResponse.toLowerCase().startsWith(resourceMatching.toLowerCase())) {
                                if (LOG.isDebugEnabled()) {
-                                       LOG.debug("getConnectorFromResponse(): 
Adding sqoop connector " + connectorName);
+                                       
LOG.debug("filterResourceFromResponse(): Adding sqoop resource " + 
resourceResponse);
                                }
-                               connectors.add(connectorName);
+                               resources.add(resourceResponse);
                        }
                }
-               return connectors;
+               return resources;
        }
 
        public static Map<String, Object> connectionTest(String serviceName, 
Map<String, String> configs) {

http://git-wip-us.apache.org/repos/asf/ranger/blob/ad273181/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopJobResponse.java
----------------------------------------------------------------------
diff --git 
a/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopJobResponse.java
 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopJobResponse.java
new file mode 100644
index 0000000..b78ca16
--- /dev/null
+++ 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopJobResponse.java
@@ -0,0 +1,104 @@
+/*
+ * 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.services.sqoop.client.json.model;
+
+import com.google.gson.annotations.SerializedName;
+
+public class SqoopJobResponse {
+       private Long id;
+
+       private String name;
+
+       @SerializedName("from-link-name")
+       private String fromLinkName;
+
+       @SerializedName("to-link-name")
+       private String toLinkName;
+
+       @SerializedName("from-connector-name")
+       private String fromConnectorName;
+
+       @SerializedName("to-connector-name")
+       private String toConnectorName;
+
+       @SerializedName("creation-user")
+       private String creationUser;
+
+       public Long getId() {
+               return id;
+       }
+
+       public void setId(Long id) {
+               this.id = id;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       public String getFromLinkName() {
+               return fromLinkName;
+       }
+
+       public void setFromLinkName(String fromLinkName) {
+               this.fromLinkName = fromLinkName;
+       }
+
+       public String getToLinkName() {
+               return toLinkName;
+       }
+
+       public void setToLinkName(String toLinkName) {
+               this.toLinkName = toLinkName;
+       }
+
+       public String getFromConnectorName() {
+               return fromConnectorName;
+       }
+
+       public void setFromConnectorName(String fromConnectorName) {
+               this.fromConnectorName = fromConnectorName;
+       }
+
+       public String getToConnectorName() {
+               return toConnectorName;
+       }
+
+       public void setToConnectorName(String toConnectorName) {
+               this.toConnectorName = toConnectorName;
+       }
+
+       public String getCreationUser() {
+               return creationUser;
+       }
+
+       public void setCreationUser(String creationUser) {
+               this.creationUser = creationUser;
+       }
+
+       @Override
+       public String toString() {
+               return "SqoopJobResponse [id=" + id + ", name=" + name + ", 
fromLinkName=" + fromLinkName + ", toLinkName="
+                               + toLinkName + ", fromConnectorName=" + 
fromConnectorName + ", toConnectorName=" + toConnectorName
+                               + ", creationUser=" + creationUser + "]";
+       }
+}

http://git-wip-us.apache.org/repos/asf/ranger/blob/ad273181/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopJobsResponse.java
----------------------------------------------------------------------
diff --git 
a/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopJobsResponse.java
 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopJobsResponse.java
new file mode 100644
index 0000000..a2de043
--- /dev/null
+++ 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopJobsResponse.java
@@ -0,0 +1,37 @@
+/*
+ * 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.services.sqoop.client.json.model;
+
+import java.util.List;
+
+public class SqoopJobsResponse {
+       private List<SqoopJobResponse> jobs;
+
+       public List<SqoopJobResponse> getJobs() {
+               return jobs;
+       }
+
+       public void setJobs(List<SqoopJobResponse> jobs) {
+               this.jobs = jobs;
+       }
+
+       @Override
+       public String toString() {
+               return "SqoopJobsResponse [jobs=" + jobs + "]";
+       }
+}

http://git-wip-us.apache.org/repos/asf/ranger/blob/ad273181/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopLinkResponse.java
----------------------------------------------------------------------
diff --git 
a/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopLinkResponse.java
 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopLinkResponse.java
new file mode 100644
index 0000000..0866a3e
--- /dev/null
+++ 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopLinkResponse.java
@@ -0,0 +1,70 @@
+/*
+ * 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.services.sqoop.client.json.model;
+
+import com.google.gson.annotations.SerializedName;
+
+public class SqoopLinkResponse {
+       private Long id;
+
+       private String name;
+
+       @SerializedName("connector-name")
+       private String connectorName;
+
+       @SerializedName("creation-user")
+       private String creationUser;
+
+       public Long getId() {
+               return id;
+       }
+
+       public void setId(Long id) {
+               this.id = id;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       public void setName(String name) {
+               this.name = name;
+       }
+
+       public String getConnectorName() {
+               return connectorName;
+       }
+
+       public void setConnectorName(String connectorName) {
+               this.connectorName = connectorName;
+       }
+
+       public String getCreationUser() {
+               return creationUser;
+       }
+
+       public void setCreationUser(String creationUser) {
+               this.creationUser = creationUser;
+       }
+
+       @Override
+       public String toString() {
+               return "SqoopLinkResponse [id=" + id + ", name=" + name + ", 
connectorName=" + connectorName
+                               + ", creationUser=" + creationUser + "]";
+       }
+}

http://git-wip-us.apache.org/repos/asf/ranger/blob/ad273181/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopLinksResponse.java
----------------------------------------------------------------------
diff --git 
a/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopLinksResponse.java
 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopLinksResponse.java
new file mode 100644
index 0000000..9fda8c2
--- /dev/null
+++ 
b/plugin-sqoop/src/main/java/org/apache/ranger/services/sqoop/client/json/model/SqoopLinksResponse.java
@@ -0,0 +1,37 @@
+/*
+ * 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.services.sqoop.client.json.model;
+
+import java.util.List;
+
+public class SqoopLinksResponse {
+       private List<SqoopLinkResponse> links;
+
+       public List<SqoopLinkResponse> getLinks() {
+               return links;
+       }
+
+       public void setLinks(List<SqoopLinkResponse> links) {
+               this.links = links;
+       }
+
+       @Override
+       public String toString() {
+               return "SqoopLinksResponse [links=" + links + "]";
+       }
+}

Reply via email to