Migration notes 3.1
This page explains the changes required to migrate to the stated version of the Atoti Limits.
Migrate to 3.1.0
Upgrading from version 3.0.0, see the Atoti Limits 3.1.0 Release Notes.
Atoti Limits is using Atoti Server 6.0.9 and Atoti UI 5.1.x.
For new features and fixes included in these releases, please see the Atoti UI documentation and Atoti UI Migration Notes, and the release notes for Atoti Server.
Headline announcement
- Modified UI settings : “utilizationDashboards” has been removed. “exceptionAuditTrailNodeColors” has been removed, use “auditTrailNodeColors” instead.
- Custom User Workflow Actions: Any existing custom user workflow actions may need to be modified. Please see Adding Customizing Workflow Tasks for how to do so.
- Upgraded Java version: We have upgraded the Java version used to compile Atoti Limits to 17.
- Spring Security upgrade: We have upgraded Spring Security to version 5.8.7 to resolve vulnerabilities and prepare for the upgrade to Spring Security 6.0 (via Spring Boot 3).
- Common Parent POM: The Atoti Limits module now inherits third-party plugin versions from the Common Parent POM version 1.2.0, in line with other solutions.
- Interface/REST Service method signature changes: We have upgraded the
IAlertTaskManager
andLimitsEvaluationRestService
methods to provide a cleaner API.
Java Upgrade
We have upgraded the Java version used to compile Atoti Limits from 11 to 17. You will need to upgrade to Java version 17 or higher, and supply the following jvm arguments when running Atoti Limits:
--add-opens=java.base/java.util=ALL-UNNAMED
--add-opens=java.base/java.util.concurrent=ALL-UNNAMED
This is related to the Atoti Server configuration.
Spring Security Upgrade
We have upgraded to Spring Security 5.8.7. To do so, we override the version of Spring Security in Spring Boot by importing the common-dependencies-bom
version
1.2.0 into the parent pom file. The common-dependencies-bom
overrides the Spring Security version using Spring’s migration guide.
You will eventually need to migrate your own custom security configuration(s) in preparation for Spring Security 6.0. We have upgraded our out-of-the-box security configurations to help in this migration.
note
We recommend using your own custom security configuration(s) and referring to the out-of-the-box security configuration provided only as a sample.
The default security users and roles have not changed, only the way we implement the security. We have done so by making the following changes:
Stop Using WebSecurityConfigurerAdapter
We have replaced instances of WebSecurityConfigurerAdapter
with SecurityFilterChain
beans.
Use the new requestMatchers
methods
In Authorize Http Requests, we have replaced invocations of http.authorizeHttpRequests((authz) -> authz.antMatchers(...))
with http.authorizeHttpRequests((authz) -> authz.requestMatchers(...))
.
Use the new securityMatchers methods
We have replaced invocations of http.antMatchers(...)
with http.securityMatchers(...)
.
As an example of the previous changes, the configuration for accessing the endpoint which exposes the JWT token changed from:
@Configuration
@Order(1)
public static abstract class AJwtSecurityConfigurer extends WebSecurityConfigurerAdapter {
@Autowired
protected ApplicationContext context;
@Autowired
@Qualifier(BASIC_AUTH_BEAN_NAME)
protected AuthenticationEntryPoint authenticationEntryPoint;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher(JwtRestServiceConfig.REST_API_URL_PREFIX + "/**")
// As of Spring Security 4.0, CSRF protection is enabled by default.
.csrf().disable()
// Configure CORS
.cors().and()
.authorizeRequests()
.antMatchers("/**").hasAnyAuthority(ROLE_USER)
.and()
.httpBasic().authenticationEntryPoint(authenticationEntryPoint);
}
}
to
@Bean
@Order(1)
public SecurityFilterChain jwtSecurityFilterChain(HttpSecurity http,ApplicationContext applicationContext){
final AuthenticationEntryPoint basicAuthenticationEntryPoint = applicationContext.getBean(BASIC_AUTH_BEAN_NAME,AuthenticationEntryPoint.class);
return http
// As of Spring Security 4.0, CSRF protection is enabled by default.
.csrf(AbstractHttpConfigurer::disable)
// Configure CORS
.cors().and()
.securityMatcher(url(JwtRestServiceConfig.REST_API_URL_PREFIX,WILDCARD))
.authorizeHttpRequests(
auth->auth.requestMatchers(HttpMethod.OPTIONS,url(WILDCARD))
.permitAll()
.anyRequest()
.hasAnyAuthority(ROLE_USER))
.httpBasic(basic->basic.authenticationEntryPoint(basicAuthenticationEntryPoint))
.build();
}
Removed imports of ActivePivotRemotingServicesConfig
This class imports org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter
, which may (if used) expose access to CVE-2016-1000027 in the Spring-web project.
Common Parent POM
The Common Parent POM version 1.2.0 is now a parent of the Atoti Limits module. This parent merely defines plugin management and is used by other solutions. The following dependency versions are now managed by this parent instead of by the Atoti Limits module:
Dependency | Version |
---|---|
exec-maven-plugin | 3.1.0 |
lifecycle-mapping | 1.0.0 |
maven-assembly-plugin | 3.6.0 |
maven-clean-plugin | 3.3.1 |
maven-compiler-plugin | 3.11.0 |
maven-dependency-plugin | 3.6.0 |
maven-deploy-plugin | 3.1.1 |
maven-enforcer-plugin | 3.3.0 |
maven-jar-plugin | 3.3.0 |
maven-javadoc-plugin | 3.5.0 |
maven-resources-plugin | 3.3.1 |
maven-source-plugin | 3.3.0 |
maven-surefire-plugin | 3.1.2 |
maven-war-plugin | 3.4.0 |
sonar-maven-plugin | 3.9.1.2184 |
spring-boot-maven-plugin | 2.7.16 |
Interface/REST Service Method Signature Changes
If you implement or override any of the following interfaces/services, you will have to update your method signatures.
IAlertTaskManager
Modification | Old Value | New Value | Description |
---|---|---|---|
Changed value | void addChronFutureJob(KpiAlertTask.KpiTaskKey kpiKey) |
void addChronFutureJob(LimitStructureDTO limitStructureDTO) |
Schedule a limit structure to be evaluated. |
Changed value | boolean removeChronFutureJob(KpiAlertTask.KpiTaskKey kpiKey) |
boolean removeChronFutureJob(String futureKey) |
Remove a scheduled limit structure to be evaluated from the list of scheduled jobs. |
Changed value | CsvResult evaluateKpisFor(KpiAlertTask.KpiTaskKey kpiKey, ICondition condition) |
Collection<IncidentDTO> evaluateLimitStructure(LimitStructureDTO limitStructureDTO) |
Evaluate a limit structure. |
Changed value | void evaluateKpis(Collection<KpiAlertTask> kpiAlertTasks) |
Collection<IncidentDTO> evaluateLimitStructures(Collection<KpiAlertTask> kpiAlertTasks) |
Evaluate multiple limit structures. |
Changed value | void evaluateLimits(Collection<LimitAlertTask> limitAlertTasks) |
Collection<IncidentDTO> evaluateLimits(Collection<LimitAlertTask> limitAlertTasks) |
Evaluate multiple limits. |
Changed value | void writeFile(CsvResult csvResults, String fileName, String serverName) |
void writeFile(List<IncidentDTO> results, String fileName, String serverName) |
Write the results of an evaluation to file. |
Changed value | boolean containsChronFutureJob(KpiAlertTask.KpiTaskKey kpiKey) |
boolean containsChronFutureJob(String futureKey) |
Whether or not a scheduled job exists for the given key. |
Added | MdxRunner getMdxRunner() |
Return the MdxRunner used to run MDX queries against the business cube. |
|
Added | IEvaluationErrorHandler getErrorHandler() |
Return the IEvaluationErrroHandler used to handle errors on evaluation. |
|
Removed | <T extends AAlertTask> CsvResult collectCsvResults(Collection<T> alertTasks) |
Collect and handle the result of an evaluation. |
LimitsEvaluationRestService
Modification | Old Value | New Value | Description |
---|---|---|---|
Changed value | public void unschedule(@RequestBody KpiTaskKey key) |
public boolean unschedule(@RequestBody String kpiName) |
Unschedule a limit structure job for evaluation. |
Changed value | public List<String> evaluateAll() |
public EvaluationResponseDTO evaluateAll() |
Evaluate all limits and return an EvaluationResponseDTO . |
Changed value | public List<String> evaluateLimit(@PathVariable("limitKey") int limitKey, @RequestParam(value=PARAM_AS_OF_DATE, required=false) LocalDate asOfDate) |
public EvaluationResponseDTO evaluateLimit(@PathVariable("limitKey") int limitKey, @RequestParam(value=PARAM_AS_OF_DATE, required=false) LocalDate asOfDate) |
Evaluate a limit and return an EvaluationResponseDTO . |
Changed value | public List<String> evaluateLimits(@RequestBody List<Integer> limitKeys, @RequestParam(value=PARAM_AS_OF_DATE, required=false) LocalDate asOfDate) |
public EvaluationResponseDTO evaluateLimits(@RequestBody List<Integer> limitKeys, @RequestParam(value=PARAM_AS_OF_DATE, required=false) LocalDate asOfDate) |
Evaluate multiple limits and return an EvaluationResponseDTO . |
Changed value | public List<String> evaluateLimitStructure(@PathVariable("limitStructureKey") int limitStructureKey, @RequestParam(value=PARAM_AS_OF_DATE, required=false) LocalDate asOfDate) |
public EvaluationResponseDTO evaluateLimitStructure(@PathVariable("limitStructureKey") int limitStructureKey, @RequestParam(value=PARAM_AS_OF_DATE, required=false) LocalDate asOfDate) |
Evaluate a limit structure and return an EvaluationResponseDTO . |
Changed value | public List<String> evaluateLimitStructures(@RequestBody List<Integer> limitStructureKeys, @RequestParam(value=PARAM_AS_OF_DATE, required=false) LocalDate asOfDate) |
public EvaluationResponseDTO evaluateLimitStructures(@RequestBody List<Integer> limitStructureKeys, @RequestParam(value=PARAM_AS_OF_DATE, required=false) LocalDate asOfDate) |
Evaluate multiple limit structures and return an EvaluationResponseDTO . |
Removed | public List<String> evaluate(@RequestBody KpiDTO kpiDto) . |
Evaluate a KpiDTO (now deleted). |
Input file formats
Modified
Modification | File | Field | Description |
---|---|---|---|
Added | limit_structures.csv | Utilization Dashboard ID |
The column Utilization Dashboard ID has been added between the Exception Workflow and User ID columns. |
Added | legacy_limits.csv | Utilization Dashboard ID |
The column Utilization Dashboard ID has been added between the Exception Workflow and User ID columns. |
For Removal
File | Details |
---|---|
legacy_limits.csv | This file is deprecated and will be removed in version 4.0.0. |
Configuration files
Files Modified
limits.properties
New properties:
Property Name | Comment | Value |
---|---|---|
ap.version.map | Any connected server version is now registered by Atoti Limits. | |
content.server.name | The name given to the content server used by Atoti Limits. |
application.yml
New properties:
Property Name | Comment | Value |
---|---|---|
limit.evaluation.include-passes | If true , Atoti Limits stores passes (i.e. evaluations that do not result in a breach or warning) in the datastore during limit evaluation. The default value of false prevents a large number of passes from polluting the limit status screen in the UI. |
false |
limit.evaluation.error.include-stacktrace | true if the stack trace should be available in the evaluation response to the UI. |
false |
Datastores
Modified stores
Modification | Store | Field | Type | Description |
---|---|---|---|---|
Added | Limit Structures | Utilization Dashboard ID | string | The ID of a utilization dashboard that may exist for the limit structure. The ID maps to a dashboard ID in the content server. |
Added | Incidents | Limit Values | double array | The value of the limit (KPI goal) at the time it was evaluated. Note that this may be the value of a temporary limit. |
Deleted | Incidents | Breach Count | int | Unused column that previously stored the number of breaches. |
Updated | Incidents | As of Date | local date | The column is now a key field. This is to ensure that incident workflows are distinct for each as of date. The type has also been updated to a local date. |
Cube schema
Each hierarchy has been given a suitable dimension, as opposed to having single-level hierarchies where the dimension is of the same name. You can view these in Dimensions. The following modifications have also been made:
Added
Cube | Dimension | Hierarchy | Levels | Datastore fields | Details |
---|---|---|---|---|---|
Limits | Evaluation | As Of Date | As Of Date | As Of Date | The cube date for an evaluation. |
Limits | Evaluation | Evaluation Status | Evaluation Status | Incident Type | The result of an evaluation. |
Limits | Evaluation | Workflow Status | Workflow Status | Status | The current status of an evaluation result in the workflow. |
Limits | Evaluation | Evaluation Date | Evaluation Date | N/A | The date of an evaluation. |
Limits | Evaluation | Evaluation Key | Evaluation Key | incidentKey | Unique key to identify an evaluation. |
Modified
Cube | Dimension | Hierarchy | Levels | Datastore fields | Details |
---|---|---|---|---|---|
Limits | Limit Structure | Limit Structure Name | Limit Structure Name | Name | The Name hierarchy has been renamed to Limit Structure Name |
Measures
Added
Cube | Measure | Details |
---|---|---|
Limits | Utilization | The utilization of a limit on evaluation. |
Modified
Cube | Measure | Details |
---|---|---|
Limits | Exposure | Renamed the measure Measure Value to Exposure |
Removed
Cube | Measure | Details |
---|---|---|
Limits | Breach Count | The number of breaches on evaluation. Removed, as a count is suitable. |
Context values
No changes.