Repository: atlas
Updated Branches:
  refs/heads/master 7f5a665e4 -> 3ded3ee2f


http://git-wip-us.apache.org/repos/asf/atlas/blob/3ded3ee2/webapp/src/main/java/org/apache/atlas/web/filters/ActiveServerFilter.java
----------------------------------------------------------------------
diff --git 
a/webapp/src/main/java/org/apache/atlas/web/filters/ActiveServerFilter.java 
b/webapp/src/main/java/org/apache/atlas/web/filters/ActiveServerFilter.java
index 6681a37..5f0cf52 100644
--- a/webapp/src/main/java/org/apache/atlas/web/filters/ActiveServerFilter.java
+++ b/webapp/src/main/java/org/apache/atlas/web/filters/ActiveServerFilter.java
@@ -87,6 +87,18 @@ public class ActiveServerFilter implements Filter {
             HttpServletResponse httpServletResponse = (HttpServletResponse) 
servletResponse;
             LOG.error("Instance in transition. Service may not be ready to 
return a result");
             
httpServletResponse.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+        } if(serviceState.isInstanceInMigration()) {
+            HttpServletResponse httpServletResponse = (HttpServletResponse) 
servletResponse;
+            LOG.error("Instance in migration. Service may not be ready to 
return a result");
+            
httpServletResponse.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+        } if (serviceState.isInstanceInMigration()) {
+            HttpServletResponse httpServletResponse = (HttpServletResponse) 
servletResponse;
+            LOG.error("Instance in migration. Service may not be ready to 
return a result");
+            
httpServletResponse.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
+        } else if (serviceState.isInstanceInMigration()) {
+            HttpServletResponse httpServletResponse = (HttpServletResponse) 
servletResponse;
+            LOG.error("Instance in migration. Service may not be ready to 
return a result");
+            
httpServletResponse.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
         } else {
             HttpServletResponse httpServletResponse = (HttpServletResponse) 
servletResponse;
             String activeServerAddress = 
activeInstanceState.getActiveServerAddress();

http://git-wip-us.apache.org/repos/asf/atlas/blob/3ded3ee2/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
----------------------------------------------------------------------
diff --git 
a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java 
b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
index 1b3f2c8..b648bc1 100755
--- a/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
+++ b/webapp/src/main/java/org/apache/atlas/web/resources/AdminResource.java
@@ -28,15 +28,9 @@ import org.apache.atlas.authorize.AtlasPrivilege;
 import org.apache.atlas.authorize.AtlasAuthorizationUtils;
 import org.apache.atlas.discovery.SearchContext;
 import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.model.impexp.AtlasExportRequest;
-import org.apache.atlas.model.impexp.AtlasExportResult;
-import org.apache.atlas.model.impexp.AtlasImportRequest;
-import org.apache.atlas.model.impexp.AtlasImportResult;
+import org.apache.atlas.model.impexp.*;
 import org.apache.atlas.model.metrics.AtlasMetrics;
-import org.apache.atlas.repository.impexp.ExportService;
-import org.apache.atlas.repository.impexp.ImportService;
-import org.apache.atlas.repository.impexp.ZipSink;
-import org.apache.atlas.repository.impexp.ZipSource;
+import org.apache.atlas.repository.impexp.*;
 import org.apache.atlas.services.MetricsService;
 import org.apache.atlas.type.AtlasType;
 import org.apache.atlas.type.AtlasTypeRegistry;
@@ -75,17 +69,12 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.locks.ReentrantLock;
 
 
 /**
- * Jersey Resource for admin operations.
+ * Jersey Resource for admin operations
  */
 @Path("admin")
 @Singleton
@@ -93,32 +82,32 @@ import java.util.concurrent.locks.ReentrantLock;
 public class AdminResource {
     private static final Logger LOG = 
LoggerFactory.getLogger(AdminResource.class);
 
+    private static final String isCSRF_ENABLED                 = 
"atlas.rest-csrf.enabled";
+    private static final String BROWSER_USER_AGENT_PARAM       = 
"atlas.rest-csrf.browser-useragents-regex";
+    private static final String CUSTOM_METHODS_TO_IGNORE_PARAM = 
"atlas.rest-csrf.methods-to-ignore";
+    private static final String CUSTOM_HEADER_PARAM            = 
"atlas.rest-csrf.custom-header";
+    private static final String isEntityUpdateAllowed          = 
"atlas.entity.update.allowed";
+    private static final String isEntityCreateAllowed          = 
"atlas.entity.create.allowed";
+    private static final String editableEntityTypes            = 
"atlas.ui.editable.entity.types";
+    private static final String DEFAULT_EDITABLE_ENTITY_TYPES  = 
"hdfs_path,hbase_table,hbase_column,hbase_column_family,kafka_topic,hbase_namespace";
+
     @Context
     private HttpServletRequest httpServletRequest;
 
     @Context
     private HttpServletResponse httpServletResponse;
 
-    private final AtlasTypeRegistry typeRegistry;
-
-    private final ReentrantLock importExportOperationLock;
-
-    private static final String isCSRF_ENABLED = "atlas.rest-csrf.enabled";
-    private static final String BROWSER_USER_AGENT_PARAM = 
"atlas.rest-csrf.browser-useragents-regex";
-    private static final String CUSTOM_METHODS_TO_IGNORE_PARAM = 
"atlas.rest-csrf.methods-to-ignore";
-    private static final String CUSTOM_HEADER_PARAM = 
"atlas.rest-csrf.custom-header";
-    private static final String isEntityUpdateAllowed = 
"atlas.entity.update.allowed";
-    private static final String isEntityCreateAllowed = 
"atlas.entity.create.allowed";
-    private static final String editableEntityTypes = 
"atlas.ui.editable.entity.types";
-    private static final String DEFAULT_EDITABLE_ENTITY_TYPES = 
"hdfs_path,hbase_table,hbase_column,hbase_column_family,kafka_topic,hbase_namespace";
     private Response version;
 
-    private final ServiceState      serviceState;
-    private final MetricsService    metricsService;
-    private static Configuration atlasProperties;
-    private final ExportService exportService;
-    private final ImportService importService;
-    private final SearchTracker activeSearches;
+    private final ServiceState             serviceState;
+    private final MetricsService           metricsService;
+    private static Configuration           atlasProperties;
+    private final ExportService            exportService;
+    private final ImportService            importService;
+    private final SearchTracker            activeSearches;
+    private final AtlasTypeRegistry        typeRegistry;
+    private final MigrationProgressService migrationProgressService;
+    private final ReentrantLock            importExportOperationLock;
 
     static {
         try {
@@ -129,15 +118,16 @@ public class AdminResource {
     }
 
     @Inject
-    public AdminResource(ServiceState serviceState, MetricsService 
metricsService,
-                         ExportService exportService, ImportService 
importService,
-                         SearchTracker activeSearches, AtlasTypeRegistry 
typeRegistry) {
+    public AdminResource(ServiceState serviceState, MetricsService 
metricsService, AtlasTypeRegistry typeRegistry,
+                         ExportService exportService, ImportService 
importService, SearchTracker activeSearches,
+                         MigrationProgressService migrationProgressService) {
         this.serviceState               = serviceState;
         this.metricsService             = metricsService;
         this.exportService = exportService;
         this.importService = importService;
         this.activeSearches = activeSearches;
         this.typeRegistry = typeRegistry;
+        this.migrationProgressService = migrationProgressService;
         importExportOperationLock = new ReentrantLock();
     }
 
@@ -223,8 +213,18 @@ public class AdminResource {
             LOG.debug("==> AdminResource.getStatus()");
         }
 
-        Map<String, Object> responseData = 
Collections.singletonMap(AtlasClient.STATUS, 
serviceState.getState().toString());
-        Response            response     = 
Response.ok(AtlasJson.toV1Json(responseData)).build();
+        Map<String, Object> responseData = new HashMap() {{
+                put(AtlasClient.STATUS, serviceState.getState().toString());
+            }};
+
+        if(serviceState.isInstanceInMigration()) {
+            MigrationStatus status = migrationProgressService.getStatus();
+            if (status != null) {
+                responseData.put("MigrationStatus", status);
+            }
+        }
+
+        Response response = 
Response.ok(AtlasJson.toV1Json(responseData)).build();
 
         if (LOG.isDebugEnabled()) {
             LOG.debug("<== AdminResource.getStatus()");

http://git-wip-us.apache.org/repos/asf/atlas/blob/3ded3ee2/webapp/src/main/java/org/apache/atlas/web/security/AtlasSecurityConfig.java
----------------------------------------------------------------------
diff --git 
a/webapp/src/main/java/org/apache/atlas/web/security/AtlasSecurityConfig.java 
b/webapp/src/main/java/org/apache/atlas/web/security/AtlasSecurityConfig.java
index f1760e7..64c9520 100644
--- 
a/webapp/src/main/java/org/apache/atlas/web/security/AtlasSecurityConfig.java
+++ 
b/webapp/src/main/java/org/apache/atlas/web/security/AtlasSecurityConfig.java
@@ -24,6 +24,7 @@ import org.apache.atlas.web.filters.AtlasCSRFPreventionFilter;
 import org.apache.atlas.web.filters.AtlasKnoxSSOAuthenticationFilter;
 import org.apache.atlas.web.filters.StaleTransactionCleanupFilter;
 import org.apache.commons.configuration.Configuration;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import 
org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
@@ -44,6 +45,8 @@ import 
org.springframework.security.web.util.matcher.RequestMatcher;
 import javax.inject.Inject;
 import java.util.LinkedHashMap;
 
+import static org.apache.atlas.AtlasConstants.ATLAS_MIGRATION_MODE_FILENAME;
+
 @EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true)
 public class AtlasSecurityConfig extends WebSecurityConfigurerAdapter {
@@ -151,8 +154,14 @@ public class AtlasSecurityConfig extends 
WebSecurityConfigurerAdapter {
 
         //@formatter:on
 
-        if (configuration.getBoolean("atlas.server.ha.enabled", false)) {
-            LOG.info("Atlas is in HA Mode, enabling ActiveServerFilter");
+        boolean configMigrationEnabled = 
!StringUtils.isEmpty(configuration.getString(ATLAS_MIGRATION_MODE_FILENAME));
+        if (configuration.getBoolean("atlas.server.ha.enabled", false) ||
+                configMigrationEnabled) {
+            if(configMigrationEnabled) {
+                LOG.info("Atlas is in Migration Mode, enabling 
ActiveServerFilter");
+            } else {
+                LOG.info("Atlas is in HA Mode, enabling ActiveServerFilter");
+            }
             httpSecurity.addFilterAfter(activeServerFilter, 
BasicAuthenticationFilter.class);
         }
         httpSecurity

http://git-wip-us.apache.org/repos/asf/atlas/blob/3ded3ee2/webapp/src/main/java/org/apache/atlas/web/service/ServiceState.java
----------------------------------------------------------------------
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 3fe8d18..6b88ac3 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
@@ -23,12 +23,15 @@ import org.apache.atlas.ApplicationProperties;
 import org.apache.atlas.AtlasException;
 import org.apache.atlas.ha.HAConfiguration;
 import org.apache.commons.configuration.Configuration;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
 import javax.inject.Singleton;
 
+import static org.apache.atlas.AtlasConstants.ATLAS_MIGRATION_MODE_FILENAME;
+
 /**
  * A class that maintains the state of this instance.
  *
@@ -38,14 +41,14 @@ import javax.inject.Singleton;
 @Singleton
 @Component
 public class ServiceState {
-
     private static final Logger LOG = 
LoggerFactory.getLogger(ServiceState.class);
 
     public enum ServiceStateValue {
         ACTIVE,
         PASSIVE,
         BECOMING_ACTIVE,
-        BECOMING_PASSIVE
+        BECOMING_PASSIVE,
+        MIGRATING
     }
 
     private Configuration configuration;
@@ -57,8 +60,16 @@ public class ServiceState {
 
     public ServiceState(Configuration configuration) {
         this.configuration = configuration;
-        state = !HAConfiguration.isHAEnabled(configuration) ?
-                ServiceStateValue.ACTIVE : ServiceStateValue.PASSIVE;
+
+        
if(StringUtils.isNotEmpty(configuration.getString(ATLAS_MIGRATION_MODE_FILENAME)))
 {
+            state = ServiceStateValue.MIGRATING;
+        } else {
+            state = !HAConfiguration.isHAEnabled(configuration) ? 
ServiceStateValue.ACTIVE : ServiceStateValue.PASSIVE;
+        }
+
+        
if(!StringUtils.isEmpty(configuration.getString(ATLAS_MIGRATION_MODE_FILENAME, 
""))) {
+            state = ServiceStateValue.MIGRATING;
+        }
     }
 
     public ServiceStateValue getState() {
@@ -96,4 +107,13 @@ public class ServiceState {
         return state == ServiceStateValue.BECOMING_ACTIVE
                 || state == ServiceStateValue.BECOMING_PASSIVE;
     }
+
+    public void setMigration() {
+        LOG.warn("Instance in {}", state);
+        setState(ServiceStateValue.MIGRATING);
+    }
+
+    public boolean isInstanceInMigration() {
+        return getState() == ServiceStateValue.MIGRATING;
+    }
 }

http://git-wip-us.apache.org/repos/asf/atlas/blob/3ded3ee2/webapp/src/test/java/org/apache/atlas/web/resources/AdminResourceTest.java
----------------------------------------------------------------------
diff --git 
a/webapp/src/test/java/org/apache/atlas/web/resources/AdminResourceTest.java 
b/webapp/src/test/java/org/apache/atlas/web/resources/AdminResourceTest.java
index aab2bb8..58ea628 100644
--- a/webapp/src/test/java/org/apache/atlas/web/resources/AdminResourceTest.java
+++ b/webapp/src/test/java/org/apache/atlas/web/resources/AdminResourceTest.java
@@ -51,7 +51,7 @@ public class AdminResourceTest {
 
         
when(serviceState.getState()).thenReturn(ServiceState.ServiceStateValue.ACTIVE);
 
-        AdminResource adminResource = new AdminResource(serviceState, null, 
null, null, null, null);
+        AdminResource adminResource = new AdminResource(serviceState, null, 
null, null, null, null, null);
         Response response = adminResource.getStatus();
         assertEquals(response.getStatus(), HttpServletResponse.SC_OK);
         JsonNode entity = AtlasJson.parseToV1JsonNode((String) 
response.getEntity());
@@ -62,7 +62,7 @@ public class AdminResourceTest {
     public void testResourceGetsValueFromServiceState() throws IOException {
         
when(serviceState.getState()).thenReturn(ServiceState.ServiceStateValue.PASSIVE);
 
-        AdminResource adminResource = new AdminResource(serviceState, null, 
null, null, null, null);
+        AdminResource adminResource = new AdminResource(serviceState, null, 
null, null, null, null, null);
         Response response = adminResource.getStatus();
 
         verify(serviceState).getState();

Reply via email to