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();