You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by nb...@apache.org on 2020/10/23 12:29:11 UTC

[atlas] 02/02: ATLAS-3957 Use Audit framework to capture audit entries for Server Start and Server In Active mode (HA)

This is an automated email from the ASF dual-hosted git repository.

nbonte pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/atlas.git

commit 7dec8f538b6f3f52a4803b63efd3c5b0b41e966c
Author: Mandar Ambawane <ma...@freestoneinfotech.com>
AuthorDate: Thu Oct 22 14:23:59 2020 +0530

    ATLAS-3957 Use Audit framework to capture audit entries for Server Start and Server In Active mode (HA)
    
    Signed-off-by: Nikhil P Bonte <nb...@apache.org>
---
 addons/models/0000-Area0/0010-base_model.json      |  8 ++++
 ...-base_model_add_atlas_operation_attributes.json | 10 ++++-
 .../apache/atlas/model/audit/AtlasAuditEntry.java  |  4 +-
 .../resources/solr/core-template/solrconfig.xml    |  2 +-
 .../src/main/java/org/apache/atlas/BeanUtil.java   | 38 +++++++++++++++++
 .../apache/atlas/web/service/EmbeddedServer.java   | 49 ++++++++++++++++++++++
 .../org/apache/atlas/web/service/ServiceState.java | 45 +++++++++++++++++++-
 7 files changed, 151 insertions(+), 5 deletions(-)

diff --git a/addons/models/0000-Area0/0010-base_model.json b/addons/models/0000-Area0/0010-base_model.json
index 1de9e57..78ba927 100644
--- a/addons/models/0000-Area0/0010-base_model.json
+++ b/addons/models/0000-Area0/0010-base_model.json
@@ -37,6 +37,14 @@
         {
           "ordinal": 7,
           "value": "TYPE_DEF_DELETE"
+        },
+        {
+          "ordinal": 8,
+          "value": "SERVER_START"
+        },
+        {
+          "ordinal": 9,
+          "value": "SERVER_STATE_ACTIVE"
         }
       ]
     }
diff --git a/addons/models/0000-Area0/patches/006-base_model_add_atlas_operation_attributes.json b/addons/models/0000-Area0/patches/006-base_model_add_atlas_operation_attributes.json
index a27525e..6d96391 100644
--- a/addons/models/0000-Area0/patches/006-base_model_add_atlas_operation_attributes.json
+++ b/addons/models/0000-Area0/patches/006-base_model_add_atlas_operation_attributes.json
@@ -20,7 +20,15 @@
         {
           "ordinal": 7,
           "value": "TYPE_DEF_DELETE"
-        } 
+        },
+        {
+          "ordinal": 8,
+          "value": "SERVER_START"
+        },
+        {
+          "ordinal": 9,
+          "value": "SERVER_STATE_ACTIVE"
+        }
       ]
     }
   ]
diff --git a/intg/src/main/java/org/apache/atlas/model/audit/AtlasAuditEntry.java b/intg/src/main/java/org/apache/atlas/model/audit/AtlasAuditEntry.java
index 9ed4168..98eacfb 100644
--- a/intg/src/main/java/org/apache/atlas/model/audit/AtlasAuditEntry.java
+++ b/intg/src/main/java/org/apache/atlas/model/audit/AtlasAuditEntry.java
@@ -43,7 +43,9 @@ public class AtlasAuditEntry extends AtlasBaseModelObject implements Serializabl
         IMPORT_DELETE_REPL("IMPORT_DELETE_REPL"),
         TYPE_DEF_CREATE("TYPE_DEF_CREATE"),
         TYPE_DEF_UPDATE("TYPE_DEF_UPDATE"),
-        TYPE_DEF_DELETE("TYPE_DEF_DELETE");
+        TYPE_DEF_DELETE("TYPE_DEF_DELETE"),
+        SERVER_START("SERVER_START"),
+        SERVER_STATE_ACTIVE("SERVER_STATE_ACTIVE");
 
         private final String type;
 
diff --git a/test-tools/src/main/resources/solr/core-template/solrconfig.xml b/test-tools/src/main/resources/solr/core-template/solrconfig.xml
index 7cbfbd9..94f346f 100644
--- a/test-tools/src/main/resources/solr/core-template/solrconfig.xml
+++ b/test-tools/src/main/resources/solr/core-template/solrconfig.xml
@@ -434,7 +434,7 @@
           -->
         <lst name="defaults">
             <str name="defType">edismax</str>
-            <str name="qf">3k05_t 35x_t f0l_t i6d_l 7f2d_t 7gn9_t 3r45_s jr9_t 3u9x_t lc5_t mx1_t 7dhh_t iyt_l 3j7p_t 7klh_t 7hfp_t 7i85_t ohx_t 7bwl_l 7cp1_l</str>
+            <str name="qf">3ll1_t 35x_t f0l_t i6d_l 7f2d_t 7gn9_t 3sp1_s jr9_t 3vut_t lc5_t mx1_t 7dhh_t iyt_l 3j7p_t 7klh_t 7hfp_t 7i85_t ohx_t 7bwl_l 7cp1_l</str>
             <str name="hl.fl">*</str>
             <bool name="hl.requireFieldMatch">true</bool>
             <bool name="lowercaseOperators">true</bool>
diff --git a/webapp/src/main/java/org/apache/atlas/BeanUtil.java b/webapp/src/main/java/org/apache/atlas/BeanUtil.java
new file mode 100644
index 0000000..ef5a741
--- /dev/null
+++ b/webapp/src/main/java/org/apache/atlas/BeanUtil.java
@@ -0,0 +1,38 @@
+/**
+ * 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.atlas;
+
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.stereotype.Component;
+
+@Component
+public class BeanUtil implements ApplicationContextAware {
+    private static ApplicationContext context;
+
+    @Override
+    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
+        context = applicationContext;
+    }
+
+    public static <T> T getBean(Class<T> beanClass) {
+        return context.getBean(beanClass);
+    }
+}
\ No newline at end of file
diff --git a/webapp/src/main/java/org/apache/atlas/web/service/EmbeddedServer.java b/webapp/src/main/java/org/apache/atlas/web/service/EmbeddedServer.java
index 6985291..bdd660f 100755
--- a/webapp/src/main/java/org/apache/atlas/web/service/EmbeddedServer.java
+++ b/webapp/src/main/java/org/apache/atlas/web/service/EmbeddedServer.java
@@ -20,7 +20,12 @@ package org.apache.atlas.web.service;
 
 import org.apache.atlas.AtlasConfiguration;
 import org.apache.atlas.AtlasErrorCode;
+import org.apache.atlas.BeanUtil;
+import org.apache.atlas.RequestContext;
 import org.apache.atlas.exception.AtlasBaseException;
+import org.apache.atlas.model.audit.AtlasAuditEntry;
+import org.apache.atlas.repository.audit.AtlasAuditService;
+import org.apache.commons.lang.StringUtils;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
@@ -32,6 +37,9 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Date;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
@@ -43,8 +51,14 @@ public class EmbeddedServer {
 
     public static final String ATLAS_DEFAULT_BIND_ADDRESS = "0.0.0.0";
 
+    public static final Date SERVER_START_TIME = new Date();
+
     protected final Server server;
 
+    private AtlasAuditService auditService;
+
+    private ServiceState serviceState;
+
     public EmbeddedServer(String host, int port, String path) throws IOException {
         int queueSize = AtlasConfiguration.WEBSERVER_QUEUE_SIZE.getInt();
         LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(queueSize);
@@ -96,6 +110,9 @@ public class EmbeddedServer {
     public void start() throws AtlasBaseException {
         try {
             server.start();
+
+            auditServerStatus();
+
             server.join();
         } catch(Exception e) {
             throw new AtlasBaseException(AtlasErrorCode.EMBEDDED_SERVER_START, e);
@@ -109,4 +126,36 @@ public class EmbeddedServer {
             LOG.warn("Error during shutdown", e);
         }
     }
+
+    private void auditServerStatus() {
+        auditService = BeanUtil.getBean(AtlasAuditService.class);
+        serviceState = BeanUtil.getBean(ServiceState.class);
+
+        ServiceState.ServiceStateValue serviceStateValue = serviceState.getState();
+        String                         userName          = RequestContext.getCurrentUser();
+
+        if (userName == null) {
+            userName = StringUtils.EMPTY;
+        }
+
+        if (serviceStateValue == ServiceState.ServiceStateValue.ACTIVE) {
+            String hostName    = StringUtils.EMPTY;
+            String hostAddress = StringUtils.EMPTY;
+            Date   date        = new Date();
+
+            try {
+                hostName    = InetAddress.getLocalHost().getHostName();
+                hostAddress = InetAddress.getLocalHost().getHostAddress();
+            } catch (UnknownHostException e) {
+                LOG.error("Exception occurred during InetAddress retrieval", e);
+            }
+
+            try {
+                auditService.add(userName, AtlasAuditEntry.AuditOperation.SERVER_START, hostName + ":" + hostAddress, SERVER_START_TIME, date, null, null, 0);
+                auditService.add(userName, AtlasAuditEntry.AuditOperation.SERVER_STATE_ACTIVE, hostName + ":" + hostAddress, date, date, null, null, 0);
+            } catch (AtlasBaseException e) {
+                LOG.error("Exception occurred during audit", e);
+            }
+        }
+    }
 }
diff --git a/webapp/src/main/java/org/apache/atlas/web/service/ServiceState.java b/webapp/src/main/java/org/apache/atlas/web/service/ServiceState.java
index 113b2b2..93e6513 100644
--- a/webapp/src/main/java/org/apache/atlas/web/service/ServiceState.java
+++ b/webapp/src/main/java/org/apache/atlas/web/service/ServiceState.java
@@ -21,15 +21,24 @@ package org.apache.atlas.web.service;
 import com.google.common.base.Preconditions;
 import org.apache.atlas.ApplicationProperties;
 import org.apache.atlas.AtlasException;
+import org.apache.atlas.RequestContext;
+import org.apache.atlas.exception.AtlasBaseException;
 import org.apache.atlas.ha.HAConfiguration;
+import org.apache.atlas.model.audit.AtlasAuditEntry;
+import org.apache.atlas.repository.audit.AtlasAuditService;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import javax.inject.Singleton;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Date;
+
 import static org.apache.atlas.AtlasConstants.ATLAS_MIGRATION_MODE_FILENAME;
 
 /**
@@ -43,6 +52,9 @@ import static org.apache.atlas.AtlasConstants.ATLAS_MIGRATION_MODE_FILENAME;
 public class ServiceState {
     private static final Logger LOG = LoggerFactory.getLogger(ServiceState.class);
 
+    @Autowired
+    AtlasAuditService auditService;
+
     public enum ServiceStateValue {
         ACTIVE,
         PASSIVE,
@@ -78,9 +90,38 @@ public class ServiceState {
     }
 
     private void setState(ServiceStateValue newState) {
-        Preconditions.checkState(HAConfiguration.isHAEnabled(configuration),
-                "Cannot change state as requested, as HA is not enabled for this instance.");
+        Preconditions.checkState(HAConfiguration.isHAEnabled(configuration), "Cannot change state as requested, as HA is not enabled for this instance.");
+
         state = newState;
+
+        auditServerStatus();
+    }
+
+    private void auditServerStatus() {
+        String userName = RequestContext.getCurrentUser();
+
+        if (userName == null) {
+            userName = StringUtils.EMPTY;
+        }
+
+        if (state == ServiceState.ServiceStateValue.ACTIVE) {
+            String hostName    = StringUtils.EMPTY;
+            String hostAddress = StringUtils.EMPTY;
+            Date   date        = new Date();
+
+            try {
+                hostName    = InetAddress.getLocalHost().getHostName();
+                hostAddress = InetAddress.getLocalHost().getHostAddress();
+            } catch (UnknownHostException e) {
+                LOG.error("Exception occurred during InetAddress retrieval", e);
+            }
+            try {
+                auditService.add(userName, AtlasAuditEntry.AuditOperation.SERVER_START, hostName + ":" + hostAddress, EmbeddedServer.SERVER_START_TIME, date, null, null, 0);
+                auditService.add(userName, AtlasAuditEntry.AuditOperation.SERVER_STATE_ACTIVE, hostName + ":" + hostAddress, date, date, null, null, 0);
+            } catch (AtlasBaseException e) {
+                LOG.error("Exception occurred during audit", e);
+            }
+        }
     }
 
     public void setActive() {